--- url: /guide/basic/intro.md --- # 介绍 {#intro} ## Mpx是什么? {#what-is-mpx} Mpx是一款致力于提高小程序开发体验和开发效率的增强型小程序框架,通过Mpx,我们能够高效优雅地开发出具有极致性能的优质小程序应用,并将其输出到各大小程序平台、Web和React Native环境中运行。 Mpx的核心设计理念在于增强,这意味着Mpx是对小程序原生开发标准的补强和扩充,同时也兼容了原生开发标准。Mpx的一个设计理念在于尽可能地依赖小程序原生的自有能力,如路由系统,自定义组件,事件系统和slot等能力,因此用户在使用Mpx开发小程序时,需要对原生小程序开发有一定程度的掌握。所幸小程序开发本身并不困难,我们也会在本文档中对必要的原生小程序开发知识进行一定程度地说明。 微信小程序作为小程序的开山鼻祖,具有最完善的生态和最全面的特性支持,后来的所有小程序平台在技术方案和代码语法上都与微信小程序高度相似,Mpx目前完善支持了以微信小程序增强语法为base的跨平台输出能力,本文档在介绍原生小程序开发相关的部分时也会以微信小程序为例。 最后,Mpx是一个开发框架,不是组件库,这一点经常会有开发者搞混。Mpx兼容业内已有的小程序组件库,如vant/iview等,我们之后也会开源内部基于Mpx开发的跨端组件库。 ## Mpx提供了哪些能力? {#what-mpx-provides} ### 单文件开发(SFC) {#sfc} Mpx使用类似Vue的单文件开发模式,小程序原本的template/js/style/json都可以写在单个的.mpx文件中,清晰便捷,详情查看[这里](sfc.md) ### 数据响应 {#data-reactivity} 数据响应是Mpx提供的核心增强能力,该能力主要受Vue的启发,主要包含数据赋值响应,watch api和computed计算属性等能力,关于该能力更详细的介绍可以查看[这里](reactive.md) ### 增强的模板语法 {#enhanced-template-syntax} 同样受到Vue的启发,Mpx提供了很多增强模板语法便于开发者方便快捷地进行视图开发,主要包含以下: * [wx:style动态样式](class-style-binding.md#style-binding) * [wx:class动态类名](class-style-binding.md#class-binding) * [wx:model双向绑定](two-way-binding.md) * [wx:model-prop双向绑定属性](two-way-binding.md#change-two-way-binding-event-prop) * [wx:model-event双向绑定事件](two-way-binding.md#change-two-way-binding-event-prop) * [wx:model-value-path双向绑定数据路径](two-way-binding.md#change-two-way-binding-path) * [wx:model-filter双向绑定过滤器](two-way-binding.md#two-way-binding-filter) * [wx:ref获取实例](refs.md) * [wx:show隐藏显示](conditional-render.md) * [component动态组件](component.md#dynamic-component) * [事件处理内联传参](event.md) * [模板条件编译](conditional-render.md) ### 极致性能 {#extreme-performance} Mpx在性能上做到了极致,我们在框架中通过模板数据依赖收集进行了深度的setData优化,做到了程序上的最优,让用户能够专注于业务开发; 其次,Mpx的编译构建完全基于依赖收集,支持按需进行的npm构建,能够自动根据用户的分包配置抽离共用模块,确保用户最终产出项目的包体积最优; 最后,Mpx的运行时框架部分仅占用51KB; Mpx和业内其他框架的运行时性能对比可以参考[这篇文章](https://github.com/hiyuki/mp-framework-benchmark/blob/master/README.md) ### 状态管理 {#state-management} Mpx借鉴Vuex的设计实现一套与框架搭配使用的状态管理(store)工具,除了支持Vuex中已有的特性外,我们还创新地提出了一种多实例store的跨团队状态管理模式,我们在业务中实际使用后普遍认为该设计比原有的modules更加灵活方便,更多详情可以[查看这里](../advance/store.md) 在Mpx2.8版本中,我们引入了Vue3.0的组合式API开发模式,同时也将与之配套的Pinia状态管理库引入,用户可以在Mpx项目中使用Pinia进行状态管理,更多详情可以[查看这里](../advance/pinia.md) ### 编译构建 {#compile-build} Mpx的编译构建以webpack为基础,针对小程序项目结构深度定制开发了一个webpack插件和一系列loaders,整个构建过程完全基于依赖收集按需打包,兼容大部分webpack自身能力及生态,此外Mpx的编译构建还支持以下能力: * [npm构建](../advance/npm.md) * [分包构建](../advance/subpackage.md) * [分包异步化](../advance/async-subpackage.md) * [包体积分析](../advance/size-report.md) * [原生组件支持](../advance/progressive.md#native-integration) * [原生能力兼容(custom-tab-bar/workers/云开发等)](../advance/ability-compatible.md) * [小程序插件](../advance/plugin.md) * [TypeScript支持](../advance/ts.md) * [原子CSS](../advance/utility-first-css.md) * [模板预编译](template.md#template-precompile) * [CSS预处理](css.md) * [静态资源处理](../advance/image-process.md) * [资源路径获取](../advance/resource-resolve.md) * [自定义输出路径](../advance/custom-output-path.md) * [DllPlugin](../advance/dll-plugin.md) ### 跨平台能力 {#cross-platform-ability} Mpx支持全部小程序平台(微信,支付宝,百度,头条,qq)的增强开发,同时支持将一份基于微信增强的业务源码输出到主流小程序平台、Web和React Native环境中运行,更多详情请[查看这里](../advance/platform.md) ### 完善的周边能力 {#complete-ecosystem} 除了上述的核心能力外,Mpx还提供了丰富的周边能力支持,主要包括以下能力: * [脚手架工具](../advance/cli.md) * [网络请求](../extend/fetch.md) * [跨平台环境API](../../api-proxy/index.md) * [I18n国际化](../advance/i18n.md) * [webview桥](../extend/webview-bridge.md) * [单元测试](../tool/unit-test.md) * [E2E测试](../tool/e2e-test.md) ## 对比其他小程序框架 {#compare-other-frameworks} 目前业内的小程序框架主要分为两类,一类是以uniapp,taro2为代表的静态编译型框架,这类框架以静态编译为主要手段,将React和Vue开发的业务源码转换到小程序环境中进行适配运行。这类框架的主要优点在于web项目迁移方便,跨端能力较强。但是由于React/Vue等web框架的DSL与小程序本身存在较大差距,无法完善支持原web框架的全部能力,开发的时候容易踩坑。 另一类是以kbone,taro3为代表的运行时框架,这类框架利用小程序本身提供的动态渲染能力,在小程序中模拟出web的运行时环境,让React/Vue等框架直接在上层运行。这类框架的优点在于web项目迁移方便,且在web框架语法能力的支持上比静态编译型的框架要强很多,开发时遇到的坑也会少很多。但是由于模拟的web运行时环境带来了巨大的性能开销,这类框架并不适合用于大型复杂的小程序开发。 不同于上面两类框架,Mpx以小程序本身的DSL为基础,通过编译和运行时手段结合对其进行了一系列拓展增强,没有复杂庞大的转译和环境抹平,在提升用户开发体验和效率的同时,既能保障开发的稳定和可预期性,又能保障接近原生的良好性能,非常适合开发大型复杂的小程序应用。 在跨端方面,Mpx重点保障跨小程序平台的跨端能力,由于各家小程序标准具有很强的相似性,Mpx在进行跨端输出时,以静态编译为主要手段,辅以灵活便捷的条件编译,保障了跨端输出的性能和可用性。 --- --- url: /guide/basic/start.md --- # 快速开始 {#quick-start} ## 安装脚手架 {#install-scaffold} ::: code-group ```sh [npm] npm i -g @mpxjs/cli ``` ```sh [pnpm] pnpm add -g @mpxjs/cli ``` ```sh [yarn] yarn global add @mpxjs/cli ``` ::: > @mpxjs/cli 文档 https://github.com/mpx-ecology/mpx-cli ## 创建项目安装依赖 {#create-project-install-dep} 在当前目录下创建 mpx 项目。 ```shell mpx create mpx-project ``` 也可以使用 npx 在不全局安装脚手架情况下创建项目。 ```shell npx @mpxjs/cli create mpx-project ``` 执行命令后会弹出一系列问题进行项目初始配置,根据自身需求进行选择,完成后进入项目目录进行依赖安装。 ```shell npm install ``` > 创建`插件项目`由于微信限制必须填写插件的`AppID`,创建`普通项目`无强制要求。 补充提示: * 推荐的 IDE 配置是 [VS Code](https://code.visualstudio.com) + [Mpx (Official)](https://marketplace.visualstudio.com/items?itemName=mpxjs.mpx-official) 扩展。如果使用其他编辑器,参考 [IDE 支持章节](ide.md)。 ## 编译构建 {#compile-build} 相关命令 ```json { "serve": "mpx-cli-service serve", // 开发模式 "build": "mpx-cli-service build" // 构建模式 } ``` 使用 npm script 执行 mpx 的编译构建,在开发模式下我们执行 serve 命令,将项目源码构建输出到`dist/${平台目录}`下,并且监听源码的改动进行重新编译。 ```shell npm run serve ``` ### CLI 命令 {#cli-commands} #### build ```sh 用法:mpx-cli-service build [options] 选项: --targets 编译目标(默认值: wx) --mode 指定环境模式 development | production (默认值:production) --env 自定义 __mpx_env__ --watch 监听文件变化 --report 生成包分析报告 ``` ```sh # 构建小程序,默认微信 {#build-miniprogram-wechat} mpx-cli-service build --targets=wx,ali ``` **目前支持的平台** | 平台 | target | | ------ | ------- | | 微信 | wx | | 阿里 | ali | | 百度 | swan | | QQ | qq | | 头条 | tt | | 浏览器 | web | | 快应用 | qa | | 安卓 | android | | iOS | ios | | 鸿蒙 | harmony | #### serve ```sh 用法:mpx-cli-service serve [options] 选项: --targets 编译到小程序目标(默认值: wx) --mode 指定环境模式 (默认值:production) --env 自定义 __mpx_env__ ``` ## 预览调试 {#preview-debug} 使用小程序开发者工具打开 dist 下对应平台的目录,对你的小程序进行预览、调试,详情可参考[小程序开发指南](https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.html) > 开启小程序开发者工具的 watch 选项,配合 mpx 本身的 watch,能够得到很好的开发调试体验。 ## 开始 code {#start-code} 在 Mpx 中,我们使用`@mpxjs/core`提供的 createApp、createPage 和 createComponent 函数(分别对应原生小程序中的 App、Page 和 Component)来创建 App、页面和组件,我们下面根据脚手架创建出的初始项目目录,进行简单的介绍。 进入 src/app.mpx,我们可以看到里面的结构和.vue 文件非常类似,三个区块分别对应了小程序中的 js/wxss/json 文件。 js 区块中调用 createApp 用于注册小程序,传入的配置可以参考[小程序 App 构造器](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html),由于 app.js 是小程序全局最早执行的 js 模块,一般 mpx 插件安装等初始化操作也在这里进行。 style 区块对应 app.wxss 定义了全局样式,可以自由使用 sass/less/stylus 等 css 预编译语言。 json 区块完全支持小程序原生的[app.json 配置](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html),还额外支持了[packages 多人合作](../advance/subpackage.md#packages)等增强特性。 ```html ``` 进入 src/pages/index.mpx,可以看到同样是.vue 风格的单文件结构,比起上面的 app.mpx 多了一个 template 区块,用于定义页面模板,除了支持小程序本身的全部模块语法和指令外,mpx 还参考 vue 提供了大量[模板增强指令](../../api/directives.md),便于用户更快速高效地进行界面开发。 在 js 中调用 createPage 创建页面时,除了支持原本小程序支持的[Page 配置](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Page.html)外,我们还支持以[数据响应](reactive.md)为核心的一系列增强能力。 在 json 中,我们同样支持原生的[页面 json 配置](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/page.html),此外,我们能够直接在`usingComponents`中填写 npm 地址引用 npm 包中的组件,mpx 组件和原生小程序组件均可引用,无需调用开发者工具 npm 编译,且能够通过依赖收集按需进行打包。 > 为了保障增强能力的完整性,在支持的平台中 Mpx 优先使用 Component 构造器创建页面,支持全部 Component 生命周期;在某些特殊情况下,你可以在[@mpxjs/webpack-plugin](../../api/compile.md#forceusepagector)中传入 forceUsePageCtor:true 配置来禁用掉这个行为。 ```html ``` 最后,我们进入 src/components/list.mpx 文件,可以看到其构成与页面文件十分相似,对于组件,Mpx 提供了和页面完全一致的增强能力 ```html ``` 更多用法可以查看我们的官方实例: ## 跨平台输出 {#cross-platform-output} 如果你选择的 base 平台为微信,mpx 提供了强大的跨平台输出能力,能够将你的小程序源码输出到目前业内的全部小程序平台(微信/支付宝/百度/头条/QQ)中和 web 平台中运行。 执行以下命令进行跨平台输出 ```shell npm run build:cross ``` 关于跨平台能力的更多详情请查看[这里](../advance/platform.md) --- --- url: /guide/basic/ide.md --- # IDE 支持 {#ide-support} ## VS Code 推荐使用的 IDE 是 [VS Code](https://code.visualstudio.com),配合官方维护的新版本 [**Mpx (Official)**](https://marketplace.visualstudio.com/items?itemName=mpxjs.mpx-official) 插件。该插件提供了语法高亮、TypeScript 支持,以及模板内表达式与组件 props 的智能提示,提供更好的开发体验。 ::: tip 注意 Mpx (Official) 现在取代了我们过去提供的插件 [mpx](https://marketplace.visualstudio.com/items?itemName=pagnkelly.mpx)、[mpx-template-features](https://marketplace.visualstudio.com/items?itemName=wangshun.mpx-template-features)。历史插件将不再维护逐步废弃,请大家及时切换到新版插件。更多历史背景及功能差异请参考[说明](https://github.com/mpx-ecology/language-tools?tab=readme-ov-file#why-new-extension)。 ::: Mpx (Official) 插件一大亮点功能是为 `