rpose
《RPOSE从入门到精通》在哪里?
没有的事,这是一个前端框架,简单到没法聊
有好姿势欢迎提建议
青松的姿势
Hello world
// hello-world.rpose
[view]
<span>hello {name}!</span>
[state]
{name: 'world'}
[mount]
body
todo-list
// todo-list.rpose
[view]
<div>
<div class="title">TODO LIST</div>
<ul>
<li @for="(item, index) in $state.items" @key={index}><button style="margin-right:20px" onclick={ ()=>this.del(index) }>Del</button> {item}</li>
</ul>
<form>
<input type="text" @ref="input">
<button>Add #{ $state.items.length + 1 }</button>
</form>
</div>
[state]
{
items: []
}
[methods]
@action('submit', 'form')
add(e) {
e.preventDefault();
let el = this.getRefElement('input');
if ( el.value.trim() ){
let items = this.#private.state.items;
items.push(el.value) && (el.value = '');
this.render();
}
}
del(index) {
this.#private.state.items.splice(index, 1);
this.render();
}
[css]
.title {
font-size: 18px;
}
[mount]
body
layout (@class)
// layout-foo.rpose
[view]
<div @class="height-100vh display-flex flex-direction-column overflow-hidden color-#333">
<div @class="height-50px color-#fff bgcolor-#555"><slot name="header"/></div>
<div @class="height--calc(100vh_-_80px) bgcolor-#eee"><slot name="body"/></div>
<div @class="height-30px bgcolor-#d5d5d5"><slot name="footer"/></div>
</div>
[less]
body{
margin: 0;
}
// page-foo.rpose
[view]
<layout-foo>
<div slot="header">
<div @class="text-align-center padding-top-13px">Header</div>
</div>
<div slot="body">
<div @class="margin-top-150px text-align-center font-size-3rem">Content</div>
</div>
<div slot="footer">
<div @class="text-align-center padding-top-3px">Footer</div>
</div>
</layout-foo>
[mount]
body
bootstrap-button (csslibify)
// csslibify-bootstrap-button.rpose
[view]
<button type="button" class="btn@bootstrap btn-primary@bootstrap">
this is a bootstrap primary button
</button>
[csslib]
bootstrap = bootstrap:**/*.min.css
[mount]
body
安装使用
@rpose/cli
: README.md
功能列表
feature
- 源文件使用BTF的单文档格式,人性化强,可读性高
- 数据驱动、组件式、响应式、声明式的开发过程
- 提供指令
@ref
、@key
、@show
、@if
、@for
、@taglib
、@csslib
、@class
、@html
、@text
、@merge
- 提供组件级和项目级的
[taglib]
配置,和@taglib
有影响范围区别 - 提供组件级和项目级的
[csslib]
配置,和@csslib
有影响范围区别 - 项目可发布为npm模块,发布内容为项目配置及源码和资源,开发工程可直接引用自动安装按需编译使用
- 提供简易安全的路由方案
- 提供样式风格模块化方案
- 提供预渲染模块化方案
- 提供简易的SVG图标方案
- 支持以装饰器方式(效果如同Java注解),声明绑定事件
在[methods]
中的方法,支持@action(事件名, 选择器)的方式绑定事件
选择器仅在组件范围内编译期有效,参考样式的标签选择器语法使用
选择器选中的是标准标签时,效果等同直接在标准标签上写事件属性绑定方法
选择器选中的是组件标签时,效果等同直接在组件标签上添加属性指向方法
buildin
- 语法高亮组件,写法雷同md的
```
,支持btf
、rpose
,支持设定最大高度 - 内置路由组件
<router>
、<router-link>
- 内置标签组件
<if>
- 内置标签组件
<for>
- 内置图标组件
<svgicon>
- 内置组件写法
<@svgicon>
等同<svgicon>
- 内置组件写法
<@router>
等同<router>
- 内置组件写法
<@router-link>
等同<router-link>
runtime
- 虚拟DOM及局部差异化渲染实现
- 提供
on
、at
、once
、off
等事件接口 - 提供
$$
接口,方便dom节点选择及属性修改操作 - 支持相对特殊的
<svg>
、<script>
、<link>
标签 - 使用代理事件,
event.targetNode
存放当前事件节点 - 差异渲染时支持事件更新
- 添加
rpose.zindex(num)
方法接口,以支持动态计算z-index
compiler
- 编译模块插件化便于增减新功能
- 组件接口属性需在
[api]
中显式声明,方便人工阅读识别 - 自动安装配置依赖模块,增强开发体验,有特定版本需求时需自行安装确定版本
- 标签属性支持单纯对象表达式,如
<foo {$state}>
,运行期会按接口声明复制属性 - 标签插槽功能支持
- 不推荐,但确实可以在view中写js代码
-
[view]
中支持变量简写,自动检查接口声明进行关联 -
[methods]
中使用类方法的方式写事件函数,支持私有属性
和私有方法
-
[methods]
中支持自定义同名函数替代框架的默认实现 -
[methods]
中支持用装饰器
的方式绑定事件处理,支持标签选择器语法 -
[methods]
中的变量在编译期做检查,有使用未定义变量则定位报错 -
[methods]
中支持定义mounted
方法,有定义时在组件挂载完成后将被异步调用 - 自动哈希化js代码中样式选择器的类名
- 自动处理使this指向组件对象
- 友好化错误信息提示,编译错误时准确定位
- 源文件中无
[mount]
,或文件目录含components
、node_modules
的都视为单纯组件 - 源文件名过滤,不同目录的重名文件仅一个有效,检查并提示忽略的文件
- 支持特殊的CDATA标签写法,方便直接书写尖括号等特殊字符
- 自动删除纯注释代码块,删除空白文本表达式或纯注释文本表达式
- 监视模式下,处理好文件重名问题,自动编译关联组件页面,按需热更新浏览器
- 支持LESS预处理
- 支持SCSS预处理
- 样式类名哈希化解决冲突问题,非release模式时仅友好改名以便确认
- 自动转换js代码中的样式类名并统一哈希化
- 在js代码中的样式类名,支持自动按需引用样式库
- 样式中url的相对目录自动调整,图片资源文件名统一哈希化
- 自动调整img标签中src的相对目录,让不同目录页面都能正常显示图片
- 按
.browserslistrc
配置添加前缀、压缩或美化等样式后处理 - 打包后的图片资源存放目录可通过项目配置文件
rpose.config.btf
配置,默认是images
- 按
.browserslistrc
配置的目标浏览器直接打包成品 - 非release模式时,编译的组件代码输出到临时目录便于确认
- 使用基于磁盘文件的缓存,缓存目录可配置化
- 支持页面
[api]
中声明为移动优先或桌面优先,默认为移动优先(desktopFirst=false) - 同一节点支持多个事件声明,编译期按事件类型名自动合并
- 错误信息对比定位提示,同一文件则自动合并提示
- 配置文件
rpose.config.btf
中支持设定监视模式的端口,默认3700,设为random即随机 - 图标组件
<svgicon>
在inline
模式下,允许按名称动态使用当前工程下的SVG图标 - 图标组件
<svgicon>
自动添加缺省属性fill='currentColor'
,有自定义时使用自定义值 - 增加组件的私有方法
#getState
和#setState
方法,无[api]
接口限制,方便组件内部使用 - [taglib]可使用
~
表示引用当前工程内的组件,如@my-tag = ~
- 当前工程内的组件引用可使用
@
开头的默认别名,如<@my-tag>
等同<my-tag>
这有时会很方便,比如在开发期间[taglib]
内可以不配置,需要更换为第三方组件时再配置即可 - 编译期检测
require
方法调用,自动安装代码中依赖的第三方包
other
- 简易实现热刷新服务器替代第三方包,方便按需刷新、按需打开窗口
- 可通过配置样式库实现按需引用normalize样式
- 监视模式下修改
.browserslistrc
文件,重新编译全部页面 - 监视模式下修改
rpose.config.btf
文件,重新编译整个项目 - 监视模式下修改
<svgicon>
用到的图标文件,重新编译可能相关的组件及页面 - 监视模式下修改
用到的图片文件,重新编译相关的组件及页面
- 监视模式下修改本地样式库用到的css文件,重新编译相关的组件及页面
变更列表
Ver 0.9.*
- 编译期检测
require
方法调用,自动安装代码中依赖的第三方包
Ver 0.8.*
- 内置图标组件
<svgicon>
在inline-symbol
模式下,允许按名称动态使用当前工程下的SVG图标 - 内置组件写法
<@svgicon>
等同<svgicon>
- 内置组件写法
<@router>
等同<router>
- 内置组件写法
<@router-link>
等同<router-link>
-
[methods]
中支持定义mounted
方法,有定义时在组件挂载完成后将被异步调用 - 增加组件的私有方法
#getState
和#setState
方法,无[api]
接口限制,方便组件内部使用 - [taglib]可使用
~
表示引用当前工程内的组件,如@my-tag = ~
- 当前工程内的组件引用可使用
@
开头的默认别名,如<@my-tag>
等同<my-tag>
这有时会很方便,比如在开发期间[taglib]
内可以不配置,需要更换为第三方组件时再配置即可 - 添加
rpose.zindex(num)
方法接口,以支持动态计算z-index
- 改进类名策略,避免组件类名和系统内置类名之间的冲突,支持更具语义的组件命名
Ver 0.7.*
- 差异渲染时支持事件更新
- 新增指令
@key
,作用类似vue的:key
或react的key
- 新增指令
@html
,类似innerHTML
的作用,谨慎使用 - 新增指令
@text
,类似innerTEXT
的作用 - 优化虚拟节点函数,令其更精简
- 优化
runtime
包 - 新增指令
@merge
,针对特定标准标签的特殊场景,提供简化写法
比如input标签输入变更后,有时想把输入值写入state但又不想触发渲染,通常需要写onchange实现,数量一多就变得繁琐,这时可以简化的用@merge="fieldname"
达到目的 - 配置文件
rpose.config.btf
中支持设定监视模式的端口,默认3700,设为random即随机
Ver 0.6.*
-
[methods]
中使用类方法的方式写事件函数,支持私有属性
和私有方法
-
[methods]
中支持自定义同名函数替代框架的默认实现 -
[methods]
中支持用装饰器
@action
的方式绑定事件处理,支持标签选择器语法 -
[methods]
中的变量在编译期做检查,有使用未定义变量则定位报错 - 错误信息对比定位提示,同一文件时自动合并,信息提示更加精准友好
-
@class
增加伪类原子样式支持,如focus:bg-yellow
- 使用代理事件,
event.targetNode
存放当前事件节点,同一节点支持多个事件声明,编译期按事件类型名自动合并
Ver 0.5.*
- 新增指令
@class
,支持以灵活的原子方式书写样式 - 内置SVG图标组件
<svgicon>
- 指令
@show
添加修饰符支持,如@show.flex
- 优化样式库编译缓存,提升编译性能
- 监视模式下修改本地样式库用到的css文件,重新编译相关的组件及页面
Ver 0.4.*
- 为方便功能删减修改,咬牙重构,编译器插件化,分离
runtime
、buildin
模块 - 更多的编译期检查以及更友好的错误信息提示
- 新增指令
@for
,新增内置标签<for>
、<if>
- 新增支持特殊的CDATA标签写法,方便直接书写尖括号等特殊字符
- 改进内置的语法高亮组件,增加btf、rpose语言类型的语法高亮显示支持
- 项目以源码形式发布到npm,开发工程能自动安装依赖模块,按需编译相关组件
- 解决watch模式下文件重名等可能引起动态编译错误的问题
- 情不得已,简陋实现热更新服务器替换第三方包,按需刷新按需开窗口,改善体验
- 优化编译缓存,提升编译性能,缓存可序列化,缓存目录可配置化
- 按需引用normalize样式,间接的可通过配置样式库实现
- 用语法树分析的方式,更安全的哈希化js代码中样式选择器的类名
- 在js代码中的样式类名,支持自动按需引用样式库
- 支持页面
[api]
中声明为移动优先或桌面优先,默认为移动优先(desktopFirst=false) - 监视模式下修改
.browserslistrc
文件,重新编译全部页面 - 监视模式下修改
rpose.config.btf
文件,重新编译整个项目
Ver 0.3.*
- 新添指令
@taglib
、@csslib
,组件支持[taglib]
、[csslib]
块定义
Ver 0.2.*
- 指令统一前缀为
@
以方便识别,如@if
、@ref
、@show
Ver 0.1.* 概念版
- 源文件使用BTF的单文档格式,人性化可读性强,增强开发舒适性
- 数据驱动、组件式、响应式、声明式的开发过程
- 回归自然,三驾马车HTML/JS/CSS,写业务,完成
- 控制框架接口概念复杂度,保持简易性,杜绝过度开发
- 虚拟DOM及局部差异渲染
- 框架上集成样式的预处理及后处理操作,同一解决样式类名冲突问题
- 提供组件样式风格统一性方案
- 提供简便易用的前端路由方案
- 提供预渲染方案,用以灵活应付Loader或骨架屏等需求
- 提供源监视功能,源文件修改时自动编译,热更新浏览器
- 集成打包功能,按目标浏览器配置,直接按需打包成品