- 快速开始
- JSX 介绍
- JSX+ 介绍
- 组件
- 事件处理
- 样式设置
- Hooks 介绍
- Driver 介绍
- 容器差异
- 工程介绍
- 目录结构
- 应用配置
- 应用入口
- 生命周期
- 路由管理
- 简介
- 语法约束
- Hooks
- 多端组件开发
- API 使用
- 静态资源引用
- 项目构建配置
- 页面配置
- 使用原生项目配置文件
- Rax 与小程序代码混用
- FAQ
- 更新日志
- 简介
- 环境变量与 Framework
- Weex Style 支持表
- Weex 组件
- Weex 模块
- 页面降级
- JS Service
- Bundle 解析
- 事件与手势
- 事件通信
- Weex 国际化
- Weex 常见问题
- 简介
- Document
- App Shell
- 代码分离
- 保存至桌面
- 渲染节点快照
- 预加载和预渲染
- 页面保活
- 缓存控制
- PHA 介绍
- 快速开始
- 编码指南
- 数据请求
- FaaS 接入: Now
- FaaS 接入: FC
- 与 Node 应用集成
- 数据请求
- 异步编程
- Rax 错误码
- 简介
- Lite 工程
- 云端一体化工程
- 插件配置
- 插件开发
- 插件简介
- build-plugin-rax-app
- build-plugin-rax-component
- build-plugin-rax-multi-pages
- build-plugin-rax-ssr
- build-plugin-rax-compat-react
- rax-plugin-app 0.1.0 升级
- 调试 Web
- 调试小程序
- 加载性能优化
- 渲染性能优化
- 从 Rax 0.x 升级
- 从 React 迁移
- API 概述
- render
- hydrate
- createPortal
- findDOMNode
- setNativeProps
- getElementById
- unmountComponentAtNode
- createElement
- cloneElement
- createFactory
- isValidElement
- Children
- memo
- Fragment
- createRef
- forwardRef
- useState
- useEffect
- useLayoutEffect
- useContext
- useRef
- useCallback
- useMemo
- useReducer
- useImperativeHandle
- PropTypes
- version
- ActionSheet
- Background
- Keyboard
- Animation
- Transition
- Toast
- Alert
- Confirm
- Loading
- Navigate
- ChooseImage
- Image
- Request
- Network
- File
- Env
- Device
- Clipboard
- AppState
- AsyncStorage
- Accelerometer
- 组件概述
- Text
- View
- TextInput
- Link
- Icon
- Image
- Picture
- Video
- ScrollView
- RecyclerView
- Waterfall
- Embed
- Countdown
- Canvas
- RefreshControl
- Slider
- Modal
- Weex JS Service
- Rax 长列表最佳实践
- 如何减小 Bundle Size
- Rax 0.x 开发工具
- Native 知识扫盲
- iOS 无障碍
- Rax 性能最佳实践
- 从零上手 Rax
- Rax v0.6 组件体验升级
- Rax v0.5 建立服务体系
- Rax v0.3 跨端生态建设
- Rax v0.2 基础能力建设
- 2016 淘宝双促中的 Rax
- Why Rax?
插件开发
插件需要 export 一个函数,函数会接收到两个参数,第一个是 build-scripts
提供的 pluginAPI
,第二个是用户传给插件的自定义参数,如下:
module.exports = (pluginAPI, options) => {
const {
context,
log,
onHook
} = pluginAPI;
};
pluginAPI
主要包含以下几个参数:
context
包含运行时的各种环境信息:
command
当前运行命令
commandArgs
script 命令执行时接受到的参数
rootDir
项目根目录
userConfig
用户在 build.json 中配置的内容
pkg
项目 package.json 中的内容
onGetWebpackConfig
在工程获取 webpack 时触发,可以用 webpack-chain 形式修改 webpack 配置:
// 场景一:所有 webpack 任务
module.exports = ({onGetConfig, registerTask}) => {
registerTask('default', webpackConfig);
onGetWebpackConfig((config) => {
config.entry('xxx');
});
}
// 场景二:多 webpack 任务
module.exports = ({onGetConfig, registerTask}) => {
registerTask('web', webpackConfigWeb);
registerTask('weex', webpackConfigWeex);
onGetWebpackConfig('web',(config) => {
config.entry('xxx');
});
onGetWebpackConfig('weex',(config) => {
config.entry('xxx');
});
}
onHook
用 onHook 监听命令运行时事件,onHook 注册的函数执行完成后才会执行后续操作,可以用于在命令运行中途插入插件想做的操作。
module.exports = ({ onHook }) => {
onHook('after.start.compile', () => {
// do something after dev compile
});
}
log
script 统一的 log 工具,底层使用 npmlog ,便于生成统一格式的 log
registerTask
谨慎使用,注册多 webpack 任务
module.exports = ({ registerTask }) => {
registerTask('web', webpackConfigWeb);
registerTask('weex', webpackConfigWeex);
}
registerUserConfig
谨慎使用,注册 build.json 中的顶层配置字段,用于用户字段校验,可以传入单个配置对象或者包含多个配置对象的数组。
生效的声明周期,在registerTask和onGetWebpackConfig之间
配置对象字段如下:
- name (string)
字段名称,唯一标识,多个插件无法注册相同的字段
保留字段:plugins
- validation(string|function)
字段校验,支持string快速校验,string|boolean|number,也可以自定义函数,根据return值判断校验结果
- configWebpack(function)
字段效果,具体作用到webpack配置上,接收参数:
- config:webpack chain config
- value: build.json中的字段值
- context:与外部context相同,新增字段taskName表现当前正在修改的task
module.exports = ({registerUserConfig}) => {
registerUserConfig({
name: 'entry',
// validation: 'string',
validation: (value) => {
return typeof value === 'string'
},
configWebpack: (config, value, context) => {
config.mode(value)
},
});
}
registerCliOption
谨慎使用,注册各命令上支持的 cli 参数,比如 npm start --https 来开启 https
module.exports = ({ registerCliOption }) => {
registerCliOption({
name: 'https', // 注册的 cli 参数名称,
commands: ['start'], // 支持的命令,如果为空默认任何命令都将执行注册方法
configWebpack: (config, value, context) => {
// 命令链路上的相关操作
}
})
}
注册函数执行周期,在 userConfig 相关注册函数执行之后
setValue
(key: string | number, value: any) => void
用来在context中注册变量,以供插件之间的通信。
// build-plugin-test
module.exports = ({setValue}) => {
setValue('key', 123);
}
getValue
(key: string | number) => any
用来获取context中注册的变量。
module.exports = ({getValue}) => {
const value = getValue('key'); // 123
}
插件通信
插件间需要进行通信的场景诉求:
不同插件之间需要知道彼此的存在来确定是否执行相应的逻辑
多个插件共有的配置信息可以抽出来,在某个插件中进行配置
使用setValue和getValue两个API来实现,分别用于数据的存取,详见插件API部分。
谨慎使用,会造成插件之间的依赖。
生命周期
start
生命周期 | 参数 | 调用时机 |
---|---|---|
before.start.load | {args: array // 启动参数} | 获取webpack配置之前 |
before.start.run | - | webpack执行之前 |
after.start.compile | {url: string // serverUrl, stats: WebpackAssets} | 编译结束,每次重新编译都会执行 |
before.start.devServer | {url: string // serverUrl, devServer: WebpackDevServer} | 中间件加载后,webpack dev server启动前 |
after.start.devServer | {url: string // serverUrl, devServer: WebpackDevServer} | webpack dev server启动后 |
build
生命周期 | 参数 | 调用时机 |
---|---|---|
before.build.load | {args: array // 启动参数} | 获取webpack配置之前 |
before.build.run | - | webpack执行之前 |
after.start.compile | { err: Error, stats: WebpackAssets} | 构建结束 |
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论