diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index bd4f5c52..a2696e41 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,3 @@
# MorJS 贡献指南
-参见文档 [website/docs/guides/contributing.md](website/docs/guides/contributing.md)。
+参见文档 [参与贡献](https://mor.ele.me/guides/contributing)。
diff --git a/README.md b/README.md
index dcc3ef11..6cddb7ab 100644
--- a/README.md
+++ b/README.md
@@ -60,13 +60,13 @@ Mor 是一套基于小程序 DSL (支付宝或微信) 的框架。他的易用
## 贡献
-参见 [贡献指南](https://github.com/eleme/morjs/blob/master/CONTRIBUTING.md)
+参见 [参与贡献](https://mor.ele.me/guides/contributing)
## 社区
参见 [社区指南](https://mor.ele.me/about/community-guide)
-
+
### 核心成员
@@ -77,6 +77,7 @@ Mor 是一套基于小程序 DSL (支付宝或微信) 的框架。他的易用
- [hwaphon](https://github.com/hwaphon)
- [shujian-cao](https://github.com/shujian-cao)
- [robin-shine](https://github.com/robin-shine)
+- [aboyforwind](https://github.com/aboyforwind)
## 许可证
diff --git a/website/README.md b/website/README.md
deleted file mode 100644
index 2de5ed7a..00000000
--- a/website/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# MorJS 站点
-
-## 框架
-
-站点采用 [Docusaurus 2](https://docusaurus.io/) 框架,要求 node 版本 >=16.14
-
-- Installation: `$ npm install`
-- Development: `$ npm run start`
-- Build: `$ npm run build`
-- Version: `npx docusaurus docs:version 1.1.0`
-
-> 发完版本号 Version 后需要修改一下 `docusaurus.config.js` 配置文件的 `onlyIncludeVersions` 相关配置项
-
-## 配置
-
-- 主要配置文件 `docusaurus.config.js`
-- 头部导航配置 `config/navbar.js`
-- 底部超链配置 `config/footer.js`
-- 文档分组配置 `config/sidebars.js`
-
-## 发布
-
-使用 gh-pages 分支为文档专用分支,使用 Github Actions 自动部署
diff --git a/website/algolia.json b/website/algolia.json
deleted file mode 100644
index b75f197c..00000000
--- a/website/algolia.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "index_name": "morjs",
- "start_urls": ["https://mor.eleme.io"],
- "sitemap_urls": ["https://mor.eleme.io/sitemap.xml"],
- "selectors": {
- "lvl0": {
- "selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]",
- "type": "xpath",
- "global": true,
- "default_value": "Documentation"
- },
- "lvl1": "header h1, article h1",
- "lvl2": "article h2",
- "lvl3": "article h3",
- "lvl4": "article h4",
- "lvl5": "article h5, article td:first-child",
- "lvl6": "article h6",
- "text": "article p, article li, article td:last-child"
- },
- "custom_settings": {
- "attributesForFaceting": [
- "type",
- "lang",
- "language",
- "version",
- "docusaurus_tag"
- ],
- "attributesToRetrieve": [
- "hierarchy",
- "content",
- "anchor",
- "url",
- "url_without_anchor",
- "type"
- ],
- "attributesToHighlight": ["hierarchy", "content"],
- "attributesToSnippet": ["content:10"],
- "camelCaseAttributes": ["hierarchy", "content"],
- "searchableAttributes": [
- "unordered(hierarchy.lvl0)",
- "unordered(hierarchy.lvl1)",
- "unordered(hierarchy.lvl2)",
- "unordered(hierarchy.lvl3)",
- "unordered(hierarchy.lvl4)",
- "unordered(hierarchy.lvl5)",
- "unordered(hierarchy.lvl6)",
- "content"
- ],
- "distinct": true,
- "attributeForDistinct": "url",
- "customRanking": [
- "desc(weight.pageRank)",
- "desc(weight.level)",
- "asc(weight.position)"
- ],
- "ranking": [
- "words",
- "filters",
- "typo",
- "attribute",
- "proximity",
- "exact",
- "custom"
- ],
- "highlightPreTag": "",
- "highlightPostTag": "",
- "minWordSizefor1Typo": 3,
- "minWordSizefor2Typos": 7,
- "allowTyposOnNumericTokens": false,
- "minProximity": 1,
- "ignorePlurals": true,
- "advancedSyntax": true,
- "attributeCriteriaComputedByMinProximity": true,
- "removeWordsIfNoResults": "allOptional",
- "separatorsToIndex": "_",
- "synonyms": [
- ["js", "javascript"],
- ["ts", "typescript"]
- ]
- }
-}
\ No newline at end of file
diff --git a/website/babel.config.js b/website/babel.config.js
deleted file mode 100644
index 14e5baf0..00000000
--- a/website/babel.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- presets: [require.resolve('@docusaurus/core/lib/babel/preset')]
-}
diff --git a/website/config/footer.js b/website/config/footer.js
deleted file mode 100644
index fd9a4917..00000000
--- a/website/config/footer.js
+++ /dev/null
@@ -1,38 +0,0 @@
-module.exports = {
- style: 'dark',
- links: [
- {
- title: '文档',
- items: [
- { label: 'MorJS 配置', href: '/guides/basic/config' },
- { label: '命令行', href: '/guides/basic/cli' },
- { label: '工程 Hooks', href: '/api/engineering-hooks' }
- ],
- },
- {
- title: '帮助',
- items: [
- { label: '常见问题', href: '/guides/faq' },
- {
- label: '社区钉钉群',
- href: 'https://qr.dingtalk.com/action/joingroup?code=v1,k1,zPirp4W1FDF7tKteTDgOjgk7cMzCTt31ztWoGVMVJ7U=&_dt_no_comment=1&origin=11'
- },
- { label: 'GitHub Issue', href: 'https://github.com/eleme/morjs/issues' }
- ],
- },
- {
- title: '更多',
- items: [
- {
- label: '行为规范',
- to: 'https://github.com/eleme/morjs/blob/master/CODE_OF_CONDUCT.md'
- },
- {
- label: '参与贡献',
- href: 'https://github.com/eleme/morjs/blob/master/CONTRIBUTING.md'
- }
- ]
- }
- ],
- copyright: `Copyright © ${new Date().getFullYear()} - Present MorJS.`
-}
diff --git a/website/config/navbar.js b/website/config/navbar.js
deleted file mode 100644
index 4fd5737b..00000000
--- a/website/config/navbar.js
+++ /dev/null
@@ -1,31 +0,0 @@
-module.exports = {
- title: 'MorJS',
- logo: {
- alt: 'MorJS',
- src: 'https://img.alicdn.com/imgextra/i1/O1CN017EoZuR20PghATY7Fw_!!6000000006842-55-tps-485-350.svg'
- },
- items: [
- { label: '文档', position: 'left', to: 'guides' },
- { label: 'API', position: 'left', to: 'api' },
- { label: '博客', position: 'left', to: 'web/blog' },
- {
- label: '关于',
- position: 'left',
- items: [
- { label: '常见问题', to: '/guides/faq' },
- // { label: '版本发布', to: '/changelog/1.0.0' },
- { label: '社区指南', to: '/about/community-guide' },
- {
- label: '行为规范',
- to: 'https://github.com/eleme/morjs/blob/master/CODE_OF_CONDUCT.md'
- }
- ]
- },
- { type: 'docsVersionDropdown', position: 'right' },
- {
- className: 'header-github-link',
- position: 'right',
- href: 'https://github.com/eleme/morjs'
- }
- ]
-}
diff --git a/website/config/sidebars.js b/website/config/sidebars.js
deleted file mode 100644
index 4599278b..00000000
--- a/website/config/sidebars.js
+++ /dev/null
@@ -1,209 +0,0 @@
-module.exports = {
- documentSidebar: [
- {
- label: '指南',
- type: 'category',
- collapsed: false,
- items: [
- {
- label: '介绍',
- type: 'category',
- collapsed: false,
- items: ['guides/README', 'guides/introduction/how-mor-works']
- },
- {
- label: '教程',
- type: 'category',
- collapsed: false,
- items: [
- 'guides/introduction/getting-started',
- {
- label: '开发一个 To-Do List',
- type: 'category',
- collapsed: true,
- items: [
- 'guides/introduction/how-to-develop-todo-list_wechat',
- 'guides/introduction/how-to-develop-todo-list'
- ]
- },
- 'guides/migrate-from-original-miniprogram-to-mor'
- ]
- },
- {
- label: '基础用法',
- type: 'category',
- collapsed: false,
- items: [
- 'guides/basic/directory-structure',
- 'guides/basic/config',
- 'guides/basic/runtime',
- 'guides/basic/plugin',
- 'guides/basic/mock',
- 'guides/basic/env-variables',
- 'guides/basic/cli',
- 'guides/faq'
- ]
- },
- {
- label: '进阶用法',
- type: 'category',
- collapsed: false,
- items: [
- {
- label: '条件编译',
- type: 'category',
- collapsed: true,
- items: [
- 'guides/conditional-compile/code-level',
- 'guides/conditional-compile/file-level'
- ]
- },
- 'guides/advance/complex-miniprogram-integration',
- 'guides/advance/unity-of-forms'
- ]
- },
- {
- label: '多端兼容性',
- type: 'category',
- collapsed: true,
- items: [
- 'guides/compatibilities/wechat-to-other',
- 'guides/compatibilities/alipay-to-wechat'
- ]
- }
- ]
- },
- {
- label: 'Web 开发',
- type: 'category',
- collapsed: true,
- items: [
- {
- label: '介绍',
- type: 'category',
- collapsed: true,
- items: ['web/basic/quickstart', 'web/basic/support']
- },
- {
- label: '基础使用',
- type: 'category',
- collapsed: true,
- items: ['web/introduction/basic', 'web/introduction/route']
- },
- {
- label: '其它用法',
- type: 'category',
- collapsed: true,
- items: ['web/support/custom-my', 'web/support/tabbar-support']
- }
- ]
- },
- {
- label: '社区',
- type: 'category',
- collapsed: true,
- items: [
- 'guides/contributing',
- 'about/community-guide',
- {
- label: '规范',
- type: 'category',
- collapsed: true,
- items: [
- {
- label: '介绍',
- type: 'category',
- collapsed: true,
- items: ['specifications/README']
- },
- {
- label: '研发规范',
- type: 'category',
- collapsed: true,
- items: [
- // 'specifications/development',
- 'specifications/code-styles',
- 'specifications/git-commit-and-review'
- ]
- },
- {
- label: '技术规范',
- type: 'category',
- collapsed: true,
- items: [
- 'specifications/js',
- 'specifications/component',
- 'specifications/runtime'
- // 'specifications/plugin'
- ]
- },
- {
- label: '文档规范',
- type: 'category',
- collapsed: true,
- items: ['specifications/document']
- }
- ]
- }
- ]
- }
- ],
- apiSidebar: [
- {
- label: '介绍',
- type: 'category',
- collapsed: false,
- items: ['api/README']
- },
- {
- label: '工程 API',
- type: 'category',
- collapsed: false,
- items: [
- 'api/engineering-hooks',
- 'api/takin',
- 'api/engineering-takin',
- 'api/engineering-mor'
- ]
- },
- {
- label: '运行时 API',
- type: 'category',
- collapsed: false,
- items: ['api/runtime-core', 'api/runtime-hooks', 'api/runtime-api']
- }
- ],
- blogSidebar: [
- {
- label: 'Web 转端原理介绍',
- type: 'category',
- collapsed: false,
- items: [
- 'web/blog/index',
- 'web/blog/runtime',
- 'web/blog/setdata',
- 'web/blog/event',
- 'web/blog/template',
- 'web/blog/slot'
- ]
- },
- {
- label: 'MorJS 开发博客',
- type: 'category',
- collapsed: false,
- items: [
- 'guides/advance/use-community-component',
- 'guides/advance/learn-create-component-library',
- 'guides/advance/subpackage-volume-optimization'
- ]
- }
- // {
- // label: 'MorJS 更新日志',
- // type: 'category',
- // collapsed: false,
- // items: [
- // 'changelog/1.0.0',
- // ]
- // }
- ]
-}
diff --git a/website/docs/about/community-guide.md b/website/docs/about/community-guide.md
deleted file mode 100644
index 41339455..00000000
--- a/website/docs/about/community-guide.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# 社区指南
-
-MorJS 的社区正在逐步成长中,如果你正在阅读本文,这说明你大概已经准备好加入 MorJS 社区了。欢迎!
-
-现在让我们来解答你能从社区中获得什么以及你能为社区做什么。
-
-
-
-## 资源
-
-### 行为规范
-
-这份 [行为规范](https://github.com/eleme/morjs/blob/master/CODE_OF_CONDUCT.md) 是一个易于发展我们所参与的技术社区的指南。
-
-### 保持关注
-
-- 关注我们的官方 [GitHub](https://github.com/eleme) 账号。
-- 关注我们的团队成员的 GitHub 账号。
-- 加入我们的社区钉钉群以获得最新消息。
-
-### 获得帮助
-
-GitHub:如果你想报告 bug 或者提出新特性需求,欢迎来 GitHub 提交 issue。我们也非常欢迎 pull request!
-社区钉钉群:一个 MorJS 开发者相互认识和实时聊天的地方。
-
-
-
-## 参与方式
-
-### 帮助同伴用户
-
-贡献代码并不是对 MorJS 社区的唯一贡献形式。在 钉钉群 或 Github 上为 MorJS 的同伴回答问题也是一种非常有价值的贡献。
-
-### 协助分流 Issue
-
-分流 issue 意味着收集缺失的信息、重现问题、验证问题的有效性并调查问题的原因等。
-
-我们每天都会在 GitHub 仓库收到许多 issue。和我们的用户数量相比,我们的精力是非常有限的,所以光是 issue 的分流就会花费团队大量的精力。通过帮助我们分流这些 issue,你可以帮助我们变得更有效率,使我们能够把时间花在更优先的工作上。
-
-你不必以修复问题为目的来分流这些 issue (尽管那也很好)。分享你的调查结果,例如导致该错误的提交记录,已经为我们节省了大量的时间。
-
-### 贡献代码
-
-贡献错误修复或新特性是你能做出的最直接的贡献形式。
-
-MorJS 核心库提供了一份贡献指南,其中包含 pull request 指南以及有关构建设置和上层架构的信息,请确保在提交 pull request 之前阅读它们。
-
-错误修复是我们随时欢迎的。而对于新特性来说,最好先在社区群里讨论用例和实现细节。
-
-### 分享 (并积累) 经验
-
-除了在 Github 或钉钉群回答问题、分享资源外,还有一些其他的方式可以分享并增长你的见识:
-
-开发学习资料。我们常说教学相长。如果你正在用 MorJS 做一些有趣的事情,你可以写一篇博客、组织研讨会、甚至创建一个 gist 分享到社交平台上:这些都能加强你的专项知识。
-
-关注 (watch) 你关心的仓库。这样无论何时该仓库有新的动静,你都会第一时间收到通知,得到关于正在进行的讨论以及即将到来的新特性的新鲜情报。这是超棒的积累专业知识的方法,你最终将会有能力来解决问题 (issue) 并提交 pull request。
diff --git a/website/docs/api/README.md b/website/docs/api/README.md
deleted file mode 100644
index 4c0d78e0..00000000
--- a/website/docs/api/README.md
+++ /dev/null
@@ -1,85 +0,0 @@
-# API 介绍
-
-MorJS 提供了大量 API 给 编译时 和 运行时 使用,共分为 工程 API 和 运行时 API 两类
-
-## 工程 API
-
-提供给编译流程及命令行使用,包括以下三类:
-
-- `Hooks`: mor 和 takin 对外暴露的 hook,提供给工程插件使用,下面以 `modifyUserConfig` 示例
-
-```typescript
-import type { Plugin, Runner } from '@morjs/cli'
-
-export default class MorJSPluginXXX implements Plugin {
- name = 'MorJSPluginXXX'
-
- apply(runner: Runner) {
- // modifyUserConfig: 可基于命令行选项修改用户配置
- runner.hooks.modifyUserConfig.tap(this.name, (userConfig, command) => {
- const { outputPath } = command.options
- // 获取命令行 outputPath 选项,若有则修改 userConfig 的 outputPath 配置为该值
- if (outputPath) userConfig.outputPath = outputPath
- return userConfig
- })
- }
-}
-```
-
-- `Takin API`: 由 takin 提供的 api,下面以 `logger.info` 示例
-
-```typescript
-import { logger } from '@morjs/cli'
-
-logger.info('info 日志输出')
-```
-
-- `MorJS API`: mor 的 utils 对外开放的 api,下面以 `hexToRgb` 示例
-
-```typescript
-import { hexToRgb } from '@morjs/cli'
-
-const colorRGB = hexToRgb('#FFFFFF')
-```
-
-## 运行时 API
-
-提供给运行时流程使用,包括以下三类:
-
-- `Runtime Core`: mor 的 api 对外开放的 api,下面以 `aApp` 示例
-
-```typescript
-import { aApp } from '@morjs/core'
-
-aApp({
- onLaunch() {
- console.log('app onlaunch')
- }
-})
-```
-
-- `Runtime Hooks`: mor 运行时对应小程序的 hook,提供给运行时插件使用,下面以 `appOnShow` 示例
-
-```typescript
-import type { MorJSHooks, MorJSPlugin } from '@morjs/api'
-
-export default class RuntimePluginXXX implements MorJSPlugin {
- pluginName = 'RuntimePluginXXX'
-
- apply = (morHooks: MorJSHooks): void => {
- // appOnShow: 在 App 的 onShow 生命周期触发
- morHooks.appOnShow.tap(this.pluginName, function (this, options) {
- console.log('触发小程序 appOnShow 生命周期')
- })
- }
-}
-```
-
-- `Runtime API`: mor 的 core 对外开放的 api,下面以 `getGlobalObject` 示例
-
-```typescript
-import { getGlobalObject } from '@morjs/api'
-
-const global = getGlobalObject()
-console.log(global) // my(支付宝)| wx(微信)
-```
diff --git a/website/docs/api/engineering-hooks.md b/website/docs/api/engineering-hooks.md
deleted file mode 100644
index 8d808484..00000000
--- a/website/docs/api/engineering-hooks.md
+++ /dev/null
@@ -1,376 +0,0 @@
-# Hooks
-
-## 介绍
-
-- 在插件的 `apply` 函数中,会得到一个 `runner` 对象,对象中会有如下 `takin` 提供的内置 `hook`,插件可使用 `tap` 来注册对应的 `hook`,`tap` 接受两个参数
-
- - `name`: 插件名
- - `pluginHandle`: 插件逻辑
-
-- 若插件有设置参数 `IMorJSPluginXXXOptions`,请将 `options` 的 `interface` 给 `export` 出去,方便可能需要集成的使用方进行引用
-
-## 基础 Hooks
-
-```typescript
-import type { Plugin, Runner, UserConfig } from '@morjs/cli'
-
-export interface IMorJSPluginXXXOptions {
- key: value
-}
-
-export default class MorJSPluginXXX implements Plugin {
- name = 'MorJSPluginXXX'
- pluginOptions: IMorJSPluginXXXOptions
-
- constructor(options?: IMorJSPluginXXXOptions) {
- this.pluginOptions = {
- ...options
- }
- }
-
- apply(runner: Runner) {
- // initialize: 初始化, 当 runner 被初始化并完成插件加载之后运行
- runner.hooks.initialize.tap(this.name, () => {
- // 打印当前 MorJS 版本
- console.log(`当前 MorJS 版本为 1.0.0 ⚑`)
- })
-
- // cli: 构建命令行时运行,可运行命令行注册,获取匹配的命令
- runner.hooks.cli.tap(this.name, (cli) => {
- // 注册 abc 命令行并添加一个 cde 的选项,于是终端可执行 mor abc --cde 123 命令
- cli.command('abc', 'abc描述').option('--cde [xxx]', 'cde描述')
- })
-
- // matchedCommand: 获取到匹配命令的阶段
- runner.hooks.matchedCommand.tap(this.name, (command) => {
- const { name, outputPath } = command.options
- console.log(name, outputPath) // 获取命令行选项
- })
-
- // loadConfig: 加载用户 config 阶段
- runner.hooks.loadConfig.tap(this.name, (command) => {
- const { name, outputPath } = command.options
- console.log(name, outputPath)
- })
-
- // modifyUserConfig: 可基于命令行选项修改用户配置
- runner.hooks.modifyUserConfig.tap(this.name, (userConfig, command) => {
- const { outputPath } = command.options
- // 获取命令行 outputPath 选项,若有则修改 userConfig 的 outputPath 配置为该值
- if (outputPath) userConfig.outputPath = outputPath
- return userConfig
- })
-
- // registerUserConfig: 注册用户配置及校验 schema
- runner.hooks.registerUserConfig.tap(this.name, (schema) => {
- return schema.merge(UserConfigSchema)
- })
-
- // shouldRun: 是否需要运行后续逻辑(执行的时机为 校验用户配置之前)
- runner.hooks.shouldRun.tap(this.name, () => {
- return true
- })
-
- // shouldValidateUserConfig: 是否校验用户配置, 部分不使用配置的命令
- // 可使用该 hook 结合 runner 的上下文,来选择是否跳过用户配置校验
- runner.hooks.shouldValidateUserConfig.tap(this.name, () => {
- if (runner.commandName === 'clean') return false
- })
-
- // userConfigValidated: 用户配置校验完成之后执行
- runner.hooks.userConfigValidated.tap(this.name, (userConfig) => {
- // 这个阶段可以进行部分配置,如添加 mor 运行时相关 loader 处理
- console.log(userConfig)
- })
-
- // beforeRun: 开始 run 之前的 hook, 可用于准备一些运行命令需要的数据或内容
- runner.hooks.beforeRun.tap(this.name, () => {
- const userConfig = runner.userConfig
- console.log(userConfig)
- })
-
- // run: 运行命令逻辑
- runner.hooks.run.tap(this.name, (command) => {})
-
- // done: runner 运行完成
- runner.hooks.done.tap(this.name, () => {
- console.log(`编译完成`)
- })
-
- // failed: runner 运行失败
- runner.hooks.failed.tap(this.name, (error) => {
- console.log('运行失败, 原因:', error)
- })
-
- // shutdown: runner 主动关闭 runner 时执行
- runner.hooks.shutdown.tap(this.name, () => {
- // runner 关闭时自动关闭 server
- if (devServer) await devServer.stop()
- devServer = null
- })
- }
-}
-```
-
-## 编译 Hooks
-
-```typescript
-import type { Plugin, Runner, UserConfig } from '@morjs/cli'
-
-export interface IMorJSPluginXXXOptions {
- key: value
-}
-
-export default class MorJSPluginXXX implements Plugin {
- name = 'MorJSPluginXXX'
- pluginOptions: IMorJSPluginXXXOptions
-
- constructor(options?: IMorJSPluginXXXOptions) {
- this.pluginOptions = {
- ...options
- }
- }
-
- apply(runner: Runner) {
- // webpackWrapper: 用于获取 webpackWrapper
- runner.hooks.webpackWrapper.tap(this.name, (webpackWrapper) => {
- // 保存 webpackWrapper 提供给后续流程调用
- this.webpackWrapper = webpackWrapper
- })
-
- // compiler: 用于获取 webpack compiler
- runner.hooks.compiler.tap(this.name, (compiler) => {
- const userConfig = runner.userConfig
- console.log(userConfig)
- })
-
- // entryBuilder: 用于获取 entryBuilder
- runner.hooks.entryBuilder.tap(this.name, (entryBuilder) => {
- this.entryBuilder = entryBuilder
- })
-
- // shouldAddPageOrComponent: 用于判断是否要处理页面或组件
- runner.hooks.shouldAddPageOrComponent.tap(this.name, (pageOrComponent) => {
- if (pageOrComponent.startsWith('dynamicLib://')) return false
- return true
- })
-
- // addEntry: 添加 entry 时触发, 可用于修改 entry 相关信息
- runner.hooks.addEntry.tap(this.name, (entryInfo) => {
- // 把 'pages/main/' 页面的产物放到 'src/pages/main' 下
- if (entryInfo.name && entryInfo.name.startsWith('pages/main/')) {
- entryInfo.entry.fullEntryName = 'src/' + entryInfo.entry.fullEntryName
- entryInfo.entry.entryName = 'src/' + entryInfo.entry.entryName
- entryInfo.entry.entryDir = 'src/' + entryInfo.entry.entryDir
- entryInfo.name = 'src/' + entryInfo.name
- }
-
- return entryInfo
- })
-
- // beforeBuildEntries: 解析所有 entries 文件之后, 生成 entries 之前执行
- runner.hooks.beforeBuildEntries.tap(this.name, (entryBuilder) => {
- EntryBuilderMap.set(runner, entryBuilder)
- })
-
- // afterBuildEntries: 用于获取并修改构建出来的 entries
- runner.hooks.afterBuildEntries.tap(this.name, (entries, entryBuilder) => {
- this.entryBuilder = entryBuilder
- return entries
- })
-
- // configParser: config(json) 文件解析 hook
- runner.hooks.configParser.tap(this.name, (config, options) => {
- // 删除抖音编译下,所有 json 文件的 componentPlaceholder 内容
- if (options.userConfig.target === 'bytedance') {
- if (config?.componentPlaceholder) {
- delete config.componentPlaceholder
- }
- }
- return config
- })
-
- // scriptParser: script(js/ts) 文件解析 hook
- runner.hooks.scriptParser.tap(this.name, (transformers, options) => {
- // 给 app.ts 文件的 CApp({}) 方法插入 { globalApp: morGlobal.initApp } 作为最后一个参数
- if (!options.fileInfo.content?.includes('CApp')) return transformers
-
- transformers = transformers || {}
- transformers.before = transformers.before || []
-
- const transformer = tsTransformerFactory((node, context) => {
- const factory = context.factory
- if (
- ts.isExpressionStatement(node) &&
- ts.isCallExpression(node.expression) &&
- ts.isIdentifier(node.expression.expression) &&
- node.expression.expression.escapedText === 'CApp'
- ) {
- args.push(
- factory.createObjectLiteralExpression(
- [
- factory.createPropertyAssignment(
- factory.createIdentifier('globalApp'),
- factory.createPropertyAccessExpression(
- factory.createIdentifier('morGlobal'),
- factory.createIdentifier('initApp')
- )
- )
- ],
- false
- )
- )
-
- return [
- factory.createExpressionStatement(
- factory.createCallExpression(
- factory.createIdentifier('CApp'),
- undefined,
- [...node.expression.arguments, ...args]
- )
- )
- ]
- }
-
- return node
- })
-
- transformers.before.push(transformer)
- return transformers
- })
-
- // templateParser: template(*xml) 文件解析 hook
- runner.hooks.templateParser.tap(this.name, (tree, options) => {
- // 替换 wxml 中的 morstyle 为 style
- return tree.walk((node) => {
- if (node.attrs && node.attrs.morStyle) {
- node.attrs.style = node.attrs.morStyle
- delete node.attrs.morStyle
- }
-
- return node
- })
- })
-
- // styleParser: style(*css) 文件解析 hook
- runner.hooks.styleParser.tap(this.name, (plugins, options) => {
- return plugins
- .concat
- // 进行一些关于 *css 文件的处理
- ()
- })
-
- // sjsParser: sjs(wxs/sjs) 文件解析 hook
- runner.hooks.sjsParser.tap(this.name, (transformers, options) => {
- // 添加 commonjs => esm 转换 修改引用路径
- if (
- options.fileInfo.content.includes('import') ||
- options.fileInfo.content.includes('require')
- ) {
- this.alterImportOrRequirePath(transformers, options.fileInfo.path)
- }
-
- return transformers
- })
-
- // preprocessorParser: 文件预处理器 hook,该阶段会处理条件编译
- runner.hooks.preprocessorParser.tap(
- this.name,
- (fileContent, context, options) => {
- if (!/\.(j|t)s$/.test(options.fileInfo.path)) return fileContent
- // 对 js/ts 文件进行一些前置处理
- return fileContent
- }
- )
-
- // postprocessorParser: 文件后置处理器 hook
- runner.hooks.postprocessorParser.tap(this.name, (fileContent, options) => {
- if (!/\.(w|a)xml$/.test(options.fileInfo.path)) return fileContent
- // 对 *xml 文件进行一些后置处理
- return fileContent
- })
- }
-}
-```
-
-## 集成 Hooks
-
-```typescript
-import type { Plugin, Runner, UserConfig } from '@morjs/cli'
-
-export interface IMorJSPluginXXXOptions {
- key: value
-}
-
-export default class MorJSPluginXXX implements Plugin {
- name = 'MorJSPluginXXX'
- pluginOptions: IMorJSPluginXXXOptions
-
- constructor(options?: IMorJSPluginXXXOptions) {
- this.pluginOptions = {
- ...options
- }
- }
-
- apply(runner: Runner) {
- // moduleDownloaded: 下载模块阶段, 完成后触发
- runner.hooks.moduleDownloaded.tapPromise(this.name, (moduleInfo) => {
- const { target } = runner.userConfig
- if (target) {
- // 对 moduleInfo 进行 scripts 脚本修改等操作
- }
- })
-
- // moduleBeforeScriptsExecuted: 前置脚本阶段, 完成后触发
- runner.hooks.moduleBeforeScriptsExecuted.tapPromise(
- this.name,
- (moduleInfo) => {
- const { target } = runner.userConfig
- if (['alipay', 'taobao'].includes(target)) {
- // 对支付宝、淘宝端完成前置脚本后进行一些文件处理
- }
- }
- )
-
- // moduleConfigLoaded: 配置载入阶段, 完成后触发
- runner.hooks.moduleConfigLoaded.tapPromise(this.name, (moduleInfo) => {
- const { target } = runner.userConfig
- if (target === 'wechat') {
- // 对微信端配置载入后进行一些操作流程
- }
- })
-
- // moduleCopiedOrCompiled: 复制编译阶段, 完成后触发
- runner.hooks.moduleCopiedOrCompiled.tapPromise(this.name, (moduleInfo) => {
- const { target } = runner.userConfig
- if (target === 'bytedance') {
- // 对抖音端复制编译完成后进行一些操作流程
- }
- })
-
- // moduleAfterScriptsExecuted: 后置脚本阶段, 完成后触发
- runner.hooks.moduleAfterScriptsExecuted.tapPromise(
- this.name,
- (moduleInfo) => {
- const { target } = runner.userConfig
- if (target === 'wechat') {
- // 对微信端 scripts.after 脚本执行完成后进行一些操作流程
- }
- }
- )
-
- // moduleComposed: 模块集成阶段, 完成后触发
- runner.hooks.moduleComposed.tapPromise(this.name, (moduleInfo) => {
- const { target } = runner.userConfig
- if (target === 'wechat') {
- // 对微信端集成完成成后进行一些文件操作
- }
- })
-
- // moduleFailedAttempt: 失败重试阶段,模块集成失败后将自动尝试修复
- runner.hooks.moduleFailedAttempt.tapPromise(this.name, (moduleInfo) => {
- // 模块集成失败后重试阶段介入一下错误输出上报或相关操作
- })
- }
-}
-```
diff --git a/website/docs/api/engineering-mor.md b/website/docs/api/engineering-mor.md
deleted file mode 100644
index b2229f11..00000000
--- a/website/docs/api/engineering-mor.md
+++ /dev/null
@@ -1,112 +0,0 @@
-# MorJS API
-
-## tsTransformerFactory(visitor)
-
-生成 ts 的 transformer 插件,提供 visitor 作为参数,遍历所有 Node 节点
-
-- `visitor`: 自定义节点 visitor
-
-## cssProcessorFactory(name, processor)
-
-postcss 插件
-
-- `name`: css 处理器作为 postcss 插件的名称
-- `processor`: 自定义 css 处理器
-
-## validKeysMessage(keys)
-
-基于可选值生成描述信息
-
-- `keys`: 可选值
-
-## hexToRgb(hex)
-
-将 16 进制的颜色值转换成 rgb 格式
-
-- `hex`: 16 进制的颜色值
-
-## isLightColor(r, g, b)
-
-是否是浅色
-
-- `r`: rgb 色值区域中的 red
-- `g`: rgb 色值区域中的 green
-- `b`: rgb 色值区域中的 blue
-
-## senpmBinPATH(projectPath, env)
-
-设置 NPM .bin 路径以复用 npm bin 文件
-
-- `projectPath`: 项目路径
-- `env`: 环境变量
-
-## generateQrcodeForTerminal(input)
-
-生成二维码字符串
-
-- `input`: 用于生成二维码的字符串
-
-## expandExtsWithConditionalExt(exts, conditionalExts)
-
-将普通后缀扩展为普通后缀和带条件后缀的集合,条件后缀优先级高于普通后缀
-
-- `exts`: 后缀列表
-- `conditionalExts`: 条件后缀
-
-## WebpackWrapper
-
-webpack 封装,主要目的是 共用 webpack 的能力
-
-```typescript
-import { WebpackWrapper } from '@morjs/cli'
-
-const webpack = new WebpackWrapper()
-```
-
-## WebpackChain
-
-引用自 `webpack-chain-5` 的第三方依赖,直接 `export` 给开发者引用
-
-## webpack
-
-引用自 `webpack` 的第三方依赖,直接 `export` 给开发者引用
-
-## glob
-
-引用自 `takin` 的 `fastGlob` 对象,直接 `export` 给开发者引用
-
-## posthtml
-
-引用自 `posthtml` 的第三方依赖,直接 `export` 给开发者引用
-
-## typescript
-
-引用自 `typescript` 的第三方依赖,直接 `export` 给开发者引用
-
-## micromatch
-
-引用自 `micromatch` 的第三方依赖,直接 `export` 给开发者引用
-
-## postcss
-
-引用自 `postcss` 的第三方依赖,直接 `export` 给开发者引用
-
-## slash
-
-引用自 `slash` 的第三方依赖,直接 `export` 给开发者引用
-
-## takin
-
-引用自 `takin` 的依赖,直接 `export` 给开发者引用
-
-## pRetry
-
-引用自 `p-retry` 的第三方依赖,直接 `export` 给开发者引用
-
-## pQueue
-
-引用自 `p-queue` 的第三方依赖,直接 `export` 给开发者引用
-
-## cjsToEsmTransformer
-
-引用自 `cjstoesm` 的 `cjsToEsmTransformer` 对象,直接 `export` 给开发者引用
diff --git a/website/docs/api/engineering-takin.md b/website/docs/api/engineering-takin.md
deleted file mode 100644
index bea90d45..00000000
--- a/website/docs/api/engineering-takin.md
+++ /dev/null
@@ -1,967 +0,0 @@
-# Takin API
-
-> 关于什么是 `takin` 可以参见 [Takin 介绍](/api/takin)
-
-## Cli
-
-提供给 runner.hooks 的 Cli 实例,可通过 `cli.command().option()` 追加子命令和选项来干预命令行阶段实现自定义命令
-
-```typescript
-import type { Plugin, Runner } from '@morjs/cli'
-
-export default class MorJSPluginXXX implements Plugin {
- name = 'MorJSPluginXXX'
-
- apply(runner: Runner) {
- // 可通过该 hook 拿到一个 cli 的实例
- runner.hooks.cli.tap(this.name, (cli) => {
- // 通过 cli.command 新建一个命令行指令
- const command = cli.command(COMMAND_NAME, 'command指令描述')
- // 注册 options 选项
- command.option(rawName, '选项描述')
-
- // eg: 创建一个名为 gogogo 的命令行指令,并添加 --prod 选项配置
- // cli.command('gogogo', 'gogog 命令行').option('--prod', '开启生产模式')
- // 那么在终端可运行 mor gogogo 或 mor gogogo --prod 命令行指令
- })
- }
-}
-```
-
-## Config
-
-提供基础功能,用户配置支持
-
-1. 支持自定义配置配置文件的名称,如 mor.config.js
-2. 支持加载 js、ts、mjs、json 四种格式的配置文件
-3. 不同的文件使用不同的方式载入
-4. 支持用户自定义配置文件名称,并指定配置文件的支持类型,默认是 takin.config
-5. 支持通过插件注册配置字段和校验 schema
-6. 支持开启配置数组,并通过用户指定的字段来区分
-7. 支持配置合并(未完成)
-
-## logger
-
-`MorJS` 对于日志进行了约束和定义,提供了一套简洁、美观的固定日志方法,只需引入 `logger` 即可使用
-
-### logger.init(level, options)
-
-用于初始化 `logger`,多次调用会重复初始化同一个 `logger`
-
-- `level`: 配置日志级别,必填 `string` 类型,支持 `info`|`success`|`warn`|`error`|`silent`,默认值 `info`
-- `options`: 通用 logger 配置,必填 `object` 类型,含四个非必填配置
- - `prefix`: 日志前缀,非必填 `string` 类型,目前默认值 `[mor]`
- - `debugPrefix`: debug 前缀,非必填 `string` 类型,目前默认值 MorJS
- - `allowClearScreen`: 是否清空屏幕,非必填 `boolean` 类型,目前默认值 `true`
- - `customLogger`: 自定义 `logger` 对象,非必填实例对象,用于取代现有 `logger` 实例
-
-```typescript
-import { logger } from '@morjs/cli'
-
-logger.init('info', { prefix: '[mor]', debugPrefix: 'mor' })
-```
-
-### logger.withOptions(options)
-
-用于返回携带特定 `options` 的 `logger` 实例,该实例后续的调用都含有已配置的特定 `options`
-
-- `options`: 必填 `object` 类型,含以下个非必填配置
- - `clear`: 是否清空当前窗口,非必填 `boolean` 类型
- - `timestamp`: 是否携带时间戳,非必填 `boolean` 类型
- - `color`: 是否输出颜色,非必填 `boolean` 类型
- - `align`: 是否对齐,非必填 `boolean` 类型
- - `symbol`: 是否输出 symbol,非必填 `boolean`|`string` 类型
- - `update`: 是否为更新,非必填 `boolean` 类型
- - `depth`: 对象层级,非必填`null`|`number`类型
-
-```typescript
-import { logger } from '@morjs/cli'
-
-const logger = createLogger('info', {
- debugPrefix: 'mor',
- prefix: `[mor]`
-}).withOptions({ color: false, align: true })
-```
-
-### logger.info(msg, options)
-
-在控制台打印 `info` 类型的日志输出
-
-- `msg`: 必填 `any` 类型,显示日志的输出内容
-- `options`: 非必填 `object` 类型,配置项与 `logger.withOptions` 的 `options` 一致
-
-### logger.success(msg, options)
-
-在控制台打印 `success` 类型的日志输出,参数配置与 `logger.info` 一致
-
-### logger.warn(msg, options)
-
-在控制台打印 `warn` 类型的日志输出,参数配置与 `logger.info` 一致
-
-### logger.warnOnce(msg, options)
-
-在控制台打印 `warnOnce` 类型的日志输出,相同内容只会输出一次,参数配置与 `logger.info` 一致
-
-### logger.error(msg, options)
-
-在控制台打印 `error` 类型的日志输出,参数配置与 `logger.info` 一致
-
-```typescript
-import { logger } from '@morjs/cli'
-
-logger.info('info 日志输出')
-logger.success('success 日志输出')
-logger.warn('warn 日志输出')
-logger.warnOnce('warnOnce 日志输出,相同信息只输出一次')
-logger.warnOnce('warnOnce 日志输出,相同信息只输出一次')
-logger.error('error 日志输出')
-```
-
-
-
-### logger.deprecate(deprecatedMsg, hint, error)
-
-在控制台打印一段 `warn` 类型的 deprecate 日志输出
-
-- `deprecatedMsg`: 必填 `any` 类型,显示日志的输出内容
-- `hint`: 必填 `any` 类型,显示日志内容的提示
-- `error`: 非必填 `object` 类型,通用 `error` 结构
-
-```typescript
-import { logger } from '@morjs/cli'
-
-logger.deprecate('deprecatedMsg 日志输出', 'hint 提示')
-```
-
-### logger.debug(msg, ...args)
-
-基于 `debug npm` 的 `debug` 日志输出
-
-```typescript
-import { logger } from '@morjs/cli'
-
-logger.debug('debug 日志输出,仅在开启 debug 时显示')
-```
-
-### logger.time(label) & logger.timeEnd(label)
-
-耗时性能日志输出, 需要 `logger.time()` 配合 `logger.timeEnd()` 一起使用
-
-- `label`: 必填 `string` 类型,打印同一 `label` 值从开始到结束之间的耗时,单位 ms
-
-### logger.clearScreen(type)
-
-清空当前屏幕
-
-- `type`: 配置清屏设置,必填 `string` 类型,支持 `info`|`success`|`warn`|`error`
-
-### logger.hasErrorLogged(error)
-
-当前错误是否已输出,返回一个 `boolean` 值
-
-- `error`: 非必填 `object` 类型,通用 `error` 结构
-
-### logger.hasWarned
-
-当前 `logger` 实例的 `hasWarned` 项,用于记录是否打印 `warn` 级别及以上报错日志
-
-### logger.hasErrored
-
-当前 `logger` 实例的 `hasErrored` 项,用于记录是否打印 `error` 级别及以上报错日志
-
-### logger.options
-
-当前 `logger` 实例的 `options` 配置,具体值可参考 `logger.withOptions` 的 `options` 配置项
-
-### logger.createLoading(msg, options)
-
-可以创建一个 loading 日志对象
-
-- `msg`: 必填 `any` 类型,显示日志的输出内容
-- `options`: 非必填 `object` 类型,含四个非必填配置
- - `clear`: 是否清空当前窗口,非必填 `boolean` 类型
- - `timestamp`: 是否携带时间戳,非必填 `boolean` 类型
- - `color`: 是否输出颜色,非必填 `boolean` 类型
- - `align`: 是否对齐,非必填 `boolean` 类型
- - `symbol`: 是否输出 symbol,非必填 `boolean`|`string` 类型
- - `update`: 是否为更新,非必填 `boolean` 类型
- - `depth`: 对象层级,非必填 `null`|`number` 类型
-
-`logger.createLoading(msg)` 返回携带特定 `options` 的 `loadingLogger` 的实例对象,该实例对象提供以下几个方法
-
-- `.start(msg)`: 开始执行 `loadingLogger` 日志实例对象,并先打印一次 `msg` 内容
- - `msg`: 非必填 `any` 类型,显示日志的输出内容,优先级大于 `createLoading` 的 `msg`
-- `.update(msg)`: 更新日志的输出内容
- - `msg`: 必填 `any` 类型,显示日志的输出内容
-- `.stop()`: 停止 `loadingLogger` 日志实例对象的执行
-- `.success(msg, opts)`: 在控制台打印 `success` 类型的日志输出,参数配置与 `logger.info` 一致
-- `.fail(msg, opts)`: 在控制台打印 `error` 类型的日志输出,参数配置与 `logger.info` 一致
-- `.error(msg, opts)`: 在控制台打印 `error` 类型的日志输出,参数配置与 `logger.info` 一致
-
-以下为示例代码:(真实的显示效果应为,每下一行的打印显示会自动替换前一行的显示,这里为了方便截图我在 `init` 里设置了 `allowClearScreen`,`start` 和 `update` 的 icon 是一个类转圈的动效,开发者可以自己尝试看一下效果)
-
-```typescript
-import { logger } from '@morjs/cli'
-
-const loading = logger.createLoading('创建进程日志').start()
-try {
- setTimeout(() => {
- loading.update('当前进度50%')
- }, 1500)
- setTimeout(() => {
- loading.stop()
- loading.success('当前进程已完成')
- }, 3000)
-} catch (err) {
- loading.fail(err)
-}
-```
-
-
-
-### logger.table(tableOptions, type, options)
-
-在控制台打印 `table` 表格类型的日志输出
-
-- `tableOptions`: 必填 `object` 类型
- - `head`: 表格头的配置信息,`string[]` 类型
- - `rows`: 表格内容的配置信息,`string[][]` 类型
- - `colWidths`: 表格每列的宽度,`number[]` 类型
- - `colAligns`: 表格每列的对齐方式,`Array<'left' | 'middle' | 'right'>` 类型
- - 其他配置项可查看源码或 `typescript` 对应注释
-- `type`: 非必填 `string` 类型,支持 `info`|`success`|`warn`|`error`
-- `options`: 非必填 `object` 类型,配置项与 `logger.withOptions` 的 `options` 一致
-
-```typescript
-const table = {
- head: ['head1', 'head2', 'head3'],
- rows: [
- ['rows1-1', 'rows1-2', 'rows1-3'],
- ['rows2-1', 'rows2-2', 'rows2-3'],
- ['rows3-1', 'rows3-2', 'rows3-3']
- ],
- colWidths: [30, 20, 20]
-}
-logger.table(table)
-```
-
-
-
-## downloader
-
-### downloader.file.parseOptions(pathOrOptions)
-
-解析 file 链接或选项
-
-- `pathOrOptions`: 链接 `path` 或选项 `{ path, ...options }`
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.file.parseOptions(pathOrOptions)
-```
-
-### downloader.file.supportProtocol(url)
-
-判断是否支持处理当前链接(正则)
-
-- `url`: 链接
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.file.supportProtocol(url) // true / false
-```
-
-### downloader.file.getName(fileOptions)
-
-基于 file 链接选项获取名称
-
-- `fileOptions`: file 链接选项 `{ path, ...options }`
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.file.getName(fileOptions)
-```
-
-### downloader.file.download(fileOptions, dest)
-
-下载 file 链接到指定目录
-
-- `fileOptions`: file 链接选项
-- `dest`: 指定目录地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.file.download(fileOptions, dest)
-```
-
-### downloader.link.parseOptions(pathOrOptions)
-
-解析 link 链接或选项
-
-- `pathOrOptions`: 链接或选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.link.parseOptions(pathOrOptions)
-```
-
-### downloader.link.supportProtocol(url)
-
-判断是否支持处理当前链接(正则)
-
-- `url`: 链接
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.link.supportProtocol(url) // true / false
-```
-
-### downloader.link.getName(linkOptions)
-
-基于 link 链接选项获取名称
-
-- `linkOptions`: link 链接选项 `{ path, ...options }`
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.link.getName(linkOptions)
-```
-
-### downloader.link.download(linkOptions, dest)
-
-下载 link 链接到指定目录
-
-- `linkOptions`: link 链接选项
-- `dest`: 指定目录地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.link.download(linkOptions, dest)
-```
-
-### downloader.git.addSupportGitSite(siteUrl, siteType)
-
-添加支持的 git 站点
-
-- `siteUrl`: 站点地址, 如 github.com
-- `siteType`: 站点类型, 如 git / gitlab / bitbucket
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.git.addSupportGitSite(siteUrl, siteType)
-```
-
-### downloader.git.getGitHash(repo)
-
-获取 git hash
-
-- `repo`: git repo 设置
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.git.getGitHash(repo)
-```
-
-### downloader.git.parseOptions(urlOrOptions)
-
-解析 git 选项或链接
-
-- `urlOrOptions`: git 下载链接或选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.git.parseOptions(urlOrOptions)
-```
-
-### downloader.git.supportProtocol(url)
-
-判断是否支持处理当前链接
-
-- `url`: 链接
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.git.supportProtocol(url)
-```
-
-### downloader.git.getName(options)
-
-从 git 仓库选项中获取名称
-
-- `options`: git 仓库选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.git.getName(options)
-```
-
-### downloader.git.download(options, dest)
-
-下载 git repo 到指定的目录
-
-- `options`: git 选项
-- `dest`: 下载目录
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.git.download(options, dest)
-```
-
-### downloader.tar.parseOptions(urlOrOptions)
-
-解析 tar 链接或选项
-
-- `urlOrOptions`: 链接或选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.tar.parseOptions(urlOrOptions)
-```
-
-### downloader.tar.supportProtocol(url)
-
-判断是否支持处理当前链接(正则)
-
-- `url`: 链接
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.tar.supportProtocol(url)
-```
-
-### downloader.tar.getName(tarOptions)
-
-基于 tar 压缩包选项获取名称
-
-- `tarOptions`: tar 压缩包选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.tar.getName(tarOptions)
-```
-
-### downloader.tar.download(tarOptions, dest)
-
-下载 tar 压缩包到指定目录
-
-- `tarOptions`: tar 压缩包选项
-- `dest`: 指定目录地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.tar.download(tarOptions, dest)
-```
-
-### downloader.npm.setRegistryUrl(url)
-
-设置自定义 npm registry 地址
-
-- `url`: 自定义 npm registry 地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.setRegistryUrl(url)
-```
-
-### downloader.npm.getRegistryUrl(scope)
-
-返回 特定 scope 的 npm registry 地址
-
-- `scope`: npm 分组
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.getRegistryUrl(scope)
-```
-
-### downloader.npm.parseOptions(urlOrOptions)
-
-解析 npm 链接或选项
-
-- `urlOrOptions`: npm 链接或选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.parseOptions(urlOrOptions)
-```
-
-### downloader.npm.supportProtocol(url)
-
-判断是否支持处理当前链接
-
-- `url`: 链接
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.supportProtocol(url)
-```
-
-### downloader.npm.getName(npmOptions)
-
-从 npm 选项中获取名称
-
-- `npmOptions`: npm 选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.getName(npmOptions)
-```
-
-### downloader.npm.download(npmOptions, dest)
-
-下载 npm 到指定的目录
-
-- `npmOptions`: npm 下载链接或选项
-- `dest`: 下载目录
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.download(npmOptions, dest)
-```
-
-### downloader.registerDownloader(type, downloader)
-
-注册新的下载器
-
-- `type`: 下载器类型
-- `downloader`: 下载器
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.registerDownloader(type, downloader)
-```
-
-### downloader.getModuleName(type, options)
-
-获取下载模块名称
-
-- `type`: 下载类型
-- `options`: 下载配置
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.npm.getModuleName(type, options)
-```
-
-### downloader.chooseDownloadType(options)
-
-基于下载配置选择下载方式
-
-- `options`: 下载配置
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.chooseDownloadType(options)
-```
-
-### downloader.getAllDownloadTypes()
-
-获取所有下载类型
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.getAllDownloadTypes()
-```
-
-### downloader.parseOptions(type, options)
-
-解析下载链接或选项
-
-- `type`: 下载类型
-- `options`: 下载链接或选项
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.parseOptions(type, options)
-```
-
-### downloader.download(type, options, dest)
-
-尝试通过不同的方式下载模块
-
-- `type`: 下载方式
-- `options`: 下载配置
-- `dest`: 下载地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.download(type, options, dest)
-```
-
-### downloader.autoDetectDownloaderTypeAndOptions(url)
-
-基于 url 自动判断支持的下载器类型及下载选项
-
-- `url`: 下载链接或地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.autoDetectDownloaderTypeAndOptions(url)
-```
-
-### downloader.tryDownloadByUrl(options, dest)
-
-自动基于不同的协议来下载模块
-
-- `options`: 下载链接
-- `dest`: 下载地址
-
-```typescript
-import { downloader } from '@morjs/cli'
-
-downloader.tryDownloadByUrl(options, dest)
-```
-
-## utils
-
-封装定义了一些常用方法
-
-### asArray(value)
-
-数组转换方法
-
-- `value`: 需要转换为数组的值
-
-```typescript
-import { asArray } from '@morjs/cli'
-
-asArray(value)
-```
-
-### bundleMjsOrTsFile(cwd, fileName, mjs)
-
-使用 esbuild 读取 ts 或 mjs 文件内容
-
-- `cwd`: 当前工作目录
-- `fileName`: 配置文件路径
-- `mjs`: 是否为 mjs 文件类型
-
-```typescript
-import { bundleMjsOrTsFile } from '@morjs/cli'
-
-bundleMjsOrTsFile(cwd, fileName, mjs)
-```
-
-### isSupportColorModifier()
-
-主要用于 logger 内部,标记是否支持 color modifier 如: bold strikethrough 等
-
-```typescript
-import { isSupportColorModifier } from '@morjs/cli'
-
-isSupportColorModifier()
-```
-
-### disableColorModifierSupport()
-
-将标记值改为 false
-
-```typescript
-import { disableColorModifierSupport } from '@morjs/cli'
-
-disableColorModifierSupport()
-```
-
-### enableColorModifierSupport()
-
-将标记值改为 true
-
-```typescript
-import { enableColorModifierSupport } from '@morjs/cli'
-
-enableColorModifierSupport()
-```
-
-### compose(fns)
-
-组合多个函数为一个,顺序执行
-
-- `fns`: 函数列表
-
-```typescript
-import { compose } from '@morjs/cli'
-
-compose(fns)
-```
-
-### importJsOrMjsOrTsFromFile(cwd, filePath, isMjs, isTs, tempFilePath, autoDeleteTempFile)
-
-载入并解析 js、mjs 或 ts 文件
-
-```typescript
-import { importJsOrMjsOrTsFromFile } from '@morjs/cli'
-
-importJsOrMjsOrTsFromFile(
- cwd,
- filePath,
- isMjs,
- isTs,
- tempFilePath,
- autoDeleteTempFile
-)
-```
-
-### interopRequireDefault(obj)
-
-改造传入的对象结构
-
-- `obj`: 传入的对象值
-
-```typescript
-import { interopRequireDefault } from '@morjs/cli'
-
-interopRequireDefault(obj)
-```
-
-### isObject(value)
-
-判断是否为 object
-
-- `value`: 传入的对象值
-
-```typescript
-import { isObject } from '@morjs/cli'
-
-isObject(value)
-```
-
-### isUnicodeSupported()
-
-判断是否支持 unicode
-
-```typescript
-import { isUnicodeSupported } from '@morjs/cli'
-
-isUnicodeSupported()
-```
-
-### lookupFile(dirs, files, extnames, options)
-
-查找文件
-
-- `dirs`: 目录地址
-- `files`: 文件名
-- `extnames`: 后缀名
-- `options`: 查找选项
-
-```typescript
-import { lookupFile } from '@morjs/cli'
-
-lookupFile(dirs, files, extnames, options)
-```
-
-### objectEnum(t)
-
-通过数组创建对象 enum
-
-- `t`: 静态数组
-
-```typescript
-import { objectEnum } from '@morjs/cli'
-
-objectEnum(t)
-```
-
-### readJsonLike(filePath)
-
-读取类 json 文件,支持 json / jsonc / json5 三种格式
-
-- `filePath`: 类 json 文件
-
-```typescript
-import { readJsonLike } from '@morjs/cli'
-
-readJsonLike(filePath)
-```
-
-### requireResolve(args)
-
-由于 jest 没有办法 mock require.resolve, 需要单独封装方法来解决单测问题
-
-https://github.com/facebook/jest/issues/9543
-
-## Generator
-
-用于构建脚手架:
-
-1. 指定某个模板,支持本地加载或网络加载,支持多种类型
-
-- 基于 downloader 支持的各种类型:file 文件、git 仓库、link 软链、npm 包、tar 包
-- 下载后会调用 prompts 获取命令行交互结果,把结果作为参数抛给 lodash 的 template 模板里,通过模板 render 生成文件,写入模板到目标文件夹
-
-2. 自定义模板
-
-## deps
-
-将 `takin` 本身的依赖库 `export` 出去,避免重复依赖
-
-### chalk
-
-引用自 `chalk` 的第三方依赖,直接 `export` 给开发者引用,可用于修改终端输出字符彩色样式
-
-```typescript
-import { chalk } from '@morjs/cli'
-
-chalk()
-```
-
-### debug
-
-引用自 `debug` 的第三方依赖,直接 `export` 给开发者引用,可用于 logger 的 debug 日志输出,返回一个修饰过的 console.error 函数
-
-```typescript
-import { debug } from '@morjs/cli'
-
-debug()
-```
-
-### execa
-
-引用自 `execa` 的第三方依赖,直接 `export` 给开发者引用,可用于执行终端进程的库,如 execa.command(`git clone ${repo.ssh}${dest}`)
-
-```typescript
-import { execa } from '@morjs/cli'
-
-execa()
-```
-
-### esbuild
-
-引用自 `esbuild` 的第三方依赖,直接 `export` 给开发者引用,支持 typescript 和 jsx 的极速打包器,目前提供给 bundleMjsOrTsFile 方法使用
-
-```typescript
-import { esbuild } from '@morjs/cli'
-
-esbuild()
-```
-
-### fastGlob
-
-引用自 `fast-glob` 的第三方依赖,直接 `export` 给开发者引用,可提供遍历文件系统和返回路径名的方法,目前提供给 generator 使用
-
-```typescript
-import { fastGlob } from '@morjs/cli'
-
-fastGlob()
-```
-
-### fsExtra
-
-引用自 `fs-extra` 的第三方依赖,直接 `export` 给开发者引用,可用于文件操作,复制、建目录、删除等 fs 扩展操作
-
-```typescript
-import { fsExtra as fs } from '@morjs/cli'
-
-fs()
-```
-
-### got
-
-引用自 `got` 的第三方依赖,直接 `export` 给开发者引用,可用于支持 promise 的 request 请求,目前提供给 download 使用
-
-```typescript
-import { got } from '@morjs/cli'
-
-got()
-```
-
-### json5
-
-引用自 `json5` 的第三方依赖,直接 `export` 给开发者引用,可用于支持 json5 格式的文件,提供更精简的 json 格式,去掉了 key 的双引号,同时支持注释
-
-```typescript
-import { json5 } from '@morjs/cli'
-
-json5()
-```
-
-### jsoncParser
-
-引用自 `jsonc-parser` 的第三方依赖,直接 `export` 给开发者引用,可用于支持 jsonc 格式的文件,用于序列化 jsonc 文件内容
-
-```typescript
-import { jsoncParser } from '@morjs/cli'
-
-jsoncParser()
-```
-
-### lodash
-
-引用自 `lodash` 的第三方依赖,直接 `export` 给开发者引用,提供大量封装的 js 方法,如「模板插入 template」「深拷贝 cloneDeep」「删除对象属性 omit」「判空 isEmpty」等
-
-```typescript
-import { lodash } from '@morjs/cli'
-
-lodash()
-```
-
-### prompts
-
-引用自 `prompts` 的第三方依赖,直接 `export` 给开发者引用,可用于创建交互命令行表单,目前提供给 generator 使用获取命令行交互结果
-
-```typescript
-import { prompts } from '@morjs/cli'
-
-prompts()
-```
-
-### tapable
-
-引用自 `tapable` 的第三方依赖,直接 `export` 给开发者引用,流程管理工具,主要用来串联插件,完善事件流执行
-
-```typescript
-import { tapable } from '@morjs/cli'
-
-tapable()
-```
-
-### tarFs
-
-引用自 `tar-fs` 的第三方依赖,直接 `export` 给开发者引用,可用于 tar 包的压缩与解压,目前提供给 download 使用
-
-```typescript
-import { tarFs } from '@morjs/cli'
-
-tarFs()
-```
-
-### zod
-
-引用自 `zod` 的第三方依赖,直接 `export` 给开发者引用,可用于以 typeScript 为基础的模式声明和验证校验手段
-
-```typescript
-import { zod } from '@morjs/cli'
-
-zod()
-```
diff --git a/website/docs/api/runtime-api.md b/website/docs/api/runtime-api.md
deleted file mode 100644
index 3546cb6e..00000000
--- a/website/docs/api/runtime-api.md
+++ /dev/null
@@ -1,389 +0,0 @@
-# Runtime API
-
-## createApi(adapters, options)
-
-初始化 MorJS API,默认会自动初始化一个全局的 mor api
-
-- `adapters`: 初始化选项
- - `adapters[x].initApi`: 初始化接口方法, 接受 apiOptions 作为参数
-- `options`: 初始化选项, 默认为 {}
-
-```typescript
-import { createApi } from '@morjs/api'
-
-createApi([], {})
-```
-
-## mor(adapters, options)
-
-初始化 mor 接口
-
-## registerFactory(factoryName, factoryFunction)
-
-注册接口初始化工厂函数
-
-- `factoryName`: 接口初始化工厂函数名称
-- `factoryFunction`: 接口初始化工厂函数
-
-```typescript
-import { registerFactory } from '@morjs/api'
-
-registerFactory(factoryName, factoryFunction)
-```
-
-## init(options)
-
-初始化一个新的 mor api 实例
-
-- `options`: 选项
-
-```typescript
-import { init } from '@morjs/api'
-
-init(options)
-```
-
-## Base64.encode(this, input)
-
-对输入的值进行 encode 编码
-
-- `this`: IBase64 对象本省
-- `input`: 需要进行 encode 编码的字符串
-
-```typescript
-import { Base64 } from '@morjs/api'
-
-Base64.encode(this, input)
-```
-
-## Base64.decode(this, input)
-
-对输入的值进行 decode 解码
-
-- `this`: IBase64 对象本省
-- `input`: 需要进行 decode 解码的字符串
-
-```typescript
-import { Base64 } from '@morjs/api'
-
-Base64.decode(this, input)
-```
-
-## Base64.utf8Encode(this, input)
-
-对输入的值进行 utf8 格式的 encode 编码
-
-- `this`: IBase64 对象本省
-- `input`: 需要进行 utf8 格式的 encode 编码的字符串
-
-```typescript
-import { Base64 } from '@morjs/api'
-
-Base64.utf8Encode(this, input)
-```
-
-## Base64.utf8Decode(this, input)
-
-对输入的值进行 utf8 格式的 decode 解码
-
-- `this`: IBase64 对象本省
-- `input`: 需要进行 utf8 格式的 decode 解码的字符串
-
-```typescript
-import { Base64 } from '@morjs/api'
-
-Base64.utf8Decode(this, input)
-```
-
-## getEnv()
-
-获取小程序运行环境
-
-```typescript
-import { getEnv } from '@morjs/api'
-
-const env = getEnv()
-```
-
-## getEnvDesc()
-
-获取当前环境描述信息
-
-```typescript
-import { getEnvDesc } from '@morjs/api'
-
-const envDesc = getEnvDesc()
-```
-
-## getGlobalObject()
-
-获取全局对象,如支付宝的 my,微信的 wx
-
-```typescript
-import { getGlobalObject } from '@morjs/api'
-
-const global = getGlobalObject()
-```
-
-## createEvent(reason, all)
-
-创建 Emitter 实例
-
-- `reason`: 事件创建原因, 用于统计
-- `all`: 自定义 Map 用于存储事件名称和事件处理函数
-
-```typescript
-import { createEvent } from '@morjs/api'
-
-createEvent(reason, all)
-```
-
-## getAllEvents()
-
-获取所有 event 实例
-
-```typescript
-import { getAllEvents } from '@morjs/api'
-
-getAllEvents()
-```
-
-## event
-
-全局默认 Event
-
-## createHooks(reason)
-
-创建 hooks 对象
-
-- `reason`: Hooks 创建原因
-
-```typescript
-import { createHooks } from '@morjs/api'
-
-createHooks(reason)
-```
-
-## getAllHooks()
-
-获取所有 hooks
-
-```typescript
-import { getAllHooks } from '@morjs/api'
-
-getAllHooks()
-```
-
-## hooks
-
-获取全局共享属性,用于作为原子化的兜底实现
-
-## applyPlugins(hooks, plugins)
-
-应用插件
-
-- `hooks`: Hooks
-- `plugins`: 插件列表
-
-```typescript
-import { applyPlugins } from '@morjs/api'
-
-applyPlugins(hooks, plugins)
-```
-
-## applySolutions(hooks, solutions)
-
-应用 Solutions
-
-- `hooks`: Hooks
-- `solutions`: 插件集列表
-
-```typescript
-import { applySolutions } from '@morjs/api'
-
-applySolutions(hooks, solutions)
-```
-
-## logger.warn(msg)
-
-在控制台打印 `warn` 类型的日志输出
-
-- `msg`: 显示日志的输出内容
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.warn(msg)
-```
-
-## logger.log(msg)
-
-在控制台打印 `log` 类型的日志输出
-
-- `msg`: 显示日志的输出内容
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.log(msg)
-```
-
-## logger.error(msg)
-
-在控制台打印 `error` 类型的日志输出
-
-- `msg`: 显示日志的输出内容
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.error(msg)
-```
-
-## logger.info(msg)
-
-在控制台打印 `info` 类型的日志输出
-
-- `msg`: 显示日志的输出内容
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.info(msg)
-```
-
-## logger.debug(msg)
-
-在控制台打印 `debug` 类型的日志输出
-
-- `msg`: 显示日志的输出内容,仅在开启 debug 时显示
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.debug(msg)
-```
-
-## logger.deprecated(msg)
-
-在控制台打印一段 `warn` 类型的 deprecate 日志输出
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.deprecated(msg)
-```
-
-## logger.time(label) & logger.timeEnd(label)
-
-耗时性能日志输出, 需要 `logger.time()` 配合 `logger.timeEnd()` 一起使用
-
-- `label`: 必填 `string` 类型,打印同一 `label` 值从开始到结束之间的耗时,单位 ms
-
-```typescript
-import { logger } from '@morjs/api'
-
-logger.time(label)
-logger.timeEnd(label)
-```
-
-## ModuleManager
-
-模块管理,用于获取当前小程序中的插件、分包和模块等
-
-## asArray(arr)
-
-确保一个对象是数组
-
-1. 如果 对象 == null 则返回空数组
-2. 如果 对象不是数组 则返回包含该对象的数组
-3. 如果 对象是数组 直接返回
-
-- `arr`: 需要转换为数组的参数
-
-```typescript
-import { asArray } from '@morjs/api'
-
-asArray(arr)
-```
-
-## compose(stack)
-
-将多个函数合并为一个函数
-
-- `stack`: 函数堆栈
-
-```typescript
-import { compose } from '@morjs/api'
-
-compose(stack)
-```
-
-## generateId()
-
-生成 ID
-
-```typescript
-import { generateId } from '@morjs/api'
-
-generateId()
-```
-
-## getSharedProperty(propName, context)
-
-获取全局共享属性,用于作为原子化的兜底实现
-
-1. 首先查找上下文中对应的属性
-2. 如果不存在,则查找 getApp 中的
-3. 如果不存在,则查找 小程序环境的 globalObject, 如 my 中是否存在
-4. 如果不存在,则使用 SHARED 作为兜底
-
-- `propName`: 共享属性名称
-- `context`: 当前执行环境的上下文
-
-```typescript
-import { getSharedProperty } from '@morjs/api'
-
-getSharedProperty(propName, context)
-```
-
-## hasOwnProperty(obj, propertyName)
-
-对象中是否包含对应的属性
-
-- `obj`: 对象
-- `propertyName`: 属性名称
-
-```typescript
-import { hasOwnProperty } from '@morjs/api'
-
-hasOwnProperty(obj, propertyName)
-```
-
-## transformApis(mor, global, config, installAllGlobalApis, allowOverride)
-
-接口抹平转换
-
-- MorJS: mor 接口对象
-- `global`: 小程序目标平台全局对象
-- `config`: 接口抹平配置
-- `installAllGlobalApis`: 是否在 mor 中添加所有的 API
-- `allowOverride`: 是否允许覆盖 API
-
-```typescript
-import { transformApis } from '@morjs/api'
-
-transformApis(mor, global, config, installAllGlobalApis, allowOverride)
-```
-
-## markAsUnsupport(apiName)
-
-返回暂不支持的 函数
-
-- `apiName`: 接口名称
-
-```typescript
-import { markAsUnsupport } from '@morjs/api'
-
-markAsUnsupport(apiName)
-```
diff --git a/website/docs/api/runtime-core.md b/website/docs/api/runtime-core.md
deleted file mode 100644
index 266e22ff..00000000
--- a/website/docs/api/runtime-core.md
+++ /dev/null
@@ -1,257 +0,0 @@
-# Runtime Core
-
-## createApp(options, solution, extend)
-
-注册 App
-
-- `options`: MorJS 注册 App 的基础配置,必填 `object` 类型
-- `solution`: 运行时 Solution 支持,非必填 `MorJSSolution | MorJSSolution[]` 类型
-- `extend`: 模拟全局 App 构造函数,用于不存在 App 构造函数的环境,如 小程序插件
-
-```typescript
-import { createApp } from '@morjs/core'
-
-createApp({
- onLaunch() {
- console.log('app onlaunch')
- }
-})
-```
-
-## aApp(options, solution, extend)
-
-注册支付宝小程序 App,用法和 createApp 一致
-
-```typescript
-import { aApp } from '@morjs/core'
-
-aApp({
- onLaunch() {
- console.log('app onlaunch')
- }
-})
-```
-
-## wApp(options, solution, extend)
-
-注册微信小程序 App,用法和 createApp 一致
-
-```typescript
-import { wApp } from '@morjs/core'
-
-wApp({
- onLaunch() {
- console.log('app onlaunch')
- }
-})
-```
-
-## registerAppAdapters(adapters)
-
-注册应用转端适配器
-
-## createPage
-
-Page 页面注册
-
-- `options`: MorJS 注册 Page 的基础配置,必填 `object` 类型
-
-```typescript
-import { createPage } from '@morjs/core'
-
-createPage({
- onLoad() {
- console.log('page onLoad')
- }
-})
-```
-
-## aPage(options)
-
-支付宝 Page 页面注册,用法和 createPage 一致
-
-```typescript
-import { aPage } from '@morjs/core'
-
-aPage({
- onLoad() {
- console.log('page onLoad')
- }
-})
-```
-
-## wPage(options)
-
-微信 Page 页面注册,用法和 createPage 一致
-
-```typescript
-import { wPage } from '@morjs/core'
-
-wPage({
- onLoad() {
- console.log('page onLoad')
- }
-})
-```
-
-## registerPageAdapters(adapters)
-
-注册页面转端适配器
-
-## enhancePage(options, sourceType)
-
-增强页面功能: 注入 adapters/hooks、转换声明周期等
-
-- `options`: MorJS 注册 Page 的基础配置,必填 `object` 类型
-- `sourceType`: 非必填配置,支持 `w`|`a` 两种值,分别代表支付宝 DSL 与微信 DSL
-
-```typescript
-import { enhancePage } from '@morjs/core'
-
-enhancePage(options, sourceType)
-```
-
-## createComponent(options, sourceType)
-
-组件注册
-
-- `options`: MorJS 注册 Component 组件的基础配置,必填 `object` 类型
-- `sourceType`: 非必填配置,支持 `w`|`a` 两种值,分别代表支付宝 DSL 与微信 DSL
-
-```typescript
-import { createComponent } from '@morjs/core'
-
-createComponent({
- props: {},
- methods: {}
-})
-```
-
-## aComponent(options, sourceType)
-
-支付宝 Component 组件注册,用法和 createComponent 一致
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-aComponent({
- props: {},
- methods: {}
-})
-```
-
-## wComponent(options, sourceType)
-
-微信 Component 组件注册,用法和 createComponent 一致
-
-```typescript
-import { wComponent } from '@morjs/core'
-
-wComponent({
- props: {},
- methods: {}
-})
-```
-
-## registerComponentAdapters(adapters)
-
-注册组件转端适配器
-
-## enhanceComponent(options, sourceType, features)
-
-增强组件功能: 注入 adapters/hooks、转换声明周期等
-
-- `options`: 小程序组件配置
-- `sourceType`: 小程序组件源码类型, 编译时由 MorJS 自动填充
-- `features`: 功能特性配置
-
-```typescript
-import { enhanceComponent } from '@morjs/core'
-
-enhanceComponent(options, sourceType, features)
-```
-
-## PageToComponent(pageOptions, sourceType, features)
-
-将页面作为组件使用,仅供特殊场景下的使用,不保证完全的兼容性
-
-- `pageOptions`: 页面配置
-- `sourceType`: 源码类型
-- `features`: 功能配置
-
-```typescript
-import { PageToComponent } from '@morjs/core'
-
-PageToComponent(pageOptions, sourceType, features)
-```
-
-## aPageToComponent(pageOptions, features)
-
-支付宝 Page 转组件辅助函数
-
-- `pageOptions`: 页面配置
-- `features`: 功能配置
-
-```typescript
-import { aPageToComponent } from '@morjs/core'
-
-aPageToComponent(pageOptions, features)
-```
-
-## wPageToComponent(pageOptions, features)
-
-微信 Page 页面转组件辅助函数
-
-- `pageOptions`: 页面配置
-- `features`: 功能配置
-
-```typescript
-import { wPageToComponent } from '@morjs/core'
-
-wPageToComponent(pageOptions, features)
-```
-
-## createPlugin(options)
-
-插件构造函数
-
-- `options`: 插件选项
-- `options.getApp`: 插件使用的 getApp 构造函数
-
-```typescript
-import { createPlugin } from '@morjs/core'
-
-const plugin = createPlugin(options)
-```
-
-## aPlugin(options)
-
-支付宝插件构造函数,用法和 createPlugin 一致
-
-```typescript
-import { aPlugin } from '@morjs/core'
-
-const plugin = aPlugin(options)
-```
-
-## wPlugin(options)
-
-微信插件构造函数,用法和 createPlugin 一致
-
-```typescript
-import { wPlugin } from '@morjs/core'
-
-const plugin = wPlugin(options)
-```
-
-## init(solution)
-
-初始化, 创建 $hooks 及应用 solutions
-
-- `solution`: solution 解决方案
-
-```typescript
-import { init } from '@morjs/core'
-
-const { $hooks, pluginsNames } = init(solution)
-```
diff --git a/website/docs/api/runtime-hooks.md b/website/docs/api/runtime-hooks.md
deleted file mode 100644
index 052b4bb3..00000000
--- a/website/docs/api/runtime-hooks.md
+++ /dev/null
@@ -1,172 +0,0 @@
-# Runtime Hooks
-
-## 介绍
-
-- 在插件的 `apply` 函数中,会得到一个 `morHooks` 对象,对象中会有下面的所有生命周期列表的 `hook`,插件可使用 `tap` 来注册对应的 `hook`,`tap` 接受两个参数:
- - `pluginName`: 插件名
- - `pluginHandle`: 插件逻辑
-- 若插件有设置参数 `IRuntimePluginXXXOptions`,请将 `options` 的 `interface` 给 `export` 出去,方便可能需要集成的使用方进行引用
-- 插件调用方不能保证 `apply` 函数里面的 `this` 指向,因此建议都 `class` 下面的方法都用箭头函数,避免 `this` 指向问题
-- `hook` 里面的监听函数必须用普通函数,因为在 hook 调用的时候会动态修改 this 指向,指向当前的 `app`、`page`、`component` 实例
-- `hook` 里面的监听函数带两个参数:
- - `this`: 可以指向当前的 `app`、`page`、`component` 实例
- - `options`: 可以拿到对应生命周期里面的参数
-
-## Hooks 列表
-
-```typescript
-import type { MorJSHooks, MorJSPlugin } from '@morjs/api'
-
-export interface IRuntimePluginXXXOptions {
- key: value
-}
-
-export default class RuntimePluginXXX implements MorJSPlugin {
- pluginName = 'RuntimePluginXXX'
- pluginOptions: IRuntimePluginXXXOptions
-
- constructor(options?: IRuntimePluginXXXOptions) {
- this.pluginOptions = {
- ...options
- }
- }
-
- apply = (morHooks: MorJSHooks): void => {
- /* App 相关 hooks */
- // appOnConstruct: 在应用初始化前执行,请注意不要进行长时间耗时的任务
- morHooks.appOnConstruct.tap(this.pluginName, function (this, options) {
- console.log('app 应用 onConstruct 生命周期,初始化前触发')
- })
-
- // appOnInit: 已废弃 出于兼容性暂不移除,请直接使用 appOnConstruct
- morHooks.appOnInit.tap(this.pluginName, function (this, options) {
- console.log('app 应用 onInit 生命周期,初始化阶段触发')
- })
-
- // appOnLaunch: 在 onLaunch 生命周期触发,建议一般组件在这个生命周期执行初始化
- morHooks.appOnLaunch.tap(this.pluginName, function (this, options) {
- console.log('app 应用 onLaunch 生命周期,初始化阶段完成时触发')
- })
-
- // appOnError: 在 App 的 onError 生命周期触发
- morHooks.appOnError.tap(this.pluginName, function (this, options) {
- console.log('app 应用 onError 生命周期,小程序发生 js 错误时触发')
- })
-
- // appOnShow: 在 App 的 onShow 生命周期触发
- morHooks.appOnShow.tap(this.pluginName, function (this, options) {
- console.log(
- 'app 应用 onShow 生命周期,当小程序启动,或从后台进入前台显示时触发'
- )
- })
-
- // appOnHide: 在 App 的 onHide 生命周期触发
- morHooks.appOnHide.tap(this.pluginName, function (this, options) {
- console.log(
- 'app 应用 onHide 生命周期,小程序被隐藏时触发,例如跳转、按下设备 Home 键离开等'
- )
- })
-
- // appOnPageNotFound: 在 App 的 onPageNotFound 被调用时触发
- morHooks.appOnPageNotFound.tap(this.pluginName, function (this, options) {
- console.log(
- 'app 应用 onPageNotFound 生命周期,小程序要打开的页面不存在时触发'
- )
- })
-
- // appOnUnhandledRejection: 在 App 的 onUnhandledRejection 被调用时触发
- morHooks.appOnUnhandledRejection.tap(
- this.pluginName,
- function (this, options) {
- console.log(
- 'app 应用 onUnhandledRejection 生命周期,当 Promise 被 reject 且没有 reject 处理器时触发'
- )
- }
- )
-
- /* Page 相关 hooks */
- // pageOnConstruct: 在页面初始化前执行,请注意这个生命周期会在应用启动后就立刻执行,并不是等用户切换到对应的页面才会执行
- morHooks.pageOnConstruct.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onConstruct 生命周期,初始化前触发')
- })
-
- // pageOnInit: 已废弃 出于兼容性暂不移除,请直接使用 pageOnConstruct
- morHooks.pageOnInit.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onInit 生命周期,初始化阶段触发')
- })
-
- // pageOnLoad: 在 Page 的 onLoad 生命周期触发
- morHooks.pageOnLoad.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onLoad 生命周期,页面加载时触发')
- })
-
- // pageOnReady: 在 Page 的 onReady 生命周期触发
- morHooks.pageOnReady.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onReady 生命周期,页面初次渲染完成时触发')
- })
-
- // pageOnShow: 在 Page 的 onShow 生命周期触发
- morHooks.pageOnShow.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onShow 生命周期,页面显示时触发')
- })
-
- // pageOnHide: 在 Page 的 onHide 生命周期触发
- morHooks.pageOnHide.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onHide 生命周期,页面隐藏时触发')
- })
-
- // pageOnUnload: 在 Page 的 onUnload 生命周期触发
- morHooks.pageOnUnload.tap(this.pluginName, function (this, options) {
- console.log('page 页面 onUnload 生命周期,页面卸载时触发')
- })
-
- /* Component 相关 hooks */
- // componentOnConstruct: 在 Component 创建前触发(组件注册的阶段)
- morHooks.componentOnConstruct.tap(
- this.pluginName,
- function (this, options) {
- console.log('component 组件 onConstruct 生命周期,注册阶段触发')
- }
- )
-
- // componentOnInit: 在 Component 的 onInit 生命周期触发
- morHooks.componentOnInit.tap(this.pluginName, function (this, options) {
- console.log('component 组件 onInit 生命周期,组件创建时触发')
- })
-
- // componentOnCreated: 在 Component 的 created 生命周期触发
- morHooks.componentOnCreated.tap(this.pluginName, function (this, options) {
- console.log('component 组件 created 生命周期,组件实例刚刚被创建时执行')
- })
-
- // componentDidMount: 在 Component 的 didMount 生命周期触发
- morHooks.componentDidMount.tap(this.pluginName, function (this, options) {
- console.log('component 组件 didMount 生命周期,组件创建完毕时触发')
- })
-
- // componentOnAttached: 在 Component 的 attached 生命周期触发
- morHooks.componentOnAttached.tap(this.pluginName, function (this, options) {
- console.log(
- 'component 组件 attached 生命周期,在组件实例进入页面节点树时执行'
- )
- })
-
- // componentDidUnmount: 在 Component 的 didUnmount 生命周期触发
- morHooks.componentDidUnmount.tap(this.pluginName, function (this, options) {
- console.log('component 组件 didUnmount 生命周期,组件删除时触发')
- })
-
- // componentOnDetached: 在 Component 的 detached 生命周期触发
- morHooks.componentOnDetached.tap(this.pluginName, function (this, options) {
- console.log(
- 'component 组件 detached 生命周期,在组件实例被从页面节点树移除时执行'
- )
- })
-
- // componentOnError: 在 Component 的 onError 生命周期触发
- morHooks.componentOnError.tap(this.pluginName, function (this, options) {
- console.log('component 组件 onError 生命周期,组件 JS 代码抛出错误时触发')
- })
- }
-}
-```
diff --git a/website/docs/api/takin.md b/website/docs/api/takin.md
deleted file mode 100644
index aa5b4ec8..00000000
--- a/website/docs/api/takin.md
+++ /dev/null
@@ -1,457 +0,0 @@
----
-title: Takin 介绍
----
-
-# Takin
-
-## 什么是 Takin
-
-`takin` 是一个用于开发复杂命令行工具的基础库,提供如下的能力:
-
-- 相对完善及灵活的插件机制
-- 支持多配置及多任务机制
-- 高度可扩展的插件生态
-- 可灵活新增、定制及扩展命令行
-- 友好的 `typescript` 类型支持
-- 不绑定打包工具, 如 webpack、vite 等
-- 支持通过 API 调用注册命令
-
-为什么开发这个工具而不是使用已有的 `build-scripts` ?
-
-在 MorJS 升级计划启动初期,的确曾仔细评估过是否要使用集团的 `build-scripts`, 毕竟其用户广泛、更加成熟且已经有了丰富的插件生态,但综合评估下来,由于种种限制因素,`build-scripts` 并不能很好的满足 MorJS 升级改造场景,如:
-
-- 写死的 `start|build|test` 命令且不支持扩展
-- 类型提示不友好, 如插件编写、用户配置等
-- 不支持扩展生命周期
-- 不支持自定义配置文件, 只能使用 build.json
-- 绑定了 webpack 且因为某些原因暂时只能使用 webpack 4
-- 不支持通过 API 调用已注册的命令
-- 日志输出不够优美
-
-所以,基于上述原因,我们开发了 `takin` 这个工具库,期望在满足 MorJS 本身架构诉求的基础上,能够进一步作为饿了么未来的命令行基础工具供各个团队使用和扩展。
-
-## 原理及流程介绍
-
-
-
-## 基本用法
-
-`takin` 内部仅仅内置了部分全局命令行选项,并未内置任何命令,全部功能可通过插件来实现。
-
-```bash
-内置全局命令选项:
-
- --cwd [cwd] 当前工作目录, 默认为 process.cwd()
- -c, --config [path] 指定自定义配置文件路径, 支持 .js, .ts, .json, .mjs 等类型, 如 takin.config.js
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (default: true)
- -h, --help 显示帮助信息
-```
-
-### 快速开发一个命令行工具
-
-下面我们将演示如何快速开发一个命令行工具 👇🏻
-
-```typescript
-/**
- * 0. 从安装 takin 作为依赖, 并新建一个 index.ts 开始
- * 执行命令: npm i takin --save
- * 执行命令: touch index.ts
- */
-
-/**
- * 1. 引入 takin 作为依赖
- */
-import * as takin from 'takin'
-
-/**
- * 2. 为自己的命令行取一个名字, 比如 MorJS 并导出
- */
-export const mor = takin.takin('mor')
-
-/**
- * 3. 编写你的第一个插件
- */
-class MyFirstTakinPlugin implements takin.Plugin {
- name = 'MyFirstTakinPlugin'
- apply(runner: takin.Runner) {
- runner.hooks.cli.tap(this.name, function (cli) {
- // 开启帮助信息显示
- cli.help()
-
- // 开启版本信息显示
- cli.version('1.0.0')
-
- // 注册命令
- cli
- .command('compile [srcPath]', '编译命令, 支持指定源码目录')
- .option('--output-path [outputPath]', '指定产物目录')
- .option('--production', '是否开启生产模式')
- // 注册命令行执行函数
- .action(function (command: takin.CommandOptions) {
- // 打印命令行相关信息
- console.log(command)
- })
- })
-
- // 注册用户配置
- runner.hooks.registerUserConfig.tap(this.name, function (schema, zod) {
- return schema.extend({
- mode: zod.nativeEnum(['production', 'development']).optional()
- })
- })
- }
-}
-
-/**
- * 4. 应用插件
- */
-mor.use([new MyFirstTakinPlugin()])
-
-/**
- * 5. 调用 `run` 命令启动
- */
-mor.run()
-```
-
-编译上述文件为 `index.js` 文件之后(也可以直接使用 javascript 来编写以避免编译), 即可尝试运行文件, 如:
-
-```
-#### 获取帮助信息
-❯ node index.js -h
-
-mor/1.0.0
-
-Usage:
- $ mor [options]
-
-Commands:
- compile [srcPath] 编译命令, 支持指定源码目录
-
-For more info, run any command with the `--help` flag:
- $ mor compile --help
-
-Options:
- --cwd [cwd] 当前工作目录, 默认为 process.cwd()
- -c, --config [path] 指定自定义配置文件路径, 支持 .js, .ts, .json, .mjs 等类型, 如 mor.config.js
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (default: true)
- -h, --help Display this message
- -v, --version Display version number
-
-
-
-
-#### 获取编译命令帮助信息
-❯ node index.js compile -h
-
-mor/1.0.0
-
-Usage:
- $ mor compile [srcPath]
-
-Options:
- --output-path [outputPath] 指定产物目录
- --production 是否开启生产模式
- --cwd [cwd] 当前工作目录, 默认为 process.cwd()
- -c, --config [path] 指定自定义配置文件路径, 支持 .js, .ts, .json, .mjs 等类型, 如 mor.config.js
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (default: true)
- -h, --help Display this message
-
-
-
-#### 执行编译命令
-❯ node index.js compile ./ --output-path ./dist --production
-{
- name: 'compile',
- args: [ './' ],
- options: {
- '--': [],
- autoloadPlugins: true,
- outputPath: './dist',
- production: true
- }
-}
-```
-
-### 配置 takin 功能
-
-#### 定制配置文件
-
-`takin` 支持定义配置文件名称和类型, 详细如下:
-
-```typescript
-import { takin } from 'takin'
-
-// 实例, 默认情况下在指定了名称之后
-// 即会自动开启对 mor.config.{ts/js/mjs/json} 等 4 中文件类型的配置支持
-const mor = takin('mor')
-
-// 也可以自定义新的配置文件名称, 如:
-// 增加支持 mor.config.* 和 alsc.mor.config.*
-// 配置后会优先读取 mor.config.* 如果未找到则尝试读取 alsc.mor.config.*
-mor.config.setSupportConfigFileNames(['mor.config', 'alsc.mor.config'])
-
-// 也可以自定义支持的文件类型
-// 目前支持设置 ".js"、".json"、".ts"、".mjs"
-// 如设置为仅支持 ts 或 js
-mor.config.supportConfigExtensions(['.ts', '.js'])
-```
-
-#### 多配置能力
-
-`takin` 支持一键开启多配置支持, 详细如下:
-
-```typescript
-import { takin } from 'takin'
-
-// 实例
-const mor = takin('mor')
-
-// 开启多配置支持, 并通过 `name` 来区分不同配置
-// 多配置支持示例: `[{ name: 'config-one' }, { name: 'config-two' }]`
-mor.config.enableMultipleConfig({ by: 'name' })
-
-// 关闭多配置支持
-mor.config.disableMultipleConfig()
-
-// 开启 package.json 配置支持
-// 即允许通过 `package.json` 文件中的 MorJS 字段来获取配置
-// 如: `{ mor: {} }`
-mor.config.enablePackageJsonConfig()
-
-// 关闭 package.json 配置支持
-mor.config.disablePackageJsonConfig()
-```
-
-## 接口及插件开发
-
-### 插件定义
-
-```typescript
-/**
- * 插件接口定义
- */
-interface Plugin {
- /**
- * 插件名称
- */
- name: string
- /**
- * 插件版本
- */
- version?: string
- /**
- * 插件执行顺序:
- * - `设置为 enforce: 'pre'` 的插件
- * - 通过 takin.config.usePlugins 传入的插件
- * - 普通插件
- * - 设置为 `enforce: 'post'` 的插件
- */
- enforce?: ObjectValues
- /**
- * 插件回调函数: 当插件通过 takin 实例的 use 方法载入时自动触发, 并传入当前命令行的实例
- */
- onUse?: (takin: Takin) => void
- /**
- * 执行 Runner 插件逻辑, 通过 Hooks 来干预不同的阶段
- */
- apply: (runner: Runner) => void
-}
-```
-
-### Hooks 支持
-
-`takin` 中插件的扩展能力主要通过对 `Hooks` 的调用来实现, 目前支持的 `Hooks` 如下:
-
-```typescript
-/**
- * 可通过 takin.hooks 来使用
- * 通过插件中 onUse 方法传入
- */
-interface TakinHooks {
- /**
- * 配置文件载入完成, 可在这个阶段修改整体配置
- * 如果配置通过 run 方法直接传入则该 hook 不会执行
- */
- configLoaded: AsyncSeriesHook<[Config, CommandOptions]>
- /**
- * 配置完成筛选, 可在这个阶段调整需要运行的用户配置
- */
- configFiltered: AsyncSeriesWaterfallHook<[UserConfig[], CommandOptions]>
-}
-
-/**
- * 可通过 runner.hooks 来使用
- * 通过插件中的 apply 方法传入
- */
-interface RunnerHooks {
- /**
- * 初始化, 当 runner 被初始化并完成插件加载之后运行
- */
- initialize: SyncHook
- /**
- * 构建命令行时运行
- */
- cli: SyncHook
- /**
- * 获取到匹配命令的阶段
- */
- matchedCommand: AsyncSeriesHook
- /**
- * 加载用户 config 阶段
- */
- loadConfig: AsyncSeriesHook
- /**
- * 修改用户配置
- */
- modifyUserConfig: AsyncSeriesWaterfallHook<[UserConfig, CommandOptions]>
- /**
- * 注册用户配置及校验 schema
- */
- registerUserConfig: AsyncSeriesWaterfallHook<[AnyZodObject, Zod]>
- /**
- * 是否需要运行后续逻辑
- * 执行的时机为 校验用户配置之前
- */
- shouldRun: SyncBailHook
- /**
- * 是否校验用户配置, 部分不使用配置的命令, 可使用该 hook 结合 runner 的上下文
- * 来选择是否跳过用户配置校验
- */
- shouldValidateUserConfig: SyncBailHook
- /**
- * 用户配置校验完成之后执行
- */
- userConfigValidated: AsyncSeriesHook
- /**
- * 开始 run 之前的 hook, 可用于准备一些运行命令需要的数据或内容
- */
- beforeRun: AsyncSeriesHook
- /**
- * 运行命令逻辑
- */
- run: HookMap>
- /**
- * runner 运行完成
- */
- done: AsyncParallelHook
- /**
- * runner 运行失败
- */
- failed: SyncHook
-}
-```
-
-### 如何扩展 Hooks
-
-`takin` 支持通过对 `TakinHooks` 或 `RunnerHooks` 类型定义进行扩展以及调用 `registerHooks` 方法注册工厂函数的方式对 takin 本身的 hooks 进行扩展,如:
-
-```typescript
-import { registerHooks, tapable as t } from 'takin'
-
-/**
- * 扩展 takin.RunnerHooks 中的 hook
- */
-declare module 'takin' {
- interface RunnerHooks {
- /**
- * Compile Hook: config(json) 文件解析 hook
- */
- configParser: t.AsyncSeriesWaterfallHook<
- [Record, FileParserOptions]
- >
-
- /**
- * Compile Hook: script(js/ts) 文件解析 hook
- */
- scriptParser: t.SyncWaterfallHook<[CustomTransformers, FileParserOptions]>
-
- /**
- * Compile Hook: template(*xml) 文件解析 hook
- */
- templateParser: t.AsyncSeriesWaterfallHook<
- [PosthtmlNode, FileParserOptions]
- >
-
- /**
- * Compile Hook: style(*css) 文件解析 hook
- */
- styleParser: t.AsyncSeriesWaterfallHook<
- [PostCssAcceptedPlugin[], FileParserOptions]
- >
-
- /**
- * Compile Hook: sjs(wxs/sjs) 文件解析 hook
- */
- sjsParser: t.SyncWaterfallHook<[CustomTransformers, FileParserOptions]>
-
- /**
- * Compile Hook: 文件预处理器 hook
- */
- preprocessorParser: t.AsyncSeriesWaterfallHook<
- [string, Record, FileParserOptions]
- >
-
- /**
- * Compile Hook: 文件后置处理器 hook
- */
- postprocessorParser: t.AsyncSeriesWaterfallHook<[string, FileParserOptions]>
- }
-}
-
-/**
- * 注册自定义 hook 工厂, 和上方的 RunnerHooks 扩展一一对应
- */
-registerHooks({
- configParser() {
- return new t.AsyncSeriesWaterfallHook(['config', 'options'])
- },
- scriptParser() {
- return new t.SyncWaterfallHook(['customTransformers', 'options'])
- },
- templateParser() {
- return new t.AsyncSeriesWaterfallHook(['tree', 'options'])
- },
- styleParser() {
- return new t.AsyncSeriesWaterfallHook(['postcssPlugins', 'options'])
- },
- sjsParser() {
- return new t.SyncWaterfallHook(['customTransformers', 'options'])
- },
- preprocessorParser() {
- return new t.AsyncSeriesWaterfallHook([
- 'fileContent',
- 'conditionalCompileContext',
- 'options'
- ])
- },
- postprocessorParser() {
- return new t.AsyncSeriesWaterfallHook(['fileContent', 'options'])
- }
-})
-```
-
-通过上述方法注入的 `Hooks` 扩展可在插件中直接使用, 如:
-
-```typescript
-import * as takin from 'takin'
-
-class MyTakinPlugin implements takin.Plugin {
- name = 'MyTakinPlugin'
- apply(runner: takin.Runner) {
- runner.hooks.configParser.tap(...)
- runner.hooks.scriptParser.tap(...)
- runner.hooks.templateParser.tap(...)
- runner.hooks.styleParser.tap(...)
- runner.hooks.sjsParser.tap(...)
- runner.hooks.preprocessorParser.tap(...)
- runner.hooks.postprocessorParser.tap(...)
- }
-}
-```
-
-### 接口
-
-参加文档: [Takin API](/api/engineering-takin.md)
diff --git a/website/docs/guides/README.md b/website/docs/guides/README.md
deleted file mode 100644
index 93d22700..00000000
--- a/website/docs/guides/README.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# MorJS 介绍
-
-
-
-## MorJS 是什么?
-
-Mor (发音为 /mɔːr/,类似 more) 是饿了么开发的**一款基于小程序 DSL 的,可扩展的多端研发框架**。使用小程序原生 DSL 构建,使用者只需书写一套(微信或支付宝)小程序,就可以通过 MorJS 的转端编译能力,将源码分别编译出可以在不同端(微信/支付宝/百度/字节/钉钉/快手/QQ/淘宝/Web…)运行的产物。
-
-MorJS 以多端编译为基础,配以面向全生命周期的插件体系,覆盖从源码到构建产物的每个阶段,支持各类功能扩展和业务需求,无论是基础的页面和组件还是复杂的分包和插件,MorJS 都可以胜任,帮助你高效地开发多端小程序。
-
-## 优势与核心能力
-
-MorJS 是一套基于小程序 DSL (支付宝或微信) 的框架。他的易用性、标准化和灵活性,使得开发者能更好地专注于业务,让开发成本,招聘、管理、测试各方面成本都大幅下降,提高开发者的工作效率。
-
-- ⭐️ **易用性**:
- - 💎 **DSL 支持**:可使用微信小程序 DSL 或 支付宝小程序 DSL 编写小程序,无额外使用成本;
- - 🌴 **多端支持**:支持将一套小程序转换为各类小程序平台及 Web 应用, 节省双倍人力;
- - 🚀 **快速接入**:仅需引入两个包,增加一个配置文件,即可简单快速接入到现有小程序项目;
-- 🌟 **标准化**:
- - 📦 **开箱即用**:内置了脚手架、构建、分析、多端编译等完整研发能力,仅需一个依赖即可上手开发;
- - 🌈 **表现一致**:通过编译时+运行时抹平多端差异性,让不同平台的小程序获得一致的用户体验;
- - 🖇 **形态转换**:支持同一个项目的不同的形态,允许小程序、分包、插件不同形态之间的相互转换;
-- ✨ **灵活性**:
- - 🎉 **方便扩展**:MorJS 将完备的生命周期和内部功能插件化,使用插件(集)以满足功能和垂直域的分层需求;
- - 📚 **类型支持**:除小程序标准文件类型外,还支持 ts、less/scss、jsonc/json5 等多种文件类型;
- - 🧰 **按需适配**:可根据需求选择性接入适配能力,小项目仅需编译功能,中等项目可结合编译和页面注入能力,大型项目推荐使用复杂小程序集成能力;
-
-## MorJS 的由来
-
-继 2017 年小程序诞生以来,由于其独特的商业模式和轻应用的用户体验,在移动社交电商等领域不断取得亮眼成绩。目前各大平台都相继推出了自己的小程序,饿了么 C 端业务需要在不同平台小程序进行投放,这些项目大多是以支付宝或微信原生 DSL 编写,面对业务渠道的不断增加,我们尝试了多种方法来兼容多端适配,但由于不同平台间小程序代码写法、能力支持的差异性逐步变大,过去的方案无法满足新业务的需求,我们需要一套跨端研发框架能解决以下诉求:
-
-- **原生 DSL 支持**,方便现有小程序 DSL 编写的存量业务使用;
-- **降低性能开销**,尽可能轻运行时,减少编译构建的时长;
-- **便捷的使用**,一键转换为支持各小程序平台使用的产物;
-- **拓展的功能**,提供针对大型复杂小程序的解耦方案;
-- **灵活的配置**,能够简单的增加修改多套不同端的项目配置;
-- **产物优化能力**,压缩构建产物体积,减少小程序包大小;
-
-在明确这几点后,我们调研了业界所有主流技术框架,发现并没有能完全满足我们需求的方案,所以我们决定自研 MorJS。
-
-## 什么时候不用 MorJS
-
-如你所见,MorJS 是一套基于小程序 DSL (支付宝、微信) 的框架,如果你,
-
-- 期望使用 React 或 Vue 的方式来编写小程序
-- 期望使用 Web 的方式开发
-- 有很强的 webpack 自定义需求和主观意愿
-- 需要以 微信小程序或支付宝小程序 DSL 以外的方式开发
-- 需要跑在 Node 14 以下的环境中
-
-MorJS 可能不适合你。
-
-## 项目使用情况
-
-截止目前,MorJS 支持 **3** 种编译形态(小程序、小程序插件、小程序分包),并支持 **9** 个目标平台的转换(微信、支付宝、百度、字节、快手、钉钉、手淘、QQ、Web),未来还将进一步扩展平台支持(如 鸿蒙、快应用等),支撑了饿了么 C 端多数业务在全渠道上的研发和投放。我们期望能把其中的技术细节、架构设计和技术思考呈现给大家,未来结合开源社区的共建和使用场景的扩展,来促进 Mor 框架能力进一步提升,以更好的为所有的小程序开发者服务。
-
-## MorJS 社区服务群
-
-如果在使用 MorJS 中遇到问题,钉钉扫码或搜索群号「`29445021084`」即可加入 👇
-
-
diff --git a/website/docs/guides/advance/complex-miniprogram-integration.md b/website/docs/guides/advance/complex-miniprogram-integration.md
deleted file mode 100644
index 6006f700..00000000
--- a/website/docs/guides/advance/complex-miniprogram-integration.md
+++ /dev/null
@@ -1,787 +0,0 @@
-# 复杂小程序集成
-
-## 背景
-
-从 2017 年微信小程序发布开始,随着小程序的逐步发展、迭代和大量功能的开发,小程序巨大化的问题越来越突出。虽然小程序平台方提供了分包、插件两种方式来帮助小程序开发者来实现代码和功能的解耦。然而在实际的实践中,随着同一个小程序中的不同的业务逐步拆分到不同的团队,以及分包、插件、NPM 包的大量使用,不同业务团队之间的接口调用问题、包大小的管理问题、最终的小程序产物合并问题等越来越突出,基于这个背景和需求,整合饿了么在大型小程序上的各类最佳实践和解决方案,从工程化的角度出发,我们推出了 **复杂小程序集成能力**。
-
-相关功能主要由 `@morjs/plugin-composer` 插件提供。
-
-## 动机
-
-多个独立的构建可以组成一个独立的小程序,这些独立构建之间不应该存在强依赖关系,因此可以独立开发、调试和部署。
-
-除宿主之外,分包、插件和模块并不要求一定要采用 `MorJS` 来编写,只要符合接入方式的规范,理论上采用任何小程序框架的小程序或原生小程序均可以进行独立开发和集成。
-
-_注:小程序、分包、插件的打包方式归属于编译,不在这里体现。_
-
-## 目标
-
-- 提供统一的集成研发方式和流程
-- 提供标准、可复用的集成产物规范
-- 为复杂小程序提供解耦工具和集成方法
-- 标准化小程序宿主、小程序插件、小程序分包、小程序模块之间的通信及能力注入方式
-- 提供统一的路由调用,方便多形态的小程序在多种环境下路由的一致性
-- 转 Web 之后,可基于微应用的方式进行组合(未实现)
-
-## 示意图
-
-
-
-## 概念
-
-### 集成
-
-将小程序宿主和相关子模块通过拉包、编译、构建、合并等一系列处理之后,合并为一个完整小程序的过程
-
-### 模块类型
-
-- **宿主**:小程序主体,拥有小程序完整的权限,有 `appId`,可使用插件和分包,并可为不同的插件和分包提供共享的数据和方法
-- **主包**:小程序分包的一种,每个小程序只有一个主包,用于放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本
-- **分包**:小程序分包,分为普通分包和独立分包,可申请小程序权限,使用体感接近于小程序宿主
-- **插件**:小程序插件,独立发布,嵌套在小程序宿主中使用,可被订阅使用,不可单独申请小程序权限
-
-### 集成模式
-
-- **组合模式**: 集成时的模块通过自定义的脚本完成编译,不经过 `MorJS` 编译处理,`MorJS` 仅会执行脚本以及操作模块产物
-- **编译模式**: 集成时的模块相关页面或组件会合并进入到 `MorJS` 的编译流程中,并与宿主产物一同输出
-
-### 集成状态
-
-集成过程中模块在不同阶段所处的状态,用于判断模块是否需要执行当前操作,初始状态为 **0**,最终状态为 **6**,详细状态及含义如下:
-
-- **0**:初始状态
-- **1**:模块已下载
-- **2**:模块前置脚本已执行
-- **3**:模块配置已载入
-- **4**:模块已完成编译或拷贝
-- **5**:模块后置脚本已执行
-- **6**:模块已集成
-
-### 下载类型
-
-集成过程中,用于将模块下载到指定位置的方式,可分为如下 5 种下载类型:
-
-- **npm**:通过 `NPM` 的方式下载,即模块以 `NPM` 包的方式发布和管理
-- **git**:通过 `Git` 的方式下载,即模块以 `Git` 仓库的方式发布和管理
-- **tar**:通过 `Tar` 压缩包的方式下载,即模块以某个存放在网络或 `CDN` 上的 `Tar` 资源形式存在
-- **link**:通过本地软链的方式下载,即模块存储在本地某个目录中,通过软链的形式,将模块链接到指定位置
-- **file**:通过本地目录拷贝的方式下载,即模块存储在本地某个目录中,通过拷贝整个目录的方式,将模块复制到指定位置
-
-### 集成脚本
-
-集成过程中,模块需要自定义执行的脚本命令,通常用于生成模块实际用于集成的产物:
-
-- **before**:前置脚本,单一模块成功下载后执行的脚本
-- **after**:后置脚本,单一模块已完成产物的拷贝或编译之后执行的脚本
-- **composed**:已集成脚本,所有模块完成集成后,集成流程结束前执行的脚本
-
-## 集成配置
-
-### 集成开启方式
-
-MorJS 的集成可在两种方式下使用,一种是**直接集成**,一种是**编译时自动集成**
-
-#### 直接集成
-
-通过 `mor compose` 命令控制,不涉及到编译流程,不处理 `mode` 为 `compile` 的模块,主要的功能是将宿主和各个分包合并在一起组合成一个完整的小程序。
-
-#### 编译时自动集成
-
-通过 `mor compile` 命令控制,涉及到编译流程,通常用于配合当前宿主或分包的线下研发。
-
-编译时 MorJS 支持通过两种方式开启集成,使用任何一种均可:
-
-1. 通过命令 `mor compile --compose` 中的 `--compose` 在编译时自动开启集成
-2. 通过在 MorJS 配置文件中添加 `{ compose: true }` 来自动开启集成
-
-#### 两者的主要区别
-
-`mor compile --compose` 可以认为是相当于先执行项目的编译 `mor compile`, 然后将当前项目作为宿主(`host`)或其中一个模块(`module`)进行集成 `mor compose`
-
-### 集成模块配置
-
-在 `mor.config.ts` 通过设置 `host: {}` 或 `modules: [{}]` 来配置宿主或子模块,如:
-
-> 有关 MorJS 配置的详细信息,参见:[配置说明](/guides/basic/config#%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E)
-
-```typescript
-export default defineConfig([
- {
- // 宿主配置
- host: {}
-
- // 子模块(如:分包等)
- modules: [{}]
- }
-])
-```
-
-上述示例中的 `host` 和 `modules` 的配置方式基本一致,其中 `host` 只能配置一个,`modules` 可以配置多个,详细的配置方式如下:
-
-```typescript
-{
- /**
- * 模块名称, 可选值, 默认会基于 `npm` 或 `git` 或 `tar` 或 `link` 或 `file` 配置自动生成
- */
- name: '',
-
- /**
- * 模块集成模式, 默认为 `compose`
- * - compose: 通过 compose 方式集成, 通过拷贝的方式复制到产物目录
- * - compile: 通过 compile 方式集成, 需要通过 mor 编译流程
- */
- mode: 'compose',
-
- /**
- * 模块类型, 默认为 `subpackage`
- * - 声明为 宿主(host) 的模块,模块中包含 app.json 并作为其他模块集成的目标,配置在 `host` 中的模块,该类型固定为 `host `
- * - 声明为 主包(main) 的模块,会将页面插入到小程序 app.json 的 pages 中
- * - 声明为 分包(subpackage) 的模块,会将页面插入到小程序 app.json 的 subPackages 中
- * - 声明为 插件(plugin) 的模块: 功能研发中
- */
- type: 'subpackage',
-
- /**
- * 下载配置
- *
- * npm / git / tar / link / file 均用于下载模块, 只需要配置一个即可
- *
- * 如果同时配置了多个,则只会有一个下载配置生效,优先级为:npm > git > tar > link > file
- */
- /* 通过 npm 配置模块下载 */
- // 字符串方式配置,如:
- npm: 'your_package@1.2.0',
- // 对象方式配置,如:
- npm: {
- // npm 名称
- name: 'your_package',
- // npm 版本, 默认为 `latest`
- version: '1.2.0'
- },
-
- /* 通过 git 仓库配置模块下载 */
- // 字符串方式配置,如:
- git: 'git@github.com:abc/cde.git#master'
- // 对象方式配置,如:
- // 注意: branch/tag/commit 的优先级为 commit > tag > branch, 相关字段均配置后,会按照优先级取用
- git: {
- // 仓库地址, 支持 git/http/https/ssh 协议链接
- url: 'git@github.com:abc/cde.git',
- // 分支配置, 默认为 HEAD
- branch: 'develop',
- // 标签配置
- tag: 'v1.1.0',
- // Git 提交 commit id
- commit: 'abcdefghijklmnopqrstuvwxyz',
- },
-
- /* 通过 tar 配置模块下载 */
- // 字符串方式配置,如:
- tar: 'https://your_domain.com/abc.tar.gz',
- // 对象方式配置,如:
- tar: {
- url: 'https://your_domain.com/abc.tar.gz',
- // 支持增加扩展参数, 参见 got 配置
- },
-
- /* 通过 link 配置(软链)模块下载 */
- // 字符串方式配置,如:
- link: '/Users/yourHomeDir/Workspace/yourCustomHostPath',
- // 对象方式配置,如:
- link: {
- path: '/Users/yourHomeDir/Workspace/yourCustomHostPath'
- },
-
- /* 通过 file 配置(复制)模块下载 */
- // 字符串方式配置,如:
- file: '/Users/yourHomeDir/Workspace/yourCustomHostPath',
- // 对象方式配置,如:
- file: {
- path: '/Users/yourHomeDir/Workspace/yourCustomHostPath'
- },
-
- // 构建产物目录配置, 默认为 `dist`
- // dist 配置的作用是告知 mor 当前模块的产物所存放的目录位置
- dist: 'dist',
-
- /**
- * 集成构建过程中可执行的脚本, 可选配置
- */
- scripts: {
- // 执行脚本时的公共环境变量, 可选配置
- // mor 默认会注入如下环境变量:
- // MOR_COMPOSER_MODULE_CWD: 当前模块工作目录
- // MOR_COMPOSER_MODULE_TYPE: 当前模块类型
- // MOR_COMPOSER_MODULE_HASH: 当前模块 hash 信息, 用于 mor 内部判断是否需要重新下载模块
- // MOR_COMPOSER_MODULE_ROOT: 当前模块根目录
- // MOR_COMPOSER_MODULE_SOURCE: 当前模块源码目录
- // MOR_COMPOSER_MODULE_OUTPUT_FROM: 当前模块原始产物目录
- // MOR_COMPOSER_MODULE_OUTPUT_TO: 当前模块集成产物目录
- env: {},
-
- // 模块编译或拷贝前执行脚本, 可选配置
- before: [
- // 可以直接以字符串的方式配置命令
- 'npm i',
-
- // 也可以以对象的方式配置
- {
- // 需要执行的命令
- command: 'cd some_dir && mor compile',
- // 该命令的自定义环境变量
- env: {
- CUSTOM_ENV: 'CUSTOM_ENV_VALUE'
- },
- // 该命令的选项, 参见 execa.command 的 options 配置
- options: {
- shell: true
- }
- },
- ],
-
- // 模块编译完成后或拷贝后执行脚本,配置方式同 before,可选配置
- after: [],
-
- // 所有模块完成集成之后执行脚本,配置方式同 before,可选配置
- composed: [],
-
- // 脚本执行公共选项, 参见 execa.command 的 options 配置
- options: {}
- },
-
- /**
- * 模块配置内容,参见下方集成产物规范的 [config].json 描述
- */
- config: undefined
-}
-```
-
-## 集成产物规范
-
-集成产物是指可用于参与到小程序集成的标准模块产物,具备以下特点:
-
-- 框架无关
-- 可复用
-- 自描述
-
-模块文件目录结构:
-
-```bash
-[module name] - 以模块名称命名的模块根目录,可以由模块配置的 `name` 指定或基于下载配置自动生成
-├── [hash] - 模块源码或产物所在目录, `hash` 是由模块配置中的 `git`/`npm`/`tar`/`dist`/`mode` 字段生成的 MD5 值,用于辅助判断是否需要重新下载模块
-│ ├── [dist?] - 模块产物所在目录,以 mor.compose.json 中的 output.from 指向目录为准
-│ │ └── [config].json - 模块产物配置文件,不同的模块类型的配置文件均不相同,与 mor.compose.json 文件的 config 字段作用相同
-└── mor.compose.json - 模块描述文件
-```
-
-### 集成产物临时目录
-
-MorJS 会将集成产物统一存放到项目根目录的 `.mor/composer` 临时目录中,其中宿主模块会统一放在 `.mor/composer/hosts` 目录中,子模块会统一放在 `.mor/composer/modules` 目录中。
-
-集成的宿主模块和各个子模块的状态都是独立维护的,比如某次执行集成命令:
-
-```bash
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┬──────┐
- │ 模块 (共 6 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │ 结果 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ miniprogram_host │ * │ 宿主 │ 编译 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ subpackage1 │ dev/1.0.0 │ 分包 │ 组合 │ ✖ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ subpackage2 │ feat/1.0.0 │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ subpackage3 │ feature/1.0.0 │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ subpackage4 │ dev/1.1.0 │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ subpackage5 │ feature/1.1.0 │ 分包 │ 组合 │ ✔ │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┴──────┘
-```
-
-上方集成的模块中,`subpackage1` 模块集成失败,可直接通过删除目录 `.mor/composer/modules/subpackage1` 后重新运行命令,也可以通过命令行
-
-```bash
-npx mor clean all
-```
-
-来清理 MorJS 的缓存目录 `node_modules/.cache/mor` 和临时文件目录 `.mor` 后,重新运行之前的集成命令。
-
-通常情况下,推荐只删除出问题的模块,这样当再次运行集成命令时,已完成集成的模块,会被跳过,可大大节约集成时间。
-
-### 模块描述文件 —— mor.compose.json
-
-模块描述文件的主要作用是:描述一个名为 `name` 状态为 `state` 的模块需要将自身的产物通过集成模式 `mode` 的方式从目录 `output.from` 集成到目录 `output.to` 中,并将配置 `config` 合并到小程序的 `app.json` 文件中。
-
-```javascript
-{
- // 模块名称,该名称和模块所在目录名称一致
- "name": "miniapp-subpackage-name",
- // 模块类型
- "type": "subpackage",
- // 集成模式
- "mode": "compose",
- // 模块 hash 目录,基于模块配置生成,用于确保当前模块内容的唯一性
- "hash": "dc66928b089d5e14b77bdbdb09f4b60a",
- // 模块所在目录
- "root": ".mor/composer/modules/miniapp-subpackage-name",
- // 模块源代码所在目录,通常用于结合脚本生成最终产物
- "source": ".mor/composer/modules/miniapp-subpackage-name/dc66928b089d5e14b77bdbdb09f4b60a",
- // 模块集成状态
- "state": 2,
- // 模块产物输出配置
- "output": {
- // 当前模块的产物所在目录
- "from": ".mor/composer/modules/miniapp-subpackage-name/dc66928b089d5e14b77bdbdb09f4b60a",
- // 需要将当前模块产物复制到的目标目录
- "to": "dist/subpackageName"
- },
- // 模块配置文件,作用同 app.json/plugin.json/subpackage.json
- "config": {
- "type": "main",
- "root": "subpackageName",
- "pages": [
- "pages/index/index"
- ]
- }
-}
-```
-
-### 模块产物配置文件 —— [config].json
-
-模块配置文件,不同类型的模块配置文件按照如下规则配置:
-
-- 宿主(`host`):使用 `app.json` 配置文件,该文件和小程序的 `app.json` 配置方式一致
-- 主包(`main`):使用 `subpackage.json` 配置文件,该文件和小程序的 `app.json` 的 `subpackages` 字段条目配置方式一致,区别在于扩展了 `"type": "main"` 用于标记当前模块为主包模块
-- 分包(`subpackage`):使用 `subpackage.json` 配置文件,该文件和小程序的 `app.json` 的 `subpackages` 字段条目配置方式一致
-- 插件(`plugin`):使用 `plugin.json` 配置文件,该文件和小程序插件的 `plugin.json` 配置方式一致
-
-模块配置示例
-
-```javascript
-/* 配置示例 */
-
-// 小程序 app.json 配置示例
-// 详细配置可参见微信小程序或支付宝小程序 app.json 配置
-{
- "pages": [
- "pages/todos/todos",
- "pages/add-todo/add-todo"
- ],
- // subpackages 或 subPackages 均可
- "subPackages": [
- {
- "root": "my",
- "pages": [
- "pages/profile/profile"
- ]
- }
- ]
-}
-
-// 小程序插件 plugin.json 配置示例
-// 详细配置可参见微信小程序或支付宝小程序 plugin.json 配置
-{
- "publicComponents": {
- "list": "components/list/list"
- },
- "publicPages": {
- "hello-page": "pages/index/index"
- },
- "pages": [
- "pages/index/index",
- "pages/another/index"
- ],
- // 插件导出的模块文件
- "main": "index.js"
-}
-
-// 小程序分包 subpackage.json 配置示例
-// 配置方式同 app.json 中的 subpackages 的单个分包配置方式一致
-{
- // type 字段为 mor 独有, 用于标识该分包为 "subpackage" 或 "main"
- // 区别是: 集成时 "subpackage" 类型的分包会被自动合并到 app.json 的 subpackages 字段中
- // "main" 类型的分包会被自动合并到 app.json 的 pages 字段中 (即: 合并至主包)
- "type": "subpackage",
- // root 字段将影响集成时分包产物合并至宿主小程序时的根目录
- "root": "my",
- // 注意: 编译分包以 pages 作为实际路径进行解析
- "pages": [
- "pages/profile/profile"
- ]
-}
-```
-
-### 实际模块示例
-
-```bash
-miniapp-subpackage-name
-├── dc66928b089d5e14b77bdbdb09f4b60a
-│ ├── dist
-│ │ ├── components
-│ │ ├── pages
-│ │ │ └── index
-│ │ │ ├── index.js
-│ │ │ ├── index.json
-│ │ │ ├── index.wxml
-│ │ │ └── index.wxss
-│ │ └── subpackage.json
-└── mor.compose.json
-```
-
-## 用法举例
-
-这里会简单列举三种集成研发模式,来帮助大家理解集成的具体作用和使用方法。
-
-### 主/子分包研发模式
-
-业务可基于业务对小程序中的分包进行拆分,以达到各个业务相互解耦,独立迭代的目的,参见下方分包配置示例:
-
-```typescript
-import { defineConfig, takin } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'tt',
- sourceType: 'alipay',
- target: 'bytedance',
- modules: [
- // 主入口包
- {
- name: 'miniapp-entry',
- git: {
- url: 'git@github.com:abc/miniapp-entry.git',
- branch: 'dev/1.0.0'
- },
- scripts: {
- before: ['npm i', 'npm run build:dy']
- },
- dist: 'dist/dy'
- },
-
- // 搜索分包
- {
- git: {
- url: 'git@github.com:abc/eleme-miniapp-plugin-search.git',
- branch: 'feat/upgrade-to-mor-2'
- },
- scripts: {
- before: ['npm i', 'cd plugin && npm i', 'mor compile --name dy']
- },
- dist: 'miniprogram_tt/dist'
- },
-
- // 红包分包
- {
- git: {
- url: 'git@github.com:abc/vouchers.git',
- branch: 'feature/dy'
- },
- scripts: {
- before: ['npm i', 'cd plugin && npm i', 'mor compile --name dy']
- },
- dist: 'dist/bytedance'
- },
-
- // 订单列表
- {
- git: {
- url: 'git@github.com:abc/miniapp-plugin-orderlist.git',
- branch: 'dev/dy/10.12.5'
- },
- scripts: {
- before: ['npm i', 'npm run build:dy']
- },
- dist: 'build/_bytedance'
- },
-
- // 平台(地址管理)
- {
- git: {
- url: 'git@github.com:abc/king-home-alipay.git',
- branch: 'feature/dy'
- },
- scripts: {
- before: ['npm i', 'mor compile --name douyin_subpackage']
- },
- dist: 'dist'
- }
- ]
- }
-])
-```
-
-通过 `MorJS` 命令:`mor compile --compose` 即可集成上述配置中宿主和相关的分包。
-
-运行结果示例:
-
-```bash
-[mor] ⚑ 当前 MorJS 为开源版本: @morjs/cli@1.0.0
-[mor] ℹ 发现配置文件: mor.config.ts
-[mor] ✔ 配置文件加载成功: mor.config.ts
-[mor] ℹ 小程序集成功能已开启
-[mor] ℹ 即将开始集成以下模块(最大并发数: 4):
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┐
- │ 模块 (共 6 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ miniprogram_host │ * │ 宿主 │ 编译 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ miniapp-entry │ dev/dy_10.12.5 │ 分包 │ 组合 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ eleme-ad_eleme-miniapp-plugin-search │ feat/upgrade-… │ 分包 │ 组合 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ mini-foundation_vouchers │ feature/dy │ 分包 │ 组合 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ eleme_miniapp-plugin-orderlist │ dev/dy/10.12.5 │ 分包 │ 组合 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ alsc-mini-app_king-home-alipay │ feature/dy │ 分包 │ 组合 │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┘
-[mor] ℹ 模块 eleme_miniapp-plugin-orderlist 前置脚本开始执行...
-[mor] ℹ 模块 eleme_miniapp-plugin-orderlist 执行命令: npm i
-[mor] ℹ 模块 alsc-mini-app_king-home-alipay 开始下载...
-[mor] ℹ 模块 eleme-ad_eleme-miniapp-plugin-search 前置脚本开始执行...
-[mor] ℹ 模块 eleme-ad_eleme-miniapp-plugin-search 执行命令: npm i
-[mor] ℹ 模块 mini-foundation_vouchers 前置脚本开始执行...
-[mor] ℹ 模块 mini-foundation_vouchers 执行命令: npm i
-[mor] ✔ 模块 alsc-mini-app_king-home-alipay 下载成功
-[mor] ℹ 模块 alsc-mini-app_king-home-alipay 前置脚本开始执行...
-[mor] ℹ 模块 alsc-mini-app_king-home-alipay 执行命令: npm i
-[mor] ℹ 模块 eleme_miniapp-plugin-orderlist 执行命令: npm run build:dy
-[mor] ✔ 模块 eleme_miniapp-plugin-orderlist 前置脚本执行成功, 耗时: 27.440s
-[mor] ℹ 模块 alsc-mini-app_king-home-alipay 执行命令: mor compile --name douyin_subpackage
-[mor] ✔ 模块 alsc-mini-app_king-home-alipay 前置脚本执行成功, 耗时: 70.623s
-[mor] ℹ 模块 mini-foundation_vouchers 执行命令: cd plugin && npm i
-[mor] ℹ 模块 mini-foundation_vouchers 执行命令: mor compile --name dy
-[mor] ℹ 模块 eleme-ad_eleme-miniapp-plugin-search 执行命令: cd plugin && npm i
-[mor] ✔ 模块 mini-foundation_vouchers 前置脚本执行成功, 耗时: 93.399s
-[mor] ℹ 模块 eleme-ad_eleme-miniapp-plugin-search 执行命令: mor compile --name dy
-[mor] ✔ 模块 eleme-ad_eleme-miniapp-plugin-search 前置脚本执行成功, 耗时: 115.475s
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: tt
- 编译目标: 字节小程序
- 编译环境: development
- 编译类型: 小程序
- 编译模式: bundle
- 源码类型: alipay
- 源码目录: src
- 输出目录: dist/bytedance
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 已开启 node_modules 组件处理
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 86.012583 ms
-[mor] ℹ 模块集成结果:
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┬──────┐
- │ 模块 (共 6 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │ 结果 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ miniprogram_host │ * │ 宿主 │ 编译 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ miniapp-entry │ dev/dy_10.12.5 │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ eleme-ad_eleme-miniapp-plugin-search │ feat/upgrade-… │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ mini-foundation_vouchers │ feature/dy │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ eleme_miniapp-plugin-orderlist │ dev/dy/10.12.5 │ 分包 │ 组合 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ alsc-mini-app_king-home-alipay │ feature/dy │ 分包 │ 组合 │ ✔ │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┴──────┘
-[mor] ✔ 集成产物目录: dist/bytedance
-[mor] ✔ 编译完成, 耗时: 127941.680666 ms
-```
-
-用小程序 IDE 打开 dist/bytedance 目录即可预览集成后的完整小程序。
-
-### SDK 研发模式
-
-业务可将通用页面封装置某个 `NPM` 包中作为通用功能,如统一宿主的 `Solution` 配置,参见下方示例:
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-export default defineConfig([
- {
- name: 'tt',
- target: 'bytedance',
- // 配置需要的 SDK
- modules: [
- {
- // 指定 npm 名称和版本
- npm: {
- name: 'mor-runtime-solution-standard-eleme',
- version: '1.0.4'
- },
- // 通过编译的模式参与集成
- mode: 'compile',
- // 作为主包模块进行集成
- type: 'main',
- // mor-runtime-solution-standard-eleme 包中的产物地址
- dist: './src',
- // 通过配置注入的页面内容:涉及 webview 和登录的页面和组件,由当前 solution 统一收口维护
- // 集成编译后,配置中的页面将会合并至 app.json 的 pages 字段中
- config: {
- pages: {
- 'pages/container/index': 'pages/container/index',
- 'pages/container-transnavbar/index':
- 'pages/container-transnavbar/index',
- 'pages/auth/index': 'pages/auth/index',
- 'pages/havana/index': 'pages/havana/index'
- }
- }
- }
- ]
- }
-])
-```
-
-通过 `MorJS` 命令:`mor compile --compose` 即可集成上述配置中的页面。
-
-运行结果示例:
-
-```bash
-[mor] ⚑ 当前 MorJS 为开源版本: @morjs/cli@1.0.0
-[mor] ℹ 发现配置文件: mor.config.ts
-[mor] ✔ 配置文件加载成功: mor.config.ts
-[mor] ℹ 小程序集成功能已开启
-[mor] ℹ 即将开始集成以下模块(最大并发数: 4):
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┐
- │ 模块 (共 2 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ miniprogram_host │ * │ 宿主 │ 编译 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ ali_mor-runtime-solution-standard-eleme_1_0… │ 1.0.4........ │ 主包 │ 编译 │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┘
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: tt
- 编译目标: 字节小程序
- 编译环境: development
- 编译类型: 小程序
- 编译模式: bundle
- 源码类型: alipay
- 源码目录: src
- 输出目录: dist/bytedance
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 已开启 node_modules 组件处理
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 1639.405709 ms
-[mor] ℹ 模块集成结果:
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┬──────┐
- │ 模块 (共 2 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │ 结果 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ miniprogram_host │ * │ 宿主 │ 编译 │ ✔ │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ ali_mor-runtime-solution-standard-eleme_1_0… │ 1.0.4........ │ 主包 │ 编译 │ ✔ │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┴──────┘
-[mor] ✔ 集成产物目录: dist/bytedance
-[mor] ✔ 编译完成, 耗时: 14175.584625 ms
-```
-
-### 小程序插件研发模式
-
-由于小程序插件无法独立运行,且对产物目录结构有特殊的要求,如:
-
-```bash
-dist
-├── miniprogram
-├── plugin
-└── mini.project.json
-```
-
-基于这种情况,我们可以利用 `MorJS` 的集成功能,来实现插件研发,参考配置如下:
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'alipay_plugin',
- sourceType: 'alipay',
- target: 'alipay',
- // 编译类型为 插件
- compileType: 'plugin',
- compileMode: 'bundle',
- // 配置插件宿主
- host: {
- git: {
- url: 'git@github.com:abc/king-home-alipay.git',
- branch: 'master'
- },
- scripts: {
- before: ['npm i', 'npm run compile:ali']
- },
- dist: '_ali'
- },
- outputPath: 'dist',
- // 插件源码目录
- srcPath: 'plugin',
- autoClean: true
- }
-])
-```
-
-通过 `MorJS` 命令:`mor compile --name alipay_plugin --compose` 即可集成上述配置中的小程序插件及其宿主。
-
-运行结果示例:
-
-```bash
-[mor] ⚑ 当前 MorJS 为开源版本: @morjs/cli@1.0.0
-[mor] ℹ 发现配置文件: mor.config.ts
-[mor] ✔ 配置文件加载成功: mor.config.ts
-[mor] ℹ 小程序集成功能已开启
-[mor] ℹ 即将开始集成以下模块(最大并发数: 4):
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┐
- │ 模块 (共 1 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┤
- │ alsc-mini-app_king-home-alipay │ master │ 宿主 │ 组合 │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┘
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: alipay_plugin
- 编译目标: 支付宝小程序
- 编译环境: development
- 编译类型: 插件
- 编译模式: bundle
- 源码类型: alipay
- 源码目录: plugin
- 编译产物: dist/plugin
- 输出目录: dist
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 启动文件监听模式
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 12.790667 ms
-[mor] ⠼ 正在编译, 进度: 99.00%
-[mor] ℹ 模块集成结果:
-[mor] ℹ ┌──────────────────────────────────────────────┬────────────────┬──────┬──────┬──────┐
- │ 模块 (共 1 个, 集成终态: 已集成) │ 版本 │ 类型 │ 模式 │ 结果 │
- ├──────────────────────────────────────────────┼────────────────┼──────┼──────┼──────┤
- │ alsc-mini-app_king-home-alipay │ master │ 宿主 │ 组合 │ ✔ │
- └──────────────────────────────────────────────┴────────────────┴──────┴──────┴──────┘
-[mor] ✔ 集成产物目录: dist/miniprogram
-[mor] ✔ 编译完成, 耗时: 1544.04675 ms
-```
-
-用小程序 IDE 打开 dist 目录即可预览小程序插件。
-
-## 命令行说明
-
-除了通过 [配置](/guides/basic/config#集成相关配置) 的方式来使用集成能力之外,部分功能也可以结合命令行来使用,命令行的优先级高于用户配置,具体参见下方说明:
-
-```bash
-集成相关命令行用法:
- $ mor compose 或 mor compile --compose
-
-集成相关命令行选项:
- --with-modules 指定需要参与集成的模块, 基于模块的名称筛选, 支持 glob 模式,如需指定多个,可用逗号(,)分割,示例: --with-modules '*eleme-solution,*plugin-entry' 或 --with-modules '*eleme-solution,*plugin-entry'
- --without-modules 排除不需要集成的模块, 基于模块的名称筛选, 支持 glob 模式,用法和 --with-modules 类似
- --from-state 控制模块集成时的初始状态, 可选值: 0-6,每个状态码对应的含义参见文档内 `集成状态` 的描述
- --to-state 控制模块集成时的最终状态, 可选值: 0-6,每个状态码对应的含义参见文档内 `集成状态` 的描述
- --concurrency 控制模块集成时的并发数量,默认会基于本机 CPU 核数和内存 GB 数生成一个并发数量
- --combine-modules 合并模块配置(主要用于合并分包配置的页面到主包中),用于适配抖音小程序的流加载
-```
-
-## 集成流程定制
-
-`MorJS` 提供了若干 `Hooks` 用于支持工程插件定制集成流程。
-
-有关集成 `Hooks` 可参见文档:[工程 API - Hooks - 集成 Hooks](/api/engineering-hooks#集成-hooks)
-
-关于如何编写工程插件,可参见文档:[插件 - 如何开发插件 - 开发工程插件](/guides/basic/plugin#%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E6%8F%92%E4%BB%B6)
diff --git a/website/docs/guides/advance/learn-create-component-library.md b/website/docs/guides/advance/learn-create-component-library.md
deleted file mode 100644
index 1b8c17ca..00000000
--- a/website/docs/guides/advance/learn-create-component-library.md
+++ /dev/null
@@ -1,170 +0,0 @@
-# 五分钟教会你如何让小程序组件库支持多端
-
-## 背景
-
-上文 [《MorJS 使用社区组件库指南》](https://mor.eleme.io/guides/advance/use-community-component) 我们提到了 MorJS 能够支持在业务转端的同时,将业务所引用的社区组件库一同转端,而针对很多定制属性较强的项目,大多会自行维护一套组件库提供给多个项目使用,本文教会你如何让你的小程序组件库支持多端,与上文的区别在于:
-
-- 上文是将社区组件库作为源码的一部分,通过 MorJS 编译业务代码的同时,将 node_modules 中的组件也作为源码编译的一部分,生成能够在不同端运行的产物;
-- 本文是将小程序组件库单独编译,生成能够分别在不同端引入使用的组件进行发包,支持不同项目自行引用 npm 包,组件库与业务、框架解耦;
-
-## 已有组件库快速上手
-
-组件库转端需要使用 MorJS 提供的一码多端能力,总体流程为:
-
-项目接入 MorJS => 添加多端编译配置 => 配置脚本 => 编译构建生成产物 => 发包
-
-### 接入 MorJS
-
-在组件库项目中添加必要的依赖:
-
-```shell
-$ npm i @morjs/cli -D && npm i @morjs/core --save
-```
-
-### 添加配置文件
-
-在项目根目录下增加文件 mor.config.ts,修改需要编译的配置
-
-```typescript
-import { defineConfig, UserConfig } from '@morjs/cli'
-
-// 公共配置
-const CommonConfig: UserConfig = {
- sourceType: 'wechat', // 源码类型: 微信 DSL
- srcPath: './src/components', // 源码目录,指定组件库源代码所在的目录
- compileMode: 'default', // 编译模式,由于组件库不是完整项目,需使用转换模式编译
- autoInjectRuntime: {
- // 运行时自动注入配置
- api: 'minimal' // API 运行时抹平注入,使用最小替换将仅替换函数调用
- },
- compilerOptions: {
- // ts 编译配置
- esModuleInterop: false, // 开启 ES 模块互操作性,针对 ES Module 提供 Commonjs 兼容
- declaration: true, // 生成 (.d.ts) 文件
- target: 'ES5', // 输出的 ES 版本
- module: 'CommonJS' // 模块输出类型
- }
-}
-
-export default defineConfig([
- // 第一套配置: 微信 DSL 编译
- {
- ...CommonConfig,
- name: 'wx',
- target: 'wechat', // 编译目标: 微信
- outputPath: './miniprogram_dist/lib' // 输出产物目录
- },
- // 第二套配置: 微信转支付宝
- {
- ...CommonConfig,
- name: 'ali',
- target: 'alipay', // 编译目标: 支付宝
- outputPath: './alipay/lib' // 输出产物目录
- },
- // 第三套配置: 微信转抖音
- {
- ...CommonConfig,
- name: 'dy',
- target: 'bytedance', // 编译目标: 抖音
- outputPath: './bytedance/lib' // 输出产物目录
- },
- // 第四套配置: 微信转 Web
- {
- ...CommonConfig,
- name: 'web',
- target: 'web', // 编译目标: Web
- outputPath: './lib' // 输出产物目录
- }
-])
-```
-
-### 编译调试
-
-在项目目录终端下执行编译命令启动项目,即可构建生成对应的多端产物,分别用对应平台的 IDE 打开即可开发预览。
-
-你也可以针对不同端,在 package.json 中添加单端的编译命令和相关配置,在终端执行对应的编译命令生成单端的编译产物进行开发调试。
-
-相关文档可参考:[《MorJS 基础用法 - 命令行》](https://mor.eleme.io/guides/basic/cli)
-
-```json
-{
- "name": "my-component",
- "version": "1.0.0",
- "scripts": {
- "build": "mor compile --production", // 开启生产环境构建所有端
- "dev:wx": "mor compile --name wx", // 编译构建配置名为 wx 的产物
- "dev:ali": "mor compile --name ali --production", // 编译构建配置名为 ali 的产物
- "dev:dy": "mor compile --name dy --production" // 编译构建配置名为 dy 的产物
- }
-}
-```
-
-### 构建发包
-
-在项目目录终端执行打包构建命令编译项目,生成对应的多端产物,产物目录取决与配置文件各端的 outputPath 配置,该目录需要和 package.json 中多端适配输出目录一致。
-
-相关文档可参考:[《MorJS - 多端组件库规范》](https://mor.eleme.io/specifications/component)
-
-```json
-{
- "name": "my-component",
- "version": "1.0.0",
- // 缺省目录设置,未指定端的小程序组件文件会从该目录下获取,
- "main": "lib",
- // 微信小程序的入口配置
- "miniprogram": "miniprogram_dist",
- // 支付宝小程序的入口配置
- "alipay": "alipay",
- // 字节小程序的入口配置
- "bytedance": "bytedance",
- // 建议配置只输出组件内容目录
- "files": ["lib", "miniprogram_dist", "alipay", "bytedance"]
-}
-```
-
-修改 package.json 的包名 name 和版本号 version,运行 `npm publish` 进行发包。
-
-## 开始一个新组件库项目
-
-如果你还没有开始写组件库,想要重新开始一个新的多端组件库项目,欢迎你使用官方脚手架工具来创建新项目:
-
-1. 选定项目目录,并在目录终端执行以下任一命令:
-
-```shell
-$ npm init mor # npm 创建项目
-$ yarn create mor # yarn 创建项目
-$ pnpm create mor # pnpm 创建项目
-```
-
-2. 选择工程类型 MorJS 多端组件库,按照提示完成初始化操作
-
-```shell
-✔ 请选择工程类型 › MorJS 多端组件库
-✔ 请选择源码类型 › 微信小程序 DSL
-✔ 请输入 小程序 的名称 … my-components
-✔ 请输入 小程序 的描述 … my first components
-✔ 用户名 … yourUserName
-✔ 邮箱 … your@gmail.com
-✔ 请输入 Git 仓库地址 … https://github.com/yourUserName/myapp
-✔ 请选择 npm 客户端 › npm / pnpm / yarn
-…
-```
-
-3. 编译与调试,在终端运行 `tnpm run dev`,将生成的产物用各端对应的 IDE 打开进行预览调试
-
-4. 构建与发包,在终端运行 `tnpm run build`,生成对应各端的小程序产物,修改 package.json 的包名 name 和版本号 version,运行 `npm publish` 进行发包
-
-## Q&A
-
-- Q: 转端过程中,发现小程序的 JSAPI 转端后不兼容怎么办?
-- A: 修改 mor.config.ts 中的 autoInjectRuntime.api 配置,默认 minimal 时只做最小替换,设置为 true 或 enhanced 时,MorJS 会接管 JSAPI 调用并提供接口兼容支持
-
----
-
-- Q: 个别情况下,组件转端表现不一致该怎么办?
-- A: 各个小程序平台的兼容性问题,超出多端编译覆盖范围的,需要自行处理,可考虑使用条件编译进行分端兼容
-
----
-
-- Q: 组件库中使用的字体资源文件会被一同编译吗?
-- A: 会,Mor 编译时,针对业务的静态资源会全部拷过去,不依赖构建关系
diff --git a/website/docs/guides/advance/subpackage-volume-optimization.md b/website/docs/guides/advance/subpackage-volume-optimization.md
deleted file mode 100644
index 3bcbd7f9..00000000
--- a/website/docs/guides/advance/subpackage-volume-optimization.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# 主包体积优化
-
-## 背景
-
-互联网时代中人们对信息的需求逐渐趋向快捷化、方便化、效率化,为了适应快节奏的社会发展,小程序应运而生,作为快时代的产物,各平台小程序逐渐进入大众用户的视野,成为人们生活中不可或缺的一部分,不用安装 APP,不用记住网址,随用随取简单方便。
-
-小程序作为轻量级应用,为了保障顺畅运行,各平台对于小程序体积大小有着严格的规定,而随着业务需求的不断累积,通常小程序的体积也在不断增大,官方也推出了支持小程序分包加载功能,将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载,但是每个使用分包小程序必定含有一个主包。(关于主包分包的概念可参考文档:[复杂小程序集成-概念-模块类型](/guides/advance/complex-miniprogram-integration#%E6%A8%A1%E5%9D%97%E7%B1%BB%E5%9E%8B))
-
-以目前几个主流平台为例,支付宝、微信小程序都要求单个分包/主包大小不能超过 2M,所以对于优化小程序主包,降低小程序主包大小,成为大多数开发者都将面临的问题。
-
-## 动机
-
-主包中并非所有组件、文件都会被主包及多个分包使用,部分公共 js 代码、node_modules 代码和 npm 组件文件可能仅在某一个分包中使用,只要通过解析各文件依赖,建立分组关系,在编译时动态的将文件调配到不同分包中去,让分包自己的模块仅编译到自身路径内,仅分包间共享的模块才会进入主包,对于从未使用(引用)的代码或模块在编译时并不会一同打到产物中,以此用于优化主包体积。
-
-相比与主包需要尽可能压缩自身体积,分包显然自身容量有较大的余留,那么把各个分包依赖的内容直接编译到对应分包中去,可以最大化利用分包自身的容量大小,在主包中由于该依赖内容不再有相关使用(引用),根据文件依赖的分析,在编译时这些已被冗余到各个分包的依赖就不会被一同打到主包产物中,减小主包体积的同时提升分包利用率。
-
-## 目标
-
-- 建立完整的文件依赖关系树和各分包分组信息模型
-- 提供编译时的动态分组优化能力,动态调配不同分包文件
-- 为独立分分包编译提供完整的冗余编译方案
-
-## 概念
-
-### 模块依赖图
-
-1. 模块依赖图:主要用于 Entry 构建的依赖关系建立和动态分组,包含一个小程序主包 mainGroup、一个根模块 rootModule(用于形成带顶端的树状结构, 可减少循环次数及明确父类归属)、N 个普通 Module(随 Entry 分析及文件变化动态删减)、N 个普通 Group(用于各个分包)、N 个 无效的 Module(用于标记被变更或被删除的模块);
-2. 普通 Module:一个文件是一个 module,以文件的全路径作为 module 标识,包含 文件地址、依赖信息、被依赖信息 及 分组信息;
-3. 普通 Group:模块的分组信息,一个分包对应一个组,包含名称以及相关的模块;
-
-### 分包动态编译优化
-
-分包编译时动态优化,是在编译过程中,通过文件依赖树及分组关系,动态的将文件调配到不同分包中去,比如仅某一个分包使用的 npm 组件提取到自己分包中,以及 node_modules 自动提取到分包中等,分包间共享模块会进入主包,分包自己的模块会进入分包。
-
-### 独立分包冗余编译
-
-将分包依赖的内容直接编译到对应分包中去,不论这些依赖是否和已有的分包有重叠,也不管是不是主包的组件,都会以冗余的方式编译到每个分包中去,最大化利用分包自身容量大小。
-
-## 方案
-
-### 模块依赖图
-
-一个完整的项目,经过模块依赖图的分析,会给每个文件 Module 进行相关的依赖分析和分组,以文件的全路径作为唯一标识,分析构建其依赖图,对于各分包的文件分组到各自对应分包,对于主包文件若是被多个分包共享依赖则分组到主包,若是仅被某一个分包使用则会动态分组到该分包,而通过这些文件 Module 、分组 Group 等结构组成一张完整的模块依赖图,编译时通过各个文件的文件依赖树和分组关系,对应 entries 的文件信息进行编译产出产物。
-
-
-
-### 分包动态编译优化
-
-分包在执行编译的过程中,编译每个文件时会通过文件依赖树找到对应依赖及其文件信息,根据两者的分组关系,动态将公共 js 代码、node_modules 代码和 npm 组件文件调配到不同分包中去,生成该分包内的公共模块文件,而拆分出来的文件则因为在主包中不被任何其他模块依赖,将从主包编译中删除
-
-
-
-### 独立分包冗余编译
-
-将分包依赖的内容直接编译到对应分包中去,不论这些依赖是否和已有的分包有重叠,也不管是不是主包的组件,都会以冗余的方式编译到每个分包中去,最大化利用分包自身容量大小。
diff --git a/website/docs/guides/advance/unity-of-forms.md b/website/docs/guides/advance/unity-of-forms.md
deleted file mode 100644
index 13935351..00000000
--- a/website/docs/guides/advance/unity-of-forms.md
+++ /dev/null
@@ -1,489 +0,0 @@
-# 小程序形态一体化
-
-## 背景
-
-随着饿了么的业务场景和范围快速拓展,诞生了诸如:
-
-- 支付宝小程序作为分包接入微信小程序
-- 淘宝 / 支付宝插件作为分包接入微信小程序
-- 支付宝小程序作为插件接入淘宝小程序插件
-- 支付宝插件作为分包接入微信或抖音小程序
-
-等诉求,之前业务的做法是针对每个端,如微信、支付宝、淘宝、抖音,各自维护一套代码,但这样做不仅功能同步迭代周期很长,而且 BUG 较多,迭代维护困难,研发过程异常痛苦。
-
-为了解决这个问题,我们从工程化角度出发,期望能够在尽量减少业务代码修改的前提下,以同构的方式支持同一个项目以不同的形态(如小程序、小程序插件和小程序分包)投放在不同的渠道(微信、支付宝、淘宝、抖音等),因而诞生了小程序形态一体化的能力支持。
-
-## 能力概览
-
-支持小程序、小程序插件以及小程序分包之间的相互转换:
-
-- **小程序** ↔ **小程序分包**
-- **小程序** ↔ **小程序插件**
-- **小程序插件** ↔ **小程序分包**
-- **小程序插件** ↔ **小程序**
-- **小程序分包** ↔ **小程序插件**
-- **小程序分包** ↔ **小程序**
-
-形态转换示意图 👇🏻
-
-
-
-## 形态差异
-
-形态差异是指 **小程序**、**小程序分包**、**小程序插件** 三种不同形态的运行方式差异以及转换为其他形态之后产生的差异,具体如下:
-
-- **`getApp` 差异**
- - **小程序:** 可通过 `getApp()` 来获取全局 `App` 实例及实例上挂载的属性或方法
- - **小程序插件:** 无法调用 `getApp()`
- - **小程序分包:** 可通过 `getApp()` 来获取全局 `App` 实例及实例上挂载的属性或方法;但当通过小程序转换为分包后,分包自身原本调用的 `getApp` 将失效,并被替换为宿主小程序的 `getApp`
-- **`App 应用生命周期` 差异**
- - **小程序:** 应用会执行 `onLaunch`、`onShow`、`onHide` 等生命周期
- - **小程序插件:** 无应用生命周期
- - **小程序分包:** 无应用生命周期
-- **`全局样式`(如:`app.wxss` 或 `app.acss`)差异**
- - **小程序:** 可通过全局样式来声明全局样式
- - **小程序插件:** 无全局样式
- - **小程序分包:** 无全局样式
-- **`NPM` 使用限制**
- - **小程序:** 各个小程序平台支持和限制情况不一
- - **小程序插件:** 各个小程序平台支持和限制情况不一
- - **小程序分包:** 各个小程序平台支持和限制情况不一
-- **`MorJS 运行时插件/解决方案`使用差异**
- - **小程序:** 可正常使用
- - **小程序插件:** 因为无 `App` 无法使用
- - **小程序分包:** 因为无 `App` 无法使用
-- **接口调用限制**
- - **小程序:** 无限制
- - **小程序插件:** 存在大量的接口调用限制,如 [开发支付宝小程序插件](https://opendocs.alipay.com/mini/plugin/plugin-development) 或 [开发微信小程序插件](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/development.html)
- - **小程序分包:** 无限制
-- **路由差异**
- - **小程序:** 转换到其他形态后自身路由会发生变化
- - **小程序插件:** 转换到其他形态后自身路由会发生变化,跳转插件页面需要包含 `plugin://` 或 `dynamic-plugin://` 等前缀,小程序或分包则不需要
- - **小程序分包:** 转换到其他形态后自身路由会发生变化
-- **`getCurrentPages` 差异**
- - **小程序:** 无限制
- - **小程序插件:** 无法通过 `getCurrentPages` 获取到小程序的页面堆栈
- - **小程序分包:** 无限制
-- **页面或组件样式差异**
- - **小程序:** 无限制
- - **小程序插件:** 基本选择器只支持 ID 与 class 选择器,不支持标签、属性、通配符选择器
- - **小程序分包:** 无限制
-
-等等,相关形态差异可结合各个小程序平台查看,这里仅罗列常见的部分。
-
-## 解决方案
-
-### 适用范围
-
-MorJS 的形态一体化方案重点在于解决上述差异中业务难以自行适配的部分,如:
-
-- `getApp` 差异
-- `App 应用生命周期` 差异
-- `全局样式`(如:`app.wxss` 或 `app.acss`)差异
-- `NPM` 使用限制
-- `MorJS 运行时插件/解决方案`
-
-等。其他差异,建议业务自行兼容或基于 MorJS 的 [文件纬度条件编译](/guides/conditional-compile/file-level.md) 或 [代码纬度条件编译](/guides/conditional-compile/code-level.md) 来自行分端兼容。
-
-### 实现方案
-
-为了帮助大家更好的理解一体化方案的逻辑,这里会通过一些示例性的代码来解释下一体化背后的实现思路,实际的实现代码会复杂很多,有兴趣的同学可以直接看 MorJS 源码。
-
-#### 入口配置说明
-
-不同形态的入口文件可通过配置 `compileType` 来指定:
-
-- `miniprogram`: 以小程序的方式编译, 入口配置文件为 `app.json`
-- `plugin`: 以插件的方式编译, 入口配置文件为 `plugin.json`
-- `subpackage`: 以分包的方式编译, 入口配置文件为 `subpackage.json`
-
-有关 MorJS 配置文件说明可参见文档:[MorJS 基础 - 配置](/guides/basic/config#集成相关配置)
-
-入口文件配置示例如下:
-
-```javascript
-/* 配置示例 */
-
-// 小程序 app.json 配置示例
-// 详细配置可参见微信小程序或支付宝小程序 app.json 配置
-{
- "pages": [
- "pages/todos/todos",
- "pages/add-todo/add-todo"
- ],
- // subpackages 或 subPackages 均可
- "subPackages": [
- {
- "root": "my",
- "pages": [
- "pages/profile/profile"
- ]
- }
- ]
-}
-
-// 小程序插件 plugin.json 配置示例
-// 详细配置可参见微信小程序或支付宝小程序 plugin.json 配置
-{
- "publicComponents": {
- "list": "components/list/list"
- },
- "publicPages": {
- "hello-page": "pages/index/index"
- },
- "pages": [
- "pages/index/index",
- "pages/another/index"
- ],
- // 插件导出的模块文件
- "main": "index.js"
-}
-
-// 小程序分包 subpackage.json 配置示例
-// 配置方式同 app.json 中的 subpackages 的单个分包配置方式一致
-{
- // type 字段为 mor 独有, 用于标识该分包为 "subpackage" 或 "main"
- // 区别是: 集成时 "subpackage" 类型的分包会被自动合并到 app.json 的 subpackages 字段中
- // "main" 类型的分包会被自动合并到 app.json 的 pages 字段中 (即: 合并至主包)
- "type": "subpackage",
- // root 字段将影响集成时分包产物合并至宿主小程序时的根目录
- "root": "my",
- // 注意: 编译分包以 pages 作为实际路径进行解析
- "pages": [
- "pages/profile/profile"
- ]
-}
-```
-
-默认情况下不同 `compileType` 对应的入口配置文件会直接从 `srcPath` 和 `srcPaths` 所指定的源码目录中直接载入。
-
-如需要定制入口配置文件的路径可通过 [customEntries 配置](/guides/basic/config#customentries---自定义入口文件配置) 来自定义。
-
-#### 差异抹平思路
-
-##### 多形态下的 `getApp` 调用和 `App` 生命周期抹平
-
-通过在小程序插件和小程序分包模式下增加 `app.js` 入口文件的支持,并模拟 `App` 生命周期调用和为所有的页面和组件注入 `getApp` 方法来实现,具体可参见下图示例:
-
-
-
-##### 多形态下的全局样式支持(如 `app.acss` 或 `app.wxss`)
-
-小程序编译时通过自动将全局样式文件(`app.acss` 或 `app.wxss` 等)注入到每个页面和组件的样式文件中作为引用来实现对全局样式的兼容,具体可参见下图示例:
-
-
-
-##### `NPM` 组件库支持差异抹平
-
-基于 MorJS 本身提供的 `bundle` 模式,结合 [多端组件库规范](/specifications/component) 和 [JS 依赖库规范](/specifications/js) 来自动在编译的过程中,自动将小程序、小程序插件、小程序分包的 JS 依赖统一打包并将使用到的组件库自动提取到 `npm_components` 文件夹来规避不同形态下的依赖问题以及不同小程序平台本身的 NPM 支持差异问题,编译流程如下:
-
-
-
-## 配置示例
-
-业务可参考下方的配置示例来实现小程序形态一体化的配置。
-
-### 前置准备
-
-相关功能需要以下或更新版本的 MorJS 依赖,开始前请在项目中的 `package.json` 检查并设置。
-
-```bash
-npm i @morjs/cli@2 -D
-npm i @morjs/core@2 --save
-```
-
-### 小程序转分包
-
-#### 1、在项目根目录创建 `subpackage.json` 文件
-
-将需要转换为分包的页面填写进去,如:
-
-```json
-{
- "root": "takeout_delicious_food",
- "pages": ["index/index"]
-}
-```
-
-注意:当前需要业务方手动添加该文件,如果需要转换的小程序 `app.json` 已存在分包配置,需要将分包中的页面也添加至 `subpackage.json` 的 `pages` 中,注意页面路径为`分包名称+路径`,不要写错。
-
-#### 2、在 `mor.config.ts` 文件中增加分包编译配置
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- // ⭐️⭐️⭐️ 重点看这里:分包编译配置 ⭐️⭐️⭐️
- {
- // 编译名称,可随意修改
- name: 'wechat_subpackage',
- // 源码类型, 这里以支付宝小程序 DSL 为例
- sourceType: 'alipay',
- target: 'wechat',
- // 指定编译类型为分包!
- compileType: 'subpackage',
- // 分包只能使用 bundle 打包模式
- compileMode: 'bundle',
- // 如果分包需要使用宿主的 npm 依赖,且不希望该依赖参与打包
- // 可以在 externals 中指定 npm 包的名称,在项目中正常引用即可
- // 注意:微信环境下需要自行触发 构建 NPM 操作
- externals: []
- }
-])
-```
-
-完成以上配置后,即可执行对应的分包编译,编译完成后,将对应编译产物文件夹直接放到对应的宿主中即可。
-
-#### 3、接入注意事项
-
-- 分包的打包模式默认会查找 `mor.subpackage.app.js`,如果该文件不存在,则会直接使用 `app.js`,故小程序转分包如无特别需求可以不使用 `mor.subpackage.app.js`,如果配置了 `mor.subpackage.app.js` 则将使用该文件,并忽略 `app.js`。如果需要两个文件并存,那么可以考虑把公共逻辑抽象到一个单独文件中
-- 分包的打包方式,仅提供直接将完整小程序编译为可直接作为分包运行的文件夹,业务方接入到微信还有一些内容需要适配,差异无法全部抹平,具体参见文档:[《多端差异性总结》](/guides/compatibilities/alipay-to-wechat.md)
-- 小程序转分包后, `app.onLaunch` 会在首次打开分包页面时调用,`app.onShow` 以及其他方法如 `onError` 等 不会被调用,这块儿的差异需要业务方自行处理
-- 分包模式会对 `getApp` 方法进行兜底处理,分包模式下通过 `getApp` 调用获得的 `app` 为宿主和分包的混合产物,宿主的属性和方法可以通过 `app.$host` 获取,具体逻辑可以查看产物中的 `mor.subpackage.global.js` 文件
-- 分包模式下如果会将 app.acss 注入到各个页面和组件的样式中作为引用,原因为部分业务团队重度依赖全局样式
-- 业务中如有用到自有封装的 npm package,这部分需要自行确保多端支持
-- 如果需要使用宿主已提供的 npm package,可以将对应的包名添加到上述配置示例的 `externals` 中,然后在项目中正常引用即可。如项目中出现此类需求,建议抽象出来一个单独的 js 文件,可以通过文件或源代码纬度的条件编译来为不同端提供支持,避免造成对业务代码的污染
-- 风险点: 分包没有固定初始化入口,故为了能够正常初始化项目代码,编译时在每个页面和组件的 JS 文件顶部引入了初始化的文件,用于确保分包的初始化
-
-### 小程序转插件
-
-#### 1、在项目根目录创建 `plugin.json` 文件
-
-将需要转换为分包的页面填写进去(这里仅举例支付宝小程序的插件配置,微信略有区别,请自行查看各方文档:[支付宝插件](https://opendocs.alipay.com/mini/plugin/plugin-development) 或 [微信插件](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/development.html)),如:
-
-```json
-{
- "publicComponents": {
- "demo-component": "components/demo/index"
- },
- "publicPages": {
- "index-page": "pages/index/index"
- },
- "pages": ["pages/index/index"],
- "main": "index"
-}
-```
-
-注意:当前需要业务方手动添加该文件,如果需要转换的小程序 `app.json` 存在分包配置,需要将分包中的页面也添加至 `plugin.json` 的 `pages` 中,注意页面路径为`分包名称+路径`,不要写错,同时插件需要对外开放的页面需要填写到对应的 `publicPages` 中 。
-
-#### 2、在 `mor.config.ts` 文件中增加插件编译配置
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- // ⭐️⭐️⭐️ 重点看这里:分包编译配置 ⭐️⭐️⭐️
- {
- // 编译名称,可随意修改
- name: 'alipay_plugin',
- // 源码类型, 这里以支付宝小程序 DSL 为例
- sourceType: 'alipay',
- target: 'alipay'
- // 指定编译类型为插件!
- compileType: 'plugin',
- // 插件只能使用 bundle 打包模式
- compileMode: 'bundle',
- // 开启集成模式
- compose: true,
- host: {
- // miniprogram 为本地的小程序宿主
- // 可自行增加最简单的小程序宿主
- // 也可以使用 mor init 在该文件夹下生成
- file: './miniprogram',
- dist: '.'
- }
- },
-])
-```
-
-完成以上配置后,即可执行对应的插件编译,编译完成后,即可在对应的小程序开发者工具中进行调试。
-
-#### 3、配置 `index.js` 文件
-
-插件可以在 `index.js` 中输出能力,宿主在使用插件运行时插件的时候可以直接通过 `getApp().$plugin.instances.[插件名称]` 来访问到插件输出的能力。
-
-```typescript
-import { aPlugin } from '@morjs/core'
-
-class PluginEntry extends aPlugin {
- constructor() {
- // 必须要调用 super
- super({ getApp })
- }
-
- // 提供了一个方法 x 可以供宿主小程序调用
- x() {
- return 1
- }
-}
-
-export default new PluginEntry()
-```
-
-#### 4、配置已有的 `app.js` 或使用 `mor.plugin.app.js`
-
-插件工程默认会查找 `mor.plugin.app.js`,如果该文件不存在,则会直接使用 `app.js`,故小程序转插件如无特别需求可以不使用 `mor.plugin.app.js`
-
-如果配置了 `mor.plugin.app.js` 则将使用该文件,并忽略 `app.js`,如果需要两个文件并存,那么可以考虑把公共逻辑抽象到一个单独文件中
-
-```javascript
-import { aApp } from '@morjs/core'
-
-// 和普通小程序一样使用 mor 的运行时解决方案和插件
-import SolutionStandard from 'mor-runtime-solution-standard'
-
-// 需要加载插件化的运行时解决方案
-import SolutionPlugin from 'mor-runtime-solution-plugin'
-
-// 初始化app,里面的实例是 getApp 返回的实例
-aApp(
- {
- onLaunch() {
- console.log('plugin app onLaunch')
- },
- onShow() {
- console.log('plugin app onShow')
- },
- onHide() {
- console.log('plugin app onHide')
- }
- },
- [
- SolutionStandard({ exlog: { biz: 'a1.b2' } }),
- // 初始化 插件 solution
- SolutionPlugin({ type: 'plugin' })
- ]
-)
-```
-
-#### 5、宿主小程序如何对接插件工程?
-
-##### 如果是 MorJS 标准小程序宿主
-
-```javascript
-import { aApp } from '@morjs/core'
-
-// 引入插件 Solution
-import SolutionPlugin from 'mor-runtime-solution-plugin'
-
-aApp(
- {
- // 业务逻辑代码
- onLaunch(options) {
- // 初始化插件调用
- this.$plugin.init({
- plugins: [
- {
- // 插件名称,同 app.json 里面的插件配置名称一致
- name: 'myPlugin',
- // 如果是动态插件的话,需要传插件 id 和 version
- id: '',
- version: '',
- // 拓展给插件的方法和属性
- extend: {
- shopId: '123',
- login() {
- console.log('call $host login method')
- },
- getUserId() {
- return '456'
- }
- }
- }
- ]
- })
- }
- },
- [
- // 增加 插件初始化 Solution,并设置类型 type 为 host
- SolutionPlugin({ type: 'host' })
- ]
-)
-```
-
-##### 如果是普通小程序宿主
-
-```javascript
-import PluginSDK from 'mor-runtime-plugin-plugin-init/lib/sdk'
-
-App({
- // 业务逻辑代码
- onLaunch(options) {
- // 初始化 SDK
- this.$plugin = new PluginSDK({ $host: this })
-
- // 初始化插件调用
- this.$plugin.init({
- plugins: [
- {
- // 插件名称,同 app.json 里面的插件配置名称一致
- name: 'myPlugin',
- // 如果是动态插件的话,需要传插件 id 和 version
- id: '',
- version: '',
- // 拓展给插件的方法和属性
- extend: {
- shopId: '123',
- login() {
- console.log('call $host login method')
- },
- getUserId() {
- return '456'
- }
- }
- }
- ]
- })
- }
-})
-```
-
-#### 6、接入注意事项
-
-1. 小程序转插件的功能和 [MorJS 插件工程](https://yuque.antfin-inc.com/alsc-f2e/mor/plugin-usage) 基本一致,可以点击文档查看具体用法和限制
-2. 宿主需要接入插件 SDK 之后,才具备将宿主方法注入到插件的能力
-
-### 插件转分包
-
-#### 1、在项目根目录创建 `subpackage.json` 文件
-
-将插件的 `plugin.json` 转换为分包的配置,如:
-
-```json
-{
- "root": "takeout_delicious_food",
- "pages": ["index/index"]
-}
-```
-
-注意:当前需要业务方手动添加该文件,注意页面路径为`分包名称+路径`,不要写错。
-
-#### 2、在 `mor.config.ts` 文件中增加分包编译配置
-
-```typescript
-{
- // 编译名称,可随意修改
- name: 'wechat_subpackage',
- // 源码类型, 这里以支付宝小程序 DSL 为例
- sourceType: 'alipay',
- target: 'wechat'
- // 指定编译类型为分包!
- compileType: 'subpackage',
- // 分包只能使用 bundle 打包模式
- compileMode: 'bundle',
- // 如果分包需要使用宿主的 npm 依赖,且不希望该依赖参与打包
- // 可以在 externals 中指定 npm 包的名称,在项目中正常引用即可
- // 注意:微信环境下需要自行触发 构建 NPM 操作
- externals: []
- },
-```
-
-完成以上配置后,即可执行对应的分包编译,编译完成后,将对应编译产物文件夹直接放到对应的宿主中即可。
-
-### 其他情况
-
-剩余三种形态转换的配置方式由于和上述三种配置方式类似,这里不再赘述:
-
-- **分包转插件:** 可参考 [插件转分包](unity-of-forms#插件转分包),思路基本一致
-- **插件转小程序:** 本质上只需要增加 `app.json` 配置文件,修改或新增一套配置并将 `compileType` 指定为 `miniprogram` 即可
-- **分包转小程序:** 本质上只需要增加 `app.json` 配置文件,修改或新增一套配置并将 `compileType` 指定为 `miniprogram` 即可
diff --git a/website/docs/guides/advance/use-community-component.md b/website/docs/guides/advance/use-community-component.md
deleted file mode 100644
index 3ec53896..00000000
--- a/website/docs/guides/advance/use-community-component.md
+++ /dev/null
@@ -1,164 +0,0 @@
-# MorJS 使用社区组件库指南
-
-## 背景
-
-距离 MorJS 开源已经有一段时间了,随着使用人数的上升,较多开发者将现有小程序项目接入 MorJS 框架都会提出一个疑问,项目中除了开发同学写的原生业务代码外,很多项目还用到了第三方的组件库,这些社区组件库能够被一同转成其他小程序端么?
-
-答案是:可以,只要是(微信/支付宝)小程序原生开发的组件,理论上是可以一并转换的,使用方式上,需按照对应平台 npm 组件的规范 来使用,本次我们将分别对使用到社群中提及频率较高的 [Vant Weapp](https://github.com/youzan/vant-weapp)、[TDesign](https://github.com/Tencent/tdesign-miniprogram)、[Wux Weapp](https://github.com/wux-weapp/wux-weapp/) 的项目进行转端(如果你的项目选用的是其他组件库,也可以参考以下流程)
-
-## 一. 项目接入 MorJS
-
-使用 MorJS 提供的一码多端能力,自然需要用到 MorJS 本身,我们针对不同业务场景,提供了两种接入方式:
-
-- 新项目使用 create-mor 创建项目,文档参考:[《MorJS - 快速上手》](https://mor.eleme.io/guides/introduction/getting-started)
-- 已有项目添加必要依赖进行接入,文档参考:[《MorJS - 原生小程序接入》](https://mor.eleme.io/guides/migrate-from-original-miniprogram-to-mor)
-
-完成以上接入后,可在项目目录终端下执行编译命令启动项目 npm run dev,多端产物已构建在 dist 目录下,分别用对应平台的 IDE 打开即可开发预览。
-
-```
-.
-├── dist // 产物目录,可在 mor.config.* 中通过 outputPath 配置进行修改
-│ ├── alipay // 支付宝端产物,可在用支付宝 IDE 进行预览调试
-│ ├── wechat // 微信端产物,可在用微信 IDE 进行预览调试
-│ └── web // 转 web 产物,可在浏览器中进行预览调试
-├── node_modules // 安装 node 后用来存放用包管理工具下载安装的包的文件夹
-├── src // 源码目录,可在 mor.config.* 中通过 srcPath 配置进行修改
-├── mor.config.ts // MorJS 配置文件,用于提供多套编译配置
-└── package.json // 项目的基础配置文件
-```
-
-## 二. 项目接入社区组件库
-
-根据对应的社区组件库文档进行接入,如果你的项目选用的是其他组件库,也可以参考以下流程进行接入。
-
-请注意,项目所使用的组件库和项目的小程序 DSL 需要为同一套源码,例如选择使用微信 DSL 写的项目,引入的组件库需要是 for 微信小程序的组件库,支付宝 DSL 亦然。
-
-### 接入 [Vant Weapp](https://github.com/youzan/vant-weapp) 流程
-
-1. 安装:通过 npm 安装组件库 `npm i @vant/weapp -S --production`
-2. 配置:MorJS 工程默认配置下,可直接跳过这步
-
-- app.json 配置:小程序新版组件库与 [Vant Weapp](https://github.com/youzan/vant-weapp) 可能存在一定样式冲突问题,请根据业务需求及项目表现,自行决定是否需要去除新版基础组件样式,如需去除删除 app.json 文件的 `"style": "v2"` 配置项即可
-- project.config.json 配置:MorJS 默认的 bundle 模式无需修改此项配置
-- 构建 npm 包:MorJS 默认的 bundle 模式无需构建此项
-- typescript 支持:MorJS 本身支持 typescript,无需配置此项
-
-3. 使用:在对应的 json 文件中配置所用组件对应的路径,在 xml 中直接使用组件即可
-
-> 配置组件路径有两种方式:可以按照 组件库规范 来引用组件,或按照实际路径引用组件
-
-```json
-{
- "usingComponents": {
- "van-button": "@vant/weapp/button/index", // 按照规范引用 button 组件
- "van-popup": "@vant/weapp/lib/popup/index" // 按照实际路径引用 popup 组件
- }
-}
-```
-
-### 接入 [TDesign](https://github.com/Tencent/tdesign-miniprogram) 流程
-
-1. 安装:通过 npm 安装组件库 `npm i tdesign-miniprogram -S --production`
-2. 配置:MorJS 工程默认配置下,可直接跳过这步
-
-- app.json 配置:小程序新版组件库与 [TDesign](https://github.com/Tencent/tdesign-miniprogram) 可能存在一定样式冲突问题,请根据业务需求及项目表现,自行决定是否需要去除新版基础组件样式,如需去除删除 app.json 文件的 `"style": "v2"` 配置项即可
-- 构建 npm 包:MorJS 默认的 bundle 模式无需构建此项
-- typescript 支持:MorJS 本身支持 typescript,无需配置此项
-
-3. 使用:在对应的 json 文件中配置所用组件对应的路径,在 xml 中直接使用组件即可
-
-> 配置组件路径有两种方式:可以按照 组件库规范 来引用组件,或按照实际路径引用组件
-
-```json
-{
- "usingComponents": {
- "van-button": "tdesign-miniprogram/button/button", // 按照规范引用 button 组件
- "van-popup": "tdesign-miniprogram/miniprogram_dist/popup/popup" // 按照实际路径引用 popup 组件
- }
-}
-```
-
-### 接入 [Wux Weapp](https://github.com/wux-weapp/wux-weapp/) 流程
-
-1. 安装:通过 npm 安装组件库 `npm i wux-weapp -S --production`
-2. 配置:MorJS 工程默认配置下,无需进行 npm 构建或单独拷贝组件产物
-3. 使用:在对应的 json 文件中配置所用组件对应的路径,在 xml 中直接使用组件即可
-
-> 配置组件路径有两种方式:可以按照 组件库规范 来引用组件,或按照实际路径引用组件
-
-```json
-{
- "usingComponents": {
- "van-button": "wux-weapp/button/index", // 按照规范引用 button 组件
- "van-popup": "wux-weapp/packages/lib/popup/index" // 按照实际路径引用 popup 组件
- }
-}
-```
-
-## 三. 添加组件库转端配置
-
-接入社区组件库后,执行编译命令 npm run dev 启动项目会发现,仅本端的编译是正常执行的,转为其他端的编译会报类似 Can't resolve 'xxx' in 'xxx' 的错误,这是因为 MorJS 默认是不会在编译环节动态编译处理 node_modules 的 NPM 组件的,所以导致引入使用的组件无法载入,需要通过添加 mor.config.ts 中的 processNodeModules 配置,让编译环节处理 node_modules 中的组件
-
-相关文档可参考:[《MorJS 基础用法 - 配置 processNodeModules》](https://mor.eleme.io/guides/basic/config/#processnodemodules---%E6%98%AF%E5%90%A6%E5%A4%84%E7%90%86-node_modules)
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'wechat', // 源码类型: 微信 DSL
- target: 'alipay', // 编译目标: 支付宝小程序
- processNodeModules: {
- include: [
- /@vant\/weapp/, // 添加处理 @vant/weapp 组件
- /tdesign\-miniprogram/, // 添加处理 tdesign-miniprogram 组件
- /wux\-weapp/ // 添加处理符合 wux-weapp 组件
- ]
- }
- }
-])
-```
-
-> 之所以 MorJS 编译默认不处理 node_modules 的 NPM 组件,原因大致有以下几点:
-
-- 动态编译性能差:node_modules 里面文件繁多,需要所有文件都去判断是否需要进行编译处理,效率较低,会一定程度上影响编译效率;
-- 排查问题困难:动态转换会变成黑箱,使用方无法直接感知到转换过程中所做的处理;
-- 无法直接给原生小程序复用:组件在满足一定条件下,是可以同时给非 MorJS 的小程序工程使用的,如果采用动态编译就能且只能给 MorJS 工程使用;
-- 降低了组件提供方的自测责任:在 NPM 组件 输出时直接提供了编译后产物,能够要求 NPM 组件 做好对应测试,而不是依赖于 MorJS 动态编译来确保可用性;
-- …
-
-## 四. 编译调试
-
-在项目目录终端下执行编译命令启动项目,即可构建生成对应的多端产物,默认是放在项目 dist 目录下,分别用对应平台的 IDE 打开即可开发预览。
-
-你也可以针对不同端,在 package.json 中添加单端的编译命令和相关配置,在终端执行对应的编译命令生成单端的编译产物进行开发调试。
-
-相关文档可参考:[《MorJS 基础用法 - 命令行》](https://mor.eleme.io/guides/basic/cli)
-
-```json
-{
- "scripts": {
- "dev": "mor compile -w", // 编译构建所有端并开启文件变更监听
- "dev:ali": "mor compile --name ali", // 编译构建配置名为 ali 的产物
- "dev:wx": "mor compile --name wx", // 编译构建配置名为 wx 的产物
- "dev:dy": "mor compile --name dy", // 编译构建配置名为 dy 的产物
- "build": "mor compile --production" // 开启生产环境构建所有端
- }
-}
-```
-
-## Q&A
-
-- Q: 为什么 MorJS 接入组件库不需要执行 IDE 构建 npm 包?
-- A: 默认的 bundle 打包模式下,MorJS 会生成闭包并基于规则合并 js 文件,同时将小程序多端组件自动提取到产物对应的 npm_components 目录,但如果 compileMode 配置的是 transform 模式,会因为该编译模式下并不处理 node_modules 和多端组件,所以得走常规的微信构建 npm
-
----
-
-- Q: 为什么我按照规范(xxx/button/index)引用组件转其他端会报 Can't resolve 'xxx' in 'xxx' 的错误?
-- A: MorJS 是通过目录结构结合 package.json 的 [目录指向字段配置](https://mor.eleme.io/specifications/component#%E7%9B%AE%E5%BD%95%E5%AD%97%E6%AE%B5%E9%85%8D%E7%BD%AE) 来实现的,若转端读取的字段入口对应目录下没有组件产物,编译引入组件时将报上述错误,可以把使用路径改为组件实际路径,或联系组件开发者补充 main 入口字段
-
----
-
-- Q: 社区组件库中使用的字体资源文件会被一同编译吗?
-- A: 不会,针对 node_modules 中的非预期文件类型不会进行处理,请把资源文件改为引用 cdn 资源
diff --git a/website/docs/guides/basic/cli.md b/website/docs/guides/basic/cli.md
deleted file mode 100644
index b3685ec2..00000000
--- a/website/docs/guides/basic/cli.md
+++ /dev/null
@@ -1,223 +0,0 @@
-# 命令行
-
-## 概览
-
-可通过 `mor -h` 查看帮助信息。
-
-命令说明: `[]` 代表可选参数, `<>` 代表必填参数
-
-```bash
-.__ __ ___ ____ ____ _ ___
-| \/ | / _ \ | _ \ / ___|| | |_ _|
-| |\/| || | | || |_) | | | | | | |
-| | | || |_| || _ < | |___ | |___ | |
-|_| |_| \___/ |_| \_\ \____||_____||___|
-
-用法:
- $ mor
-
-命令:
- 默认选项描述
- compile 编译小程序工程
- clean 清理 mor 清理缓存/临时目录
- compose 小程序集成功能
- generate [...args] 生成器, 命令别名 [g]
- init [projectDir] 初始化/创建 MorJS 项目、插件、脚手架等, 命令别名 [create]
- analyze 分析小程序相关 bundle 信息
-
-更多信息可通过 `--help` 选项,运行下方命令获取:
- $ mor --help
- $ mor compile --help
- $ mor clean --help
- $ mor compose --help
- $ mor generate --help
- $ mor init --help
- $ mor analyze --help
-
-选项:
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- -v, --version 显示版本信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
-
-## 编译命令 — `compile`
-
-可通过 `mor compile -h` 查看帮助信息。
-
-```bash
-用法:
- $ mor compile 编译命令
-
- 支持的小程序或应用类型 (target):
- alipay 支付宝小程序
- baidu 百度小程序
- bytedance 字节小程序
- dingding 钉钉小程序
- kuaishou 快手小程序
- qq QQ 小程序
- taobao 淘宝小程序
- web Web 应用
- wechat 微信小程序
-
-选项:
- --source-type 源码类型, 用于判断小程序页面或组件使用了哪种 DSL, 可选值为 wechat, alipay
- -t, --target 编译目标, 将当前的工程编译为目标小程序工程, 可选值为 alipay, wechat, baidu, bytedance, qq, taobao, dingding, kuaishou, web, eleme
- --compile-mode 编译模式, 将当前工程以指定的编译模式编译, 编译模式差异参见官方文档, 可选值为 bundle, transform, transfer, default
- --compile-type 编译形态, 将当前工程编译为指定形态, 可选值为 miniprogram, plugin, subpackage
- -d, --devtool [devtool] 开发工具, 控制是否生成, 以及如何生成 source map, 参见 https://webpack.js.org/configuration/devtool
- --no-devtool 关闭 devtool (默认: true)
- --mock 是否开启 mock 功能, --production 状态下会自动关闭 mock 功能
- --minimize 是否开启压缩, --production 状态下会自动开启 (默认: false)
- --js-minimizer [minimizer] JS 代码压缩器, 可选值为 terser, esbuild, swc
- --no-js-minimizer 关闭 JS 压缩 (默认: true)
- --css-minimizer [minimizer] CSS 代码压缩器, 默认为 esbuild, 可选值为 esbuild, csso, cssnano, cleancss, parcelcss
- --no-css-minimizer 关闭 CSS 压缩 (默认: true)
- --xml-minimizer XML 代码压缩器, 目前仅支持 html-terser
- --no-xml-minimizer 关闭 XML 压缩 (默认: true)
- --mode 开发模式, 设置开发模式, 可选值为 production, development, none
- --production 是否开启生产模式, 等同于 --mode production
- --auto-clean 是否自动清空输出目录, (默认: false)
- -w, --watch 是否开启监听模式, (默认: false)
- -s, --src-path 源代码根目录, 默认为 src
- -o, --output-path 编译产物输出目录, 不同的 target 会有默认的输出目录, 如 dist/wechat
- --ignore 忽略文件或目录, 各个配置中的 outputPath 会被自动添加到忽略目录
- --no-cache 是否关闭缓存 (默认: true)
- --cache 是否开启缓存, mode = development 下默认开启, mode = production 状态下默认关闭 (默认: null)
- --process-node-modules 是否自动处理 node_modules 中的多端组件库, 默认情况为 false, 开启后会自动处理 node_modules 中的文件的转端
- --global-object 全局对象配置, 不同的 target 会有默认的全局对象, 通常情况下无需设置
- --analyze 是否开启 bundle analyzer
- --no-progress 关闭进度显示 (默认: true)
- --emit-web-intermediate-assets 生成 web 转端中间产物 (方便调试)
- --compose 开启小程序集成功能
- --with-modules 指定需要参与集成的模块, 支持 glob 模式, 该配置需要开启集成后生效
- --without-modules 排除不需要集成的模块, 支持 glob 模式, 该配置需要开启集成后生效
- --from-state 控制模块集成时的初始状态, 可选值: 0-6, 该配置需要开启集成后生效
- --to-state 控制模块集成时的最终状态, 可选值: 0-6, 该配置需要开启集成后生效
- --concurrency 控制模块集成时的并发数量
- --combine-modules 合并模块配置 (主要用于合并分包配置的页面到主包中)
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
-
-## 清理命令 — `clean`
-
-可通过 `mor clean -h` 查看帮助信息。
-
-```bash
-用法:
- $ mor clean 清理缓存/临时目录
-
-选项:
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
-
-## 集成命令 — `compose`
-
-可通过 `mor compose -h` 查看帮助信息。
-
-```bash
-用法:
- $ mor compose
-
-选项:
- --with-modules 指定需要参与集成的模块, 支持 glob 模式, 该配置需要开启集成后生效
- --without-modules 排除不需要集成的模块, 支持 glob 模式, 该配置需要开启集成后生效
- --from-state 控制模块集成时的初始状态, 可选值: 0-6, 该配置需要开启集成后生效
- --to-state 控制模块集成时的最终状态, 可选值: 0-6, 该配置需要开启集成后生效
- --concurrency 控制模块集成时的并发数量
- --combine-modules 合并模块配置 (主要用于合并分包配置的页面到主包中)
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
-
-## 分析命令 — `analyze`
-
-可通过 `mor analyze -h` 查看帮助信息。
-
-```bash
-用法:
- $ mor analyze
-
-选项:
- --mode 依赖分析模式, 可选值为 server, static, json, disabled
- --host 依赖分析 HTTP 服务域名, 仅在 mode 为 server 时生效
- --port 依赖分析 HTTP 服务端口号, 仅在 mode 为 server 时生效
- --report-filename 生成报告文件的名称, 仅在 mode 为 static 时生效
- --report-title 生成报告文件的标题, 仅在 mode 为 static 时生效
- --default-sizes 分析报告中展示模块大小的定义方式, 可选值为 stat, parsed, gzip
- --open 浏览器中打开
- --no-open 不在浏览器中打开 (默认: true)
- --generate-stats-file 是否生成 stats 文件
- --stats-filename stats 文件名称
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
-
-## 脚手架命令 — `create` 或 `init`
-
-可通过 `mor generate -h` 查看帮助信息
-
-```bash
-用法:
- $ mor init [projectDir]
-
-选项:
- --template, -t 指定脚手架模版
- --no-custom 关闭初始化/创建功能定制 (默认: true)
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
-
-## 微生成器 — `generate` 或 `g`
-
-```bash
-用法:
- $ mor generate [...args]
-
-选项:
- --verbose 开启框架调试日志
- -h, --help 显示帮助信息
- --cwd 当前工作目录, 默认为 process.cwd()
- -c, --config 指定自定义配置文件路径, 支持 .ts, .js, .mjs, .json, .jsonc, .json5 等类型, 如 mor.config.ts
- --ignore-config 忽略或不自动载入用户配置文件
- --no-autoload-plugins 关闭自动载入插件功能 (默认: true)
- --name 指定配置名称, 如不指定则代表选择所有配置
- --plugins 指定需要运行的插件, 如: plugin1,plugin2
-```
diff --git a/website/docs/guides/basic/config.md b/website/docs/guides/basic/config.md
deleted file mode 100644
index 4eecd31c..00000000
--- a/website/docs/guides/basic/config.md
+++ /dev/null
@@ -1,1610 +0,0 @@
-# 配置
-
-为方便查找,以下配置项通过字母排序。
-
-## 配置说明
-
-### 配置文件
-
-MorJS 支持 6 种类型的配置文件:
-
-- `mor.config.ts`
-- `mor.config.js`
-- `mor.config.mjs`
-- `mor.config.json`
-- `mor.config.jsonc`
-- `mor.config.json5`
-
-会按照上方列出的文件的顺序依次查找,并自动读取找到的第一个配置文件。
-
-### 多配置支持
-
-MorJS 默认提供多配置支持,也就是可以在一个配置文件中设置多套编译配置,如:
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-// defineConfig 的作用仅仅是用于配置的类型提示, 无其他作用
-// 直接使用 export default [] 也是一样的
-// 数组中的每一套配置都是独立
-export default defineConfig([
- // 第一套配置
- {
- name: 'alipay',
- sourceType: 'alipay',
- target: 'alipay'
- },
-
- // 第二套配置
- {
- name: 'wechat',
- sourceType: 'alipay',
- target: 'wechat'
- },
-
- // 第三套配置
- {
- name: 'bytedance',
- sourceType: 'alipay',
- target: 'bytedance',
- alias: {}
- }
-])
-```
-
-不同配置内容以 `name` 属性作为区分。
-
-通过命令行执行任意子命令 (如 `compile`) 时可以通过指定 `--name` 选项来筛选具体需要执行哪套配置,如:
-
-```bash
-# 以下命令将仅会执行 mor.config.ts 文件中 name 为 alipay 的配置
-mor compile --name alipay
-
-# 以下命令将会依次执行 mor.config.ts 文件中 name 为 alipay 的配置,然后执行 name 为 wechat 的配置
-# 两种写法等价
-mor compile --name alipay,wechat
-mor compile --name alipay --name wechat
-
-# 不指定 --name 时, MorJS 将会依次执行 mor.config.ts 文件中的所有配置
-mor compile
-```
-
-## 编译相关配置
-
-### alias - 别名配置
-
-- Type: `object`
-- Default: `{}`
-
-配置别名,对 `import` 或 `require` 或 `usingComponents` 中引用的文件做别名映射,用以简化路径或引用替换。
-
-比如:
-
-```javascript
-{
- alias: {
- foo: '/tmp/to/foo',
- }
-}
-```
-
-然后代码里 `import 'foo'` 实际上会 `import '/tmp/to/foo'`。
-
-再比如:
-
-```javascript
-{
- alias: {
- Utilities: path.resolve(__dirname, 'src/utilities/'),
- Templates: path.resolve(__dirname, 'src/templates/'),
- }
-}
-```
-
-那么,原先在代码里面基于相对路径引用的文件
-
-```javascript
-import Utility from '../../utilities/utility'
-```
-
-就可以简化为
-
-```javascript
-import Utility from 'Utilities/utility'
-```
-
-一些使用上的小窍门:
-
-1、`alias` 的值最好使用绝对路径,尤其是指向依赖时,记得加 `require.resolve`,比如:
-
-```javascript
-// 不推荐 ⛔
-{
- alias: {
- foo: 'foo',
- }
-}
-
-// 推荐 ✅
-{
- alias: {
- foo: require.resolve('foo'),
- }
-}
-```
-
-2、如果不需要子路径也被映射,记得加 $ 后缀,比如:
-
-```javascript
-// import 'foo/bar' 会被映射到 import '/tmp/to/foo/bar'
-{
- alias: {
- foo: '/tmp/to/foo',
- }
-}
-
-// import 'foo/bar' 还是 import 'foo/bar',不会被修改
-{
- alias: {
- foo$: '/tmp/to/foo',
- }
-}
-```
-
-### analyzer - 包大小分析
-
-- Type: `object`
-- Default: `{}`
-
-包模块结构分析工具,可以看到项目各模块的大小,按需优化。通过 `mor compile --analyze` 或 `mor analyze` 开启,默认 server 端口号为 `8888`,更多配置如下:
-
-```js
-{
- // 配置具体含义见:https://github.com/webpack-contrib/webpack-bundle-analyzer
- analyzer: {
- analyzerMode: 'server',
- // 分析工具端口号
- analyzerPort: 8888,
- // 是否自动打开浏览器
- openAnalyzer: true,
- // 是否生成 stats 文件
- generateStatsFile: false,
- // stats 文件名称
- statsFilename: 'stats.json',
- // 日志级别
- logLevel: 'info',
- // 显示文件大小的类型, 默认为 `parsed`
- defaultSizes: 'parsed', // stat // gzip
- }
-}
-```
-
-### autoClean - 自动清理
-
-- 类型: `boolean`
-- 默认值: `false`
-
-是否自动清理产物目录(`outputPath` 所指向的目录)。
-
-自动清理仅会清理产物目录,可放心使用。
-
-**注意:** 开启集成模式时,使用 `autoClean` 会自动标记 `--from-state` 为 `2` 用于避免集成模块产物被清理后,不会自动拷贝到产物目录的问题,相关概念可参考:[《复杂小程序集成》](/guides/advance/complex-miniprogram-integration.md)
-
-### autoInjectRuntime - 运行时自动注入
-
-- 类型: `object` 或 `boolean`
-- 默认值: `true`
-
-是否自动注入 MorJS 多端转换运行时。
-
-```javascript
-/* 配置示例 */
-
-// 关闭所有运行时注入
-{
- autoInjectRuntime: false
-}
-
-// 开启所有运行时注入
-{
- autoInjectRuntime: true
-}
-
-// 开启或关闭部分运行时注入,详细配置
-{
- autoInjectRuntime: {
- // App 运行时注入, 编译时替换 App({}) 为 MorJS 的运行时
- app: true,
- // Page 运行时注入, 编译时替换 Page({}) 为 MorJS 的运行时
- page: true,
- // Component 运行时注入, 编译时替换 Component({}) 为 MorJS 的运行时
- component: true,
- // Behavior 运行时注入, 编译时替换 Behavior({}) 为 MorJS 的运行时
- behavior: true,
- // API 运行时抹平注入, 指定为 true 时默认为 `enhanced`, 可选值:
- // enhanced: 增强方式: MorJS 接管 API 调用并提供接口兼容支持
- // lite: 轻量级的方式: wx => my, 替换所有全局接口对象
- // minimal: 最小替换, 如 wx.abc() => my.abc(), 仅替换函数调用
- api: true
- }
-}
-```
-
-### cache - 缓存开关
-
-- 类型: `boolean`
-- 默认值: 非生产环境下默认开启 `true`
-
-是否开启编译缓存。
-
-开启缓存后,假如某些情况下出现:文件进行了修改,但未正确触发更新的问题,可通过执行
-
-```bash
-npx mor clean cache
-```
-
-命令来清理缓存,有关 `clean` 命令的支持,参见:[清理命令——clean](/guides/basic/cli#清理命令--clean)
-
-### compileMode - 编译模式
-
-- 类型: `string`
-- 默认值: `bundle`
-- 可选值:
- - `bundle`: 打包模式, 会生成闭包以及基于规则合并 `js` 文件,并会将小程序多端组件提取到 `npm_components` 目录中
- - `transform`: 转换模式, 不生成闭包, 仅针对源码进行编译转换, 不处理 `node_modules` 和多端组件,部分注入能力失效
-
-编译模式, 用于配置当前项目的编译模式。
-
-**注意: 原 `default` 和 `transfer` 模式已合并为 `transform` 模式**
-
-### compilerOptions - 编译配置
-
-- 类型: `object`
-- 默认值: {}
-
-ts 编译配置, 大部分和 tsconfig 中的含义一致, 优先级高于 tsconfig.json 中的设定。
-
-```javascript
-// 仅支持以下配置项
-{
- compilerOptions: {
- // 是否允许合成默认导入
- allowSyntheticDefaultImports: false,
-
- // 用于自动矫正 commonjs 和 esm 混用的情况
- // 仅当 module 不是 commonjs 且 importHelpers 开启时生效
- // 原因为: typescript 引入 importHelpers 的时候会根据 设定的 module 来决定
- // 是用 esm 还是 commonjs 语法
- // 可能会导致 esm 和 commonjs 混用而引起编译问题
- autoCorrectModuleKind: undefined,
-
- // 是否生成 declaration (.d.ts) 文件
- // 仅 compileMode 为 default 情况下支持
- declaration: false,
-
- // 是否开启 ES 模块互操作性
- // 针对 ES Module 提供 Commonjs 兼容
- esModuleInterop: false,
-
- // 是否引入 tslib
- // 需要依赖中包含 tslib: "^2.3.1"
- importHelpers: true,
-
- // 模块输出类型
- // 不同的小程序 target 会有不同的默认值
- // alipay: ESNext
- // baidu: CommonJS
- // bytedance: CommonJS
- // dingding: ESNext
- // kuaishou: CommonJS
- // qq: CommonJS
- // taobao: ESNext
- // web: ESNext
- // wechat: CommonJS
- module: '',
-
- // 输出的 ES 版本
- // 不同的小程序 target 会有不同的默认值
- // alipay: ES2015
- // baidu: ES5
- // bytedance: ES5
- // dingding: ES2015
- // kuaishou: ES5
- // qq: ES5
- // taobao: ES2015
- // web: ES2015
- // wechat: ES5
- target: ''
- }
-}
-```
-
-### compileType - 编译类型
-
-- 类型: `string`
-- 默认值: `miniprogram`
-- 可选值:
- - `miniprogram`: 以小程序的方式编译,入口配置文件为 `app.json`
- - `plugin`: 以插件的方式编译,入口配置文件为 `plugin.json`
- - `subpackage`: 以分包的方式编译,入口配置文件为 `subpackage.json`
- - `component`: 以组件的方式编译,入口配置文件为 `component.json`
-
-编译类型,用于配置当前项目的产物形态,支持类型如下:
-
-- `miniprogram`: 小程序形态,以 `app.json` 作为入口配置文件
-- `plugin`: 小程序插件形态,以 `plugin.json` 作为入口配置文件
-- `subpackage`: 小程序分包形态,以 `subpackage.json` 作为入口配置文件
-- `component`: 小程序组件形态,以 `component.json` 作为入口配置文件
-
-同一个项目可通过不同的 `compileType` 配合不同的入口配置文件输出不同的产物形态,有关多形态相互转换的进一步解释,可参见文档:[小程序形态一体化](/guides/advance/unity-of-forms.md)。
-
-参考配置示例:
-
-```javascript
-/* 配置示例 */
-
-// 小程序 app.json 配置示例
-// 详细配置可参见微信小程序或支付宝小程序 app.json 配置
-{
- "pages": [
- "pages/todos/todos",
- "pages/add-todo/add-todo"
- ],
- // subpackages 或 subPackages 均可
- "subPackages": [
- {
- "root": "my",
- "pages": [
- "pages/profile/profile"
- ]
- }
- ]
-}
-
-// 小程序插件 plugin.json 配置示例
-// 详细配置可参见微信小程序或支付宝小程序 plugin.json 配置
-{
- "publicComponents": {
- "list": "components/list/list"
- },
- "publicPages": {
- "hello-page": "pages/index/index"
- },
- "pages": [
- "pages/index/index",
- "pages/another/index"
- ],
- // 插件导出的模块文件
- "main": "index.js"
-}
-
-// 小程序分包 subpackage.json 配置示例
-// 配置方式同 app.json 中的 subpackages 的单个分包配置方式一致
-{
- // type 字段为 MorJS 独有, 用于标识该分包为 "subpackage" 或 "main"
- // 区别是: 集成时 "subpackage" 类型的分包会被自动合并到 app.json 的 subpackages 字段中
- // "main" 类型的分包会被自动合并到 app.json 的 pages 字段中 (即: 合并至主包)
- "type": "subpackage",
- // root 字段将影响集成时分包产物合并至宿主小程序时的根目录
- "root": "my",
- // 注意: 编译分包以 pages 作为实际路径进行解析
- "pages": [
- "pages/profile/profile"
- ]
-}
-
-// 小程序组件 component.json 配置示例
-// publicComponents 和 main 字段为 MorJS 自定义字段
-{
- // publicComponents 记录组件列表,标识 bundle 模式下哪些组件需要被编译
- // publicComponents 有两种配置写法,写成数组时标识组件列表
- "publicComponents": [
- "components/banner/index",
- "components/image/index",
- "components/popup/index"
- ],
- // publicComponents 写成 { key: value } 对象时,将 value 的组件编译到 key 对应的产物目录下
- "publicComponents": {
- "morjs-banner/index": "components/banner/index",
- "morjs-image/index": "components/image/index",
- "morjs-popup/index": "components/popup/index"
- },
- // main 用于配置组件初始化文件
- "main": "index.js"
-}
-```
-
-默认情况下不同 `compileType` 对应的入口配置文件会直接从 `srcPath` 和 `srcPaths` 所指定的源码目录中直接载入。
-
-如需要定制入口配置文件的路径可通过 [customEntries 配置](/guides/basic/config#customentries---自定义入口文件配置) 来自定义。
-
-### conditionalCompile - 条件编译
-
-- 类型: `{ context: Record, fileExt: string | string[] }`
-- 默认值: `{}`
-
-条件编译配置。 详细参见: [代码纬度条件编译](/guides/conditional-compile/code-level.md) 和 [文件纬度条件编译](/guides/conditional-compile/file-level.md)
-
-### copy - 文件拷贝
-
-- 类型: `(string | { from: string, to: string })[]`
-- 默认值: `[]`
-
-设置要复制到输出目录的文件或文件夹,该配置受 [`ignore` 配置](/guides/basic/config#ignore---忽略配置) 影响
-
-默认情况下,MorJS 会自动拷贝如下后缀的文件:
-
-```bash
-# 以下资源文件会在编译过程中自动拷贝
-.jpg
-.jpeg
-.png
-.svg
-.bmp
-.ico
-.gif
-.webp
-.otf
-.ttf
-.woff
-.woff2
-.eot
-.cer
-.ogg
-.aac
-.mp4
-.wav
-.mp3
-.m4a
-.silk
-.wasm
-.br
-.cert
-```
-
-当配置为字符串时,默认拷贝到产物目录,如:
-
-```javascript
-{
- copy: ['foo.json', 'src/bar.json']
-}
-```
-
-会产生如下产物的目录结构:
-
-```bash
-+ dist
- - bar.json
- - foo.json
-+ src
- - bar.json
-- foo.json
-```
-
-当通过对象配置具体的拷贝位置,其中 `from` 相对路径的起点为项目根目录,目标 `to` 相对路径的起点为 [`outputPath`](/guides/basic/config#outputpath) 配置所指向的目录:
-
-```javascript
-{
- copy: [
- { from: 'from', to: 'somewhere/insideOutputPath' },
- { from: 'anotherFile.json', to: './' }
- ]
-}
-```
-
-这种情况下将产生如下产物目录结构:
-
-```bash
-+ dist
- + somewhere
- + insideOutputPath
- - onefile.json
- - anotherFile.json
-+ from
- - onefile.json
-- anotherFile.json
-```
-
-### cssMinimizer - CSS 压缩器
-
-- 类型: `string`
-- 默认值: `esbuild`
-- 可选值:
- - `cssnano`
- - `csso`
- - `cleanCss`
- - `esbuild`
- - `parcelcss`
- - `true` 或 `false`
-
-开关或指定 css 代码压缩器。
-
-### cssMinimizerOptions - CSS 压缩选项
-
-- 类型: `object`
-- 默认值: `{}`
-
-css 压缩器自定义配置, 使用时请结合 `cssMinimizer` 所指定的压缩器来配置, 不同的压缩器对应的配置方式不同,参见:
-
-- `cssnano`:
-- `csso`:
-- `cleanCss`:
-- `esbuild`:
-- `parcelcss`:
-
-`cssMinimizerOptions` 的配置会和 MorJS 内部的配置进行合并,且 `cssMinimizerOptions` 的优先级更高。
-
-**_使用 `esbuild` 压缩 `css` 注意事项: 👇🏻_**
-
-- `esbuild` 压缩器开启压缩时会默认将 `0.5rpx` 压缩为 `.5rpx` 的形式,而由于 `.5rpx` 的样式压缩写法在支付宝 IDE 中目前(2023.06.26) 不支持,需要使用完整的 `0.5rpx` 写法,后续支付宝 IDE 产研同学兼容后将自动修复,如遇到类似问题引发的样式显示错误,可添加以下配置以关闭 `minifySyntax` 进行兼容
-
-```javascript
-{
- ...otherConfigs,
- cssMinimizerOptions: {
- minify: false,
- minifyWhitespace: true,
- minifyIdentifiers: true,
- minifySyntax: false,
- legalComments: 'inline',
- },
-}
-```
-
-- 默认情况下 MorJS 配置的 `esbuild` 压缩 css 选项为 `target: ['safari10']`,该 target 下 `rgba(0,0,0,0)` 会被压缩为 16 进制的 `HexRGBA`,[参见 `ebuild` 源代码](https://github.com/evanw/esbuild/blob/main/internal/compat/css_table.go#L46),部分较老的浏览器下可能会不兼容,解决办法为指定 `target: ['safari9']` 来解决
-
-```javascript
-{
- ...otherConfigs,
- cssMinimizerOptions: {
- target: ['safari9']
- },
-}
-```
-
-### customEntries - 自定义入口文件配置
-
-- 类型: `object`
-- 默认值: `{}`
-
-用于配置自定义入口文件,包含三种用途:
-
-- 可用于指定入口配置文件的自定义文件路径,如 `app.json` / `plugin.json` / `subpackage.json` / `component.json`,参见 [compileType 配置](/guides/basic/config#compiletype---编译类型)
-- 可用于指定一些在 `bundle` 模式下额外需要参与编译且需要定制输出名称的文件,如对外输出某个 `js` 文件
-- `bundle` 模式下,无引用关系,但需要额外需要编译的 页面(`pages`) 或 组件(`components`)
-
-**_注意:该配置的文件路径,是相对于当前配置文件的路径,若配置文件不存在,则相对于当前工作区。_**
-
-用法举例:
-
-```javascript
-// 用途一: 通过配置 `app.json` / `plugin.json` / `subpackage.json` 来指定入口配置文件
-{
- customEntries: {
- // 手动指定 app.json 文件路径
- 'app.json': './src/my-custom-app.json',
- // 手动指定 plugin.json 文件路径
- 'plugin.json': './src/my-custom-plugin.json',
- // 手动指定 subpackage.json 文件路径
- 'subpackage.json': './src/my-custom-subpackage.json',
- // 手动指定 component.json 文件路径
- 'component.json': './src/my-custom-component.json',
- }
-}
-
-// 用途二:编译并对外输出某个类型的文件,其中脚本文件(如 .js/.ts/.mjs/.cjs 等)将按照 commonjs 的方式对外 export
-{
- customEntries: {
- // 该文件将会被输出到 [outputPath]/index.js 并通过 commonjs 的方式对外 export
- 'index.js': './src/index.js',
-
- // 该文件将被编译并输出到 [outputPath]/foo.sjs
- 'foo.sjs': './src/some-inner-dir/foo.sjs'
- }
-}
-
-// 用途三:bundle 模式下,无引用关系,但需要额外需要编译的 页面(pages) 或 组件(components)
-{
- customEntries: {
- // 额外需要编译的页面
- pages: [
- './src/any-custom-page/index'
- ],
- // 额外需要编译的组件
- components: [
- './src/any-custom-component/index'
- ]
- }
-}
-```
-
-### define - 变量替换
-
-- 类型: `object`
-- 默认值: `{}`
-
-允许在`编译时`将你代码中的变量替换为其他值或表达式。注意:属性值会经过一次 `JSON.stringify` 转换。
-
-比如,
-
-```javascript
-{
- define: {
- FOO: 'bar'
- }
-}
-```
-
-然后代码里的 `console.log(hello, FOO)` 会被编译成 `console.log(hello, 'bar')`。
-
-### devtool - SourceMap 配置
-
-- 类型: `string` 或 `boolean`
-- 默认值: 开发环境下默认为 `cheap-module-source-map`, 生产环境下默认为 `false`
-
-用户配置 sourcemap 类型。
-
-常见的可选类型有:
-
-- eval, 最快的类型,但不支持低版本浏览器和小程序运行环境
-- source-map, 最慢最全的类型
-
-更多类型详见 [webpack#devtool 配置](https://webpack.js.org/configuration/devtool/#devtool)。
-
-当 `devtool` 指定为 `true` 时:
-
-- 开发模式(`mode = development`)下会使用:`cheap-module-source-map`
-- 生产模式(`mode = production`)下会使用:`nosources-source-map`
-
-### experiments - 实验特性
-
-- 类型: `object`
-- 默认值: `{}`
-
-试验特性, 包含:
-
-- 自动裁剪辅助函数功能
-- CSS 类型压缩功能
-
-```javascript
-/* 配置示例 */
-{
- experiments: {
- // 开启自动裁剪辅助函数功能
- // 注意: 该功能需要项目依赖中包含 tslib 或 babel-helpers
- autoTrimRuntimeHelpers: true,
-
- // 开启 CSS 类型压缩功能
- // 详细配置如下,也可配置为 `true` 或 `false` 来开关该功能
- compressCssClassName: {
- // 压缩策略, 目前仅提供 `lite` 模式
- strategy: 'lite',
- // 压缩后 class 前缀,默认为 ''
- prefix: '',
- // 压缩后的 class 后缀,默认为 ''
- surfix: '',
- // 文件过滤的包含规则,默认为 []
- include: [],
- // 文件过滤排除规则,默认为 []
- exclude: [],
- // 一组不需要重命名的 class 名称,可以将不需要重命名的 class 放在这里
- except: [],
- // 用于生成随机类名的字母库, 默认见下方配置
- alphabet: '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
- // 自定义属性名称, 用于指定一些自定义的 class 名称,比如 innerClass 等
- // 配置的自定义class属性会被当做 class 同样被处理
- customAttributeNames: [],
- // 类名过滤, 支持配置自定义函数, 返回 true 代表可以重命名,false 代表不可以重命名: (className: string, filePath: string) => boolean
- classNameFilter: undefined,
- // 处理完成回调, 可获取 类名映射
- // (classNameMappings: Map) => void
- success: undefined
- }
- }
-}
-```
-
-### externals - 外部依赖
-
-- 类型: `string` 或 `object` 或 `function` 或 `RegExp` 或 `(string | object | function | RegExp)[]`
-- 默认值: `undefined`
-
-用于设置哪些模块可以不被打包。详细配置参见 [webpack#externals 配置](https://webpack.js.org/configuration/externals/)
-
-```javascript
-/* 配置示例 */
-{
- externals: ['tslib']
-}
-```
-
-### generateAppJSONScript - 生成 app.json 脚本文件
-
-- 类型: `boolean`
-- 默认值: `true`
-
-是否生成用于代替 `app.json` 的 `JavaScript` 脚本文件(`mor.p.js`),通常用于项目中直接引用 `app.json` 文件,并期望主包和分包集成后,能够被及时更新的场景。
-
-### globalNameSuffix - 全局文件名称后缀
-
-- 类型: `string`
-- 默认值: `''`
-
-用于配置产物中 MorJS 生成的全局文件的名称后缀以及产物中 [`chunkLoadingGlobal`](https://webpack.js.org/configuration/output/#outputchunkloadingglobal) 的名称后缀,用以规避分包、插件或组件产物因重名而导致的冲突。主要配合 `compileMode` 为 `bundle` 时使用。
-
-### globalObject - 全局对象
-
-- 类型: `string`
-- 默认值: 不同的 `target` 会有默认的全局对象, 通常情况下无需设置
-
-指定输出路径。
-
-各个 `target` 对应的默认 `globalObject` 分别为:
-
-- `alipay`: `my`
-- `baidu`: `swan`
-- `bytedance`: `tt`
-- `dingding`: `dd`
-- `eleme`: `my`
-- `kuaishou`: `ks`
-- `qq`: `qq`
-- `taobao`: `my`
-- `web`: `window`
-- `wechat`: `wx`
-
-### ignore - 忽略配置
-
-- 类型: `string[]`
-- 默认值: 忽略配置,支持 `glob patterns`
-
-配置文件或文件夹的忽略规则,主要使用场景为:
-
-- 忽略特定文件或文件夹的拷贝,参见 [`copy` 配置](/guides/basic/config#copy---文件拷贝)
-- 在 `compileMode` 为 `transform` 时忽略某些文件或文件夹的编译
-- 在 `watch` 监听模式下,忽略特定文件或文件夹的监听,被忽略的文件发生变更时将不会触发重新编译
-
-**注意:** 当 `compileMode` 为 `bundle` 时,由于所有需要编译的文件均是通过依赖分析获得,无法通过 `ignore` 来忽略,如果确实需要忽略某些文件或文件夹,建议是直接在源代码中移除引用来达到目的。
-
-可以通过配置路径的方式来忽略特定文件或文件夹:
-
-```javascript
-{
- ignore: [
- path.posix.resolve(__dirname, './src/ignored-dir')
- ],
-}
-```
-
-也可以通过 `glob patterns` 的方式来配置:
-
-```javascript
-{
- ignore: ['**/files/**/*.js', '**/node_modules']
-}
-```
-
-当使用 `glob patterns` 配置 `ignore` 的时候,MorJS 会使用 [`glob-to-regexp`](https://github.com/fitzgen/glob-to-regexp) 将其转换为正则表达式,请确保你已了解其转换方式、限制和原理。
-
-### jsMinimizer - JS 压缩器
-
-- 类型: `string` 或 `boolean`
-- 默认值: `null`
-- 可选值:
- - `terser`
- - `esbuild`
- - `swc`
- - `true` 或 `false`
-
-开关或指定 js 代码压缩器。
-
-默认值为 `null` 时会基于 `compilerOptions.target` 的值来自动选择压缩器:
-
-- 当 `compilerOptions.target` 的值是 `ES5` 时,`jsMinimizer` 为 `terser`
-- 当 `compilerOptions.target` 的值**不是** `ES5` 时,`jsMinimizer` 为 `esbuild`
-
-如果用户配置了 `jsMinimizer` 则以用户配置的为准。
-
-### jsMinimizerOptions - JS 压缩选项
-
-- 类型: `object`
-- 默认值: `{}`
-
-js 压缩器自定义配置, 使用时请结合 `jsMinimizer` 所指定的压缩器来配置, 不同的压缩器对应的配置方式不同,参见:
-
-- `esbuild`:
-- `terser`:
-- `swc`:
-
-`jsMinimizerOptions` 的配置会和 MorJS 内部的配置进行合并,且 `jsMinimizerOptions` 的优先级更高。
-
-### minimize - 压缩开关
-
-- 类型: `boolean`
-- 默认值: 生产环境下默认 为 `true`
-
-是否开启代码压缩,开启后,将会压缩脚本、样式、模版等文件,也可通过配置单独开关某类文件的压缩或选择不同的压缩器,参见:
-
-- [JS 压缩器](/guides/basic/config.md#jsminimizer---js-压缩器)
-- [CSS 压缩器](/guides/basic/config.md#cssminimizer---css-压缩器)
-- [XML 压缩器](/guides/basic/config.md#xmlminimizer---xml-压缩器)
-
-### mock - Mock 配置
-
-- 类型: `object`
-- 默认值: `{}`
-
-使用命令行选项 `--mock` 开启 `mock` 功能后,可通过 `mock` 修改 Mock 能力配置,详细配置及用法参见: [MorJS 基础 - Mock](/guides/basic/mock#mock-配置)。
-
-### mockAppEntry - 模拟 app 入口
-
-- 类型: `string`
-- 默认值: `app`
-
-主要用于在分包或插件编译类型时,指定不同的应用初始化文件名称(不含后缀名),需结合 `compileType` 使用:
-
-- 默认情况下均为 `app`,即使用源码中的 `app.js` 或 `app.ts`
-- `plugin` 编译类型下, 优先使用 `mor.plugin.app`
-- `subpackage` 编译类型下, 优先使用 `mor.subpackage.app`
-
-### mode - 模式
-
-- 类型: `string`
-- 默认值: `development`
-- 可选值:
- - `production`: 生产模式
- - `development`: 开发模式
- - `none`: 不指定
-
-构建模式,和 webpack 一致。
-
-当指定了命令行选项 `--production` 时,`mode` 将自动设置为 `production`。
-
-开启 `production` 生产模式后,会有如下默认行为:
-
-- 自动开启压缩支持,参见 [minimize - 压缩开关](/guides/basic/config.md#minimize---压缩开关)
-- 代码纬度条件编译的 `context` 将增加 `production: true` 配置,参见 [条件编译 - 代码纬度](/guides/conditional-compile/code-level.md)
-- `devtool` 为 `true` 的状态下,自动配置为 `nosources-source-map` 类型,参见:[devtool - SourceMap 配置](/guides/basic/config.md#devtool---sourcemap-配置)
-- 自动关闭 `mock` 功能,参见 [mock 配置](/guides/basic/config.md#mock---mock-配置)
-
-### outputPath - 输出产物目录
-
-- 类型: `string`
-- 默认值: 不同的 `target` 会有默认的输出目录
-
-指定输出路径。
-
-各个 `target` 对应的默认 `outputPath` 分别为:
-
-- `alipay`: `dist/alipay`
-- `baidu`: `dist/baidu`
-- `bytedance`: `dist/bytedance`
-- `dingding`: `dist/dingding`
-- `kuaishou`: `dist/kuaishou`
-- `qq`: `dist/qq`
-- `taobao`: `dist/taobao`
-- `web`: `dist/web`
-- `wechat`: `dist/wechat`
-
-**注意:不允许设定为 `src`、`mock`、`.mor` 等约定式功能相关的目录。**
-
-### phantomDependency - 幽灵依赖检测
-
-- 类型: `object` 或 `boolean`
-- 默认值: 开发模式 `true` | 生产模式 `false`
-
-开启关闭或配置幽灵依赖检测功能,不配置时开发模式下默认为 `true` 开启检测 warn 警告,生产模式下默认为 `false` 关闭检测,配置值为 `object` 时支持 `mode` 和 `exclude` 两个属性:
-
-- `mode`: 检测模式,可配置为 `'warn'` 和 `'error'` 两种,默认 `'warn'` 时仅进行警告,配置为 `'error'` 时会作为错误抛出
-- `exclude`: `Array` 指定哪些 npm 包不作为幽灵依赖从而跳过检测
-
-```javascript
-// 配置示例一:关闭检测(生产模式下默认)
-{
- phantomDependency: false
-}
-
-// 配置示例二:开启检测 warn 警告,但是某些包不判断为幽灵依赖
-{
- phantomDependency: {
- mode: 'warn',
- exclude: ['@morjs/utils']
- }
-}
-
-// 配置示例三:开启检测 error 警告,但是某些包不判断为幽灵依赖
-{
- phantomDependency: {
- mode: 'error',
- exclude: ['@morjs/utils']
- }
-}
-```
-
-> - 幽灵依赖: 当一个项目使用了一个没有在其 package.json 中声明的包时,就会出现"幽灵依赖"
-
-- 出现原因: npm 3.x 开始「改进」了安装算法,使其扁平化,扁平化就是把深层的依赖往上提。好处是消除重复依赖,代价则是引入幽灵依赖问题,因为往上提的依赖你在项目中引用时就能跑
-- 潜在危害:
- - 不兼容的版本,比如某依赖过了一年发布大版本,然后大版本被提升到 node_modules root 目录,你就会使用不兼容的版本
- - 依赖缺失,比如你的直接依赖小版本更新后不使用你之前依赖的间接依赖,再次安装时就不会出现这个依赖,或者比如多个直接依赖的间接依赖冲突时,可能也不会做提升
-
-### plugins - 插件配置
-
-- 类型: `Plugin[]`
-- 默认值: `[]`
-
-配置 `MorJS` 插件, 详细参见[如何开发 MorJS 插件](/guides/basic/plugin)。
-
-```javascript
-// 配置示例
-{
- plugins: [
- [
- 'your_custom_mor_plugin',
- {
- /* 插件选项 */
- }
- ],
- // 或
- 'your_custom_mor_plugin',
- // 或
- { name: 'plugin_name', apply(runner) {} },
- // 或
- new YourCustomMorJSPlugin()
- ]
-}
-
-// 自定义插件
-class YourCustomMorJSPlugin {
- name = 'YourCustomMorJSPlugin'
- apply(runner) {
- // plugin 逻辑
- }
-}
-```
-
-### processComponentsPropsFunction - 是否处理组件入参函数
-
-- 类型: `boolean`
-- 默认值: `false`
-
-用于配置是否处理组件的入参函数,常与组件级别编译配合使用(即 `compileType: 'component'` 时)
-
-默认情况下:由于微信本身不支持诸如 `this.props.onXxxClick`,MorJS 为了抹平差异,在引用组件的 `Page` 的 xml 中注入一段类似如下代码:
-
-```xml
-
-
-```
-
-其中 `props` 的 `onXxxClick` 事件被代理为 `$morEventHandlerProxy` 方法,`data-mor-event-handlers` 则为组件事件触发页面方法的对应对象通过 `base64` 加密得到的一串 hash 值,如触发 `this.props.onXxxClick` 事件时,实际是把事件交给 ` $morEventHandlerProxy` 代理方法来触发 `this.triggerEvent`,从而抹平转端间的差异。
-
-但是以上方案无法完美兼容组件级别的转端,若以组件的方式编译(即 `compileType: 'component'` 时),编译出的组件提供给微信原生小程序,仅能显示正常组件视图,而无法触发组件的入参函数(原生小程序的 `Page` 缺少本该注入的事件代理)
-
-
-
-设置为 `true` 开启后:将处理 `props` 中入参含有函数的组件,将事件代理从页面转为组件代理层,编译出的组件可按照普通组件提供给微信原生小程序混用
-
-
-
-### processNodeModules - 是否处理 node_modules
-
-- 类型: `boolean | { include?: RegExp | RegExp[], exclude?: RegExp | RegExp[] }`
-- 默认值: `undefined`
-
-是否处理 node_modules 中的组件, 默认不处理。
-
-```javascript
-// 配置示例一: 处理全部 node_modules 模块
-{
- // 全部处理
- processNodeModules: true
-}
-
-// 配置示例二: 仅处理符合规则的 node_modules
-{
- processNodeModules: {
- // 只有 npm 名称包含 @abc/alsc- 的 npm 才会被处理
- include: [/@abc\/alsc\-/]
- }
-}
-
-// 配置示例三: 仅不处理特定规则的 node_modules
-{
- processNodeModules: {
- // 只有 npm 名称不包含 @abc/alsc- 的 npm 才会被处理
- exclude: [/@abc\/alsc\-/]
- }
-}
-
-// 配置示例四: 同时配置 include 和 exclude
-{
- processNodeModules: {
- // 只有 npm 名称不包含 @abc/alsc- 且 包含 @abc/ 的 npm 才会被处理
- // exclude 的优先级高于 include
- exclude: [/@abc\/alsc\-/]
- include: [/@abc\//]
- }
-}
-```
-
-### processPlaceholderComponents - 是否处理占位组件
-
-- 类型: `boolean`
-- 默认值: `undefined`
-
-用于配置是否需要编译页面或组件中配置的占位组件(`componentPlaceholder`)。
-
-默认情况下:
-
-- 当 `compileType` 为 `miniprogram` 或 `plugin` 时默认为 `true`,即处理占位组件
-- 当 `compileType` 为 `subpackage` 或 `component` 时默认为 `false`,即不处理占位组件
-
-有关占位组件的用途可参考以下文档:
-
-- [微信小程序 - 自定义组件 - 占位组件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/placeholder.html)
-- [字节小程序 - 自定义组件 - 占位组件](https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/developing-and-testing-miniApp/front-end/mini-app-framework/custom-component/placeholder/)
-
-**_注意:字节小程序的占位组件和微信小程序的占位组件渲染时机和逻辑不一致,可能会引起问题。_**
-
-### sourceType - 源码类型
-
-- 类型: `string`
-- 默认值: `wechat`
-- 可选值:
- - `wechat`: 微信小程序 DSL
- - `alipay`: 支付宝小程序 DSL
-
-源码类型, 表明当前源码是 微信小程序 DSL 或 支付宝小程序 DSL。
-
-### srcPath - 源码目录
-
-- 类型: `string`
-- 默认值: `src`
-
-指定需要编译的源代码所在目录,启动编译时,仅该目录中的代码会被编译。
-
-### srcPaths - 多源码目录
-
-- 类型: `string[]`
-- 默认值: `src`
-
-指定多个编译的源代码所在目录。
-
-**主要用途:** 当指定多个编译的源代码目录时,MorJS 会将这些 “虚拟” 的源代码目录当做一个单一的源码目录。这就允许 MorJS 在编译过程中,从这些 “虚拟” 目录中去解析模块的相对引用路径,就好像它们是同一个目录一样。
-
-例如:
-
-```javascript
-{
- // 配置两个源代码目录
- srcPaths: ['src1', 'another/innerDir/src2']
-}
-```
-
-```bash
-src1
-└── views
- └── view1.ts (可以引用 "./template1", "./view2`)
- └── view2.ts (可以引用 "./template1", "./view1`)
-another
-└── innerDir
- └── src2
- └── views
- └── template1.ts (可以引用 "./view1", "./view2`)
-```
-
-这个技巧,有助于解决某些情况下,我们将一个项目拆分成了多个不同的目录,以方便维护,却同时期望在编译完成后,可以继续保持拆分前的目录结构。
-
-### target - 编译目标平台
-
-- 类型: `string`
-- 默认值: `wechat`
-- 可选值:
- - `alipay` 支付宝小程序
- - `baidu` 百度小程序
- - `bytedance` 字节小程序
- - `dingding` 钉钉小程序
- - `kuaishou` 快手小程序
- - `qq` QQ 小程序
- - `taobao` 淘宝小程序
- - `web` Web 应用
- - `wechat` 微信小程序
-
-编译目标, 将当前的应用编译为目标小程序应用或 Web 应用。
-
-### watch - 是否开启监听
-
-- 类型: `boolean`
-- 默认值: `false`
-
-是否开启监听模式,开启后,文件发生变更时会自动触发重新编译,该配置受 [`ignore` 配置](/guides/basic/config#ignore---忽略配置) 影响。
-
-### watchNodeModules - 监听特定 node_modules
-
-- 类型: `string | RegExp | string[]`
-- 默认值: `undefined`
-
-监听某个 `node_modules` 依赖。该配置适用于直接在 `node_modules` 中修改某个 `npm` 的代码且期望触发更新的场景。
-
-> 注意:该配置开启后,会自动禁用缓存。
-
-```javascript
-// 配置示例一: RegExp
-{
- // 监听 lodash 依赖的变更
- watchNodeModules: /lodash/
-}
-
-// 配置示例二: string,支持 glob 模式
-{
- // 监听 lodash 依赖的变更
- watchNodeModules: '**/lodash/**'
-}
-
-// 配置示例三: string[], 支持 glob 模式
-{
- // 监听 lodash 依赖的变更 且 监听所有前缀为 mor-runtime-plugin-* 的运行时插件变更
- watchNodeModules: ['**/lodash/**', '**/mor-runtime-plugin-*/**']
-}
-```
-
-### web - Web 编译配置
-
-- 类型: `object`
-- 默认值: `{}`
-
-Web 编译配置, 仅在 `target` 值为 `web` 时生效。
-
-```javascript
-/* 配置示例 */
-{
- web: {
- // 配置小程序组件名映射表
- // 默认无需配置, 可指定全局组件配置文件
- globalComponentsConfig: {},
-
- // 是否使用 rpx2rem 插件对 rpx 单位进行转换
- // 默认为 true
- // 优先级低于 usePx
- needRpx: true,
-
- // 是否需要样式隔离,如果开启该功能,在编译时会给样式加上唯一 hash 值,用于多页面解决样式冲突问题
- // 默认为 false
- styleScope: false,
-
- // rpx 方案的 root value。
- // 默认是 32
- rpxRootValue: 32,
-
- // 默认编译出来的样式会以 rem 为单位
- // 优先级高于 needRpx
- // 配合 runtime 层提供的 setRootFontSizeForRem 方法可以实现移动端的响应式。
- // 如果不想将样式单位编译成 rem 可以配置该对象,
- // 对象中包含一个参数 ratio 用于指定 rpx 2 px 的转换比例。
- // 如 ratio 为 1, 那么 1rpx = 1px, 如果配置 ratio 为 2, 那么 1rpx = 0.5px
- usePx: { ratio: 2 },
-
- // extensions 配置,用于设置接口扩展
- // 可设置多个扩展路径,如 ['extension1', 'extension2', ['extension3', {}]]
- extensions: [],
-
- // 配置可开启页面自动响应式(以375尺寸为准)
- // 换算方式为 rpxRootValue / usePx.ratio
- // 以上方默认值为例, 如需开启响应式可配置为: 32 / 2 = 16 即可
- responsiveRootFontSize: undefined,
-
- // 是否需要在导航栏展示返回按钮, 默认为 false
- // 配置示例:
- // true: 所有页面均开启
- // false: 所有页面均关闭
- // []: 可通过数组配置具体需要开启的页面
- // (pagePath: string) => boolean: 可通过函数来定制页面开启情况
- showBack: false,
-
- // 是否需要导航栏, 默认为 true
- // 配置示例:
- // true: 所有页面均开启
- // false: 所有页面均关闭
- // []: 可通过数组配置具体需要开启的页面
- // (pagePath: string) => boolean: 可通过函数来定制页面开启情况
- showHeader: true,
-
- // 产物通用路径
- publicPath: '/',
-
- // 开发服务器配置
- // 详细配置参见: https://webpack.js.org/configuration/dev-server/
- devServer: {},
-
- // html-webpack-plugin 插件 配置
- // 详细配置参见: https://webpack.js.org/plugins/html-webpack-plugin/
- // 支持在数组中配置多个 html 页面
- htmlOptions: [],
-
- // mini-css-extract-plugin 插件配置
- // 详细配置参见: https://webpack.js.org/plugins/mini-css-extract-plugin/
- miniCssExtractOptions: {},
-
- // 行内资源大小配置, 默认为 8k
- inlineAssetLimit: 8192,
-
- // 是否自动生成 entries, 默认均开启
- // 如关闭, 则需要自行指定 webpack 配置的入口文件
- autoGenerateEntries: true,
-
- // 入口文件配置, 仅在 autoGenerateEntries 为 false 的情况下生效
- // 用于手动配置 webpack 入口文件地址
- // 若手动配置则需要用户自行组装页面及引用
- entry: undefined,
-
- // 是否输出中间产物
- emitIntermediateAssets: false,
-
- // 支持用户自定义运行时的一些行为,该字段将作为 $MOR_APP_CONFIG 写入到 window 对象中,供运行时获取并消费
- appConfig: {
- // 用于传递业务对某个组件的特殊配置, 比如 map 组件传递 key
- components: {},
-
- // 用于自定义 URL 中 query 部分的 tabBarKey 的实际名称,该 key 作用于 URL 的 query
- // 并将拿到到值,用于获取 app.json 中的 tabbar 内容,以此实现通过 URL 参数切换不同 tabbar 的功能
- customTabBarKey: 'tabBarKey',
-
- // 用于配置是否允许覆盖全局对象中的方法,默认情况下不会覆盖 `my.xxx` 方法或属性
- // 可以通过配置为 `false` 来强制覆盖
- apiNoConflict: true
- }
- }
-}
-```
-
-### webpackChain - 配置 Webpack
-
-- 类型: `function`
-
-通过 [webpack-chain](https://github.com/mozilla-neutrino/webpack-chain) 的 API 修改 webpack 配置。
-
-比如:
-
-```js
-export default {
- webpackChain(chain) {
- // 设置 alias
- chain.resolve.alias.set('foo', '/tmp/a/b/foo')
-
- // 删除 MorJS 内置 webpack 插件
- chain.plugins.delete('progress')
- }
-}
-```
-
-支持异步,
-
-```js
-export default {
- async webpackChain(chain) {
- await delay(100)
-
- chain.resolve.alias.set('foo', '/tmp/a/b/foo')
- }
-}
-```
-
-### xmlMinimizer - XML 压缩器
-
-- 类型: `boolean`
-- 默认值: `minimize` 开启的情况下默认为 `true`
-
-是否开启 xml 文件的压缩。
-
-### xmlMinimizerOptions - XML 压缩选项
-
-- 类型: `object`
-- 默认值: `{}`
-
-xml 压缩器自定义配置。
-
-## 集成相关配置
-
-### compose - 是否开启集成
-
-- 类型: `boolean`
-- 默认值: `false`
-
-是否在执行编译(`compile`)命令时自动开启 [复杂小程序集成功能](/guides/advance/complex-miniprogram-integration.md), 执行集成(`compose`)命令时, 该配置自动为 `true`。
-
-### consumes - 需要消费的共享依赖
-
-- 类型: `string[]`
-- 默认值: `[]`
-
-配置需要消费的共享 npm 模块, 通常用于主/分包独立打包场景下的依赖共享场景, 仅在 `compileMode` 为 `bundle` 模式下生效。
-
-_注意: 如开启了小程序独立分包模式, 该共享方式可能会失效, 原因是分包可能早于主包加载, 而此时共享模块还未注入。_
-
-```javascript
-/* 配置示例 */
-{
- // 配置分包中需要使用的主包中共享出来的 npm 模块
- consumes: ['lodash']
-}
-```
-
-### host - 宿主配置
-
-- 类型: `object`
-- 默认值: `{}`
-
-小程序集成宿主配置, 详细参见 [复杂小程序集成功能](/guides/advance/complex-miniprogram-integration.md)。
-
-```javascript
-/* 配置示例 */
-{
- // 小程序宿主配置
- host: {
- // 宿主名称, 可选值, 默认会基于 `git` 或 `npm` 或 `tar` 或 `file` 或 `link` 配置自动生成
- name: '',
-
- // 模块集成模式, 默认为 `compose`
- // - compose: 通过 compose 方式集成, 通过拷贝的方式复制到产物目录
- // - compile: 通过 compile 方式集成, 需要通过 MorJS 编译流程
- mode: 'compose',
-
- /* git / npm / tar / file / link 均用于下载模块, 只需要配置一个即可 */
-
- // 通过 git 仓库配置宿主
- // 支持直接配置链接, 如:
- // git: 'git@github.com:abc/cde.git#master'
- //
- // 注意: branch/tag/commit 的优先级为 commit > tag > branch, 相关字段均配置后,会按照优先级取用
- git: {
- // 仓库地址, 支持 git/http/https/ssh 协议链接
- url: 'git@github.com:abc/cde.git',
- // 分支配置, 默认为 HEAD
- branch: 'develop',
- // 标签配置
- tag: 'v1.1.0',
- // Git 提交 commit id
- commit: 'abcdefghigklmnopqrstuvwxyz',
- },
-
- // 通过 npm 配置宿主
- // 支持直接配置链接, 如:
- // npm: 'your_package@1.2.0'
- npm: {
- // npm 名称
- name: 'your_package',
- // npm 版本, 默认为 `latest`
- version: '1.2.0'
- },
-
- // 通过 tar 配置宿主
- // 支持直接配置链接, 如:
- // tar: 'https://your_domain.com/abc.tar.gz'
- tar: {
- url: 'https://your_domain.com/abc.tar.gz',
- // 支持增加扩展参数, 参见 got 配置
- },
-
- // 通过 file 配置宿主(复制)
- // 直接支持配置地址, 如:
- // file: '/Users/yourHomeDir/Workspace/yourCustomHostPath'
- file: {
- path: '/Users/yourHomeDir/Workspace/yourCustomHostPath'
- },
-
- // 通过 link 配置宿主(软链)
- // 直接支持配置地址, 如:
- // link: '/Users/yourHomeDir/Workspace/yourCustomHostPath'
- link: {
- path: '/Users/yourHomeDir/Workspace/yourCustomHostPath'
- },
-
- // 构建产物目录配置, 默认为 `dist`
- dist: 'dist',
-
- // 集成构建过程中可执行的脚本, 可选配置
- scripts: {
- // 执行脚本时的公共环境变量, 可选配置
- // MorJS 默认会注入如下环境变量:
- // MOR_COMPOSER_MODULE_CWD: 当前模块工作目录
- // MOR_COMPOSER_MODULE_TYPE: 当前模块类型
- // MOR_COMPOSER_MODULE_HASH: 当前模块 hash 信息, 用于 MorJS 内部判断是否需要重新下载模块
- // MOR_COMPOSER_MODULE_ROOT: 当前模块根目录
- // MOR_COMPOSER_MODULE_SOURCE: 当前模块源码目录
- // MOR_COMPOSER_MODULE_OUTPUT_FROM: 当前模块原始产物目录
- // MOR_COMPOSER_MODULE_OUTPUT_TO: 当前模块集成产物目录
- env: {},
-
- // 模块编译或拷贝前执行脚本, 可选配置
- before: [
- // 可以直接以字符串的方式配置命令
- 'npm i',
-
- // 也可以以对象的方式配置
- {
- // 需要执行的命令
- command: 'cd some_dir && mor compile',
- // 该命令的自定义环境变量
- env: {
- CUSTOM_ENV: 'CUSTOM_ENV_VALUE'
- },
- // 该命令的选项, 参见 execa.command 的 options 配置
- options: {
- shell: true
- }
- },
- ],
-
- // 模块编译完成后或拷贝后执行脚本, 可选配置
- after: [],
-
- // 所有模块完成集成之后执行脚本, 可选配置
- composed: [],
-
- // 脚本执行公共选项, 参见 execa.command 的 options 配置
- options: {}
- },
-
- // 模块配置信息, 对应 app.json 的内容
- // 该文件的配置方式,可以参见下方链接中有关 app.json 的描述
- // => https://mor.eleme.io/guides/basic/config#compiletype
- // 配置缺省状态下,集成时 MorJS 会自动读取 dist 配置所指向目录中对应的文件
- config: undefined
- }
-}
-```
-
-### modules - 模块配置
-
-- 类型: `object[]`
-- 默认值: `[]`
-
-小程序集成模块配置, 详细参见 [复杂小程序集成功能](/guides/advance/complex-miniprogram-integration.md)。
-
-```javascript
-/* 配置示例 */
-{
- // 小程序集成模块配置
- modules: [
- {
- // 模块名称, 可选值, 默认会基于 `git` 或 `npm` 或 `tar` 或 `file` 或 `link` 配置自动生成
- name: '',
-
- // 模块集成模式, 默认为 `compose`
- // - compose: 通过 compose 方式集成在宿主小程序中, 通过拷贝的方式复制到产物目录
- // - compile: 通过 compile 方式集成在宿主小程序中, 需要通过 MorJS 编译流程
- mode: 'compose',
-
- // 模块类型, 默认为 `subpackage`
- // - 声明为 主包(main) 的模块,会将页面插入到 app.json 的 pages 中
- // - 声明为 分包(subpackage) 的模块,会将页面插入到 app.json 的 subPackages 中
- // - 声明为 插件(plugin) 的模块: 功能研发中
- type: 'subpackage',
-
- /* git / npm / tar / file / link 均用于下载模块, 只需要配置一个即可 */
-
- // 通过 git 仓库配置模块
- // 支持直接配置链接, 如:
- // git: 'git@github.com:abc/cde.git#master'
- //
- // 注意: branch/tag/commit 的优先级为 commit > tag > branch, 相关字段均配置后,会按照优先级取用
- git: {
- // 仓库地址, 支持 git/http/https/ssh 协议链接
- url: 'git@github.com:abc/cde.git',
- // 分支配置, 默认为 HEAD
- branch: 'develop',
- // 标签配置
- tag: 'v1.1.0',
- // Git 提交 commit id
- commit: 'abcdefghigklmnopqrstuvwxyz'
- },
-
- // 通过 npm 配置模块
- // 支持直接配置链接, 如:
- // npm: 'your_package@1.2.0'
- npm: {
- // npm 名称
- name: 'your_package',
- // npm 版本, 默认为 `latest`
- version: '1.2.0'
- },
-
- // 通过 tar 配置模块
- // 支持直接配置链接, 如:
- // tar: 'https://your_domain.com/abc.tar.gz'
- tar: {
- url: 'https://your_domain.com/abc.tar.gz'
- // 支持增加扩展参数, 参见 got 配置
- },
-
- // 通过 file 配置模块(复制)
- // 直接支持配置地址, 如:
- // file: '/Users/yourHomeDir/Workspace/yourCustomModulePath'
- file: {
- path: '/Users/yourHomeDir/Workspace/yourCustomModulePath'
- },
-
- // 通过 link 配置模块(软链)
- // 直接支持配置地址, 如:
- // link: '/Users/yourHomeDir/Workspace/yourCustomModulePath'
- link: {
- path: '/Users/yourHomeDir/Workspace/yourCustomModulePath'
- },
-
- // 构建产物目录配置, 默认为 `dist`
- dist: 'dist',
-
- // 集成构建过程中可执行的脚本, 可选配置
- scripts: {
- // 执行脚本时的公共环境变量, 可选配置
- // MorJS 默认会注入如下环境变量:
- // MOR_COMPOSER_MODULE_CWD: 当前模块工作目录
- // MOR_COMPOSER_MODULE_TYPE: 当前模块类型
- // MOR_COMPOSER_MODULE_HASH: 当前模块 hash 信息, 用于 MorJS 内部判断是否需要重新下载模块
- // MOR_COMPOSER_MODULE_ROOT: 当前模块根目录
- // MOR_COMPOSER_MODULE_SOURCE: 当前模块源码目录
- // MOR_COMPOSER_MODULE_OUTPUT_FROM: 当前模块原始产物目录
- // MOR_COMPOSER_MODULE_OUTPUT_TO: 当前模块集成产物目录
- env: {},
-
- // 模块编译或拷贝前执行脚本, 可选配置
- before: [
- // 可以直接以字符串的方式配置命令
- 'npm i',
-
- // 也可以以对象的方式配置
- {
- // 需要执行的命令
- command: 'cd some_dir && mor compile',
- // 该命令的自定义环境变量
- env: {
- CUSTOM_ENV: 'CUSTOM_ENV_VALUE'
- },
- // 该命令的选项, 参见 execa.command 的 options 配置
- options: {
- shell: true
- }
- }
- ],
-
- // 模块编译完成后或拷贝后执行脚本, 可选配置
- after: [],
-
- // 所有模块完成集成之后执行脚本, 可选配置
- composed: [],
-
- // 脚本执行公共选项, 参见 execa.command 的 options 配置
- options: {}
- },
-
- // 模块配置信息, 对应 subpackage.json / plugin.json / app.json 的内容
- // 三种类型文件的配置方式,可以参见下方链接中的描述
- // => https://mor.eleme.io/guides/basic/config#compiletype
- // 配置缺省状态下,集成时 MorJS 会自动读取 dist 配置所指向目录中对应的文件
- config: undefined
- }
- ]
-}
-```
-
-### shared - 共享依赖
-
-- 类型: `string[]`
-- 默认值: `[]`
-
-配置想要共享给其他分包使用的 npm 模块, 通常用于主/分包独立打包场景下的依赖共享场景, 仅在 `compileMode` 为 `bundle` 模式下生效。
-
-_注意: 如开启了小程序独立分包模式, 该共享方式可能会失效, 原因是分包可能早于主包加载, 而此时共享模块还未注入。_
-
-```javascript
-/* 配置示例 */
-{
- // 配置主包中想要共享给分包使用的 npm 模块
- // 分包中通过 consumes 配置来使用
- shared: ['lodash']
-}
-```
diff --git a/website/docs/guides/basic/directory-structure.md b/website/docs/guides/basic/directory-structure.md
deleted file mode 100644
index 9d394b0d..00000000
--- a/website/docs/guides/basic/directory-structure.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# 目录结构
-
-这里罗列了 MorJS 项目中约定(或推荐)的目录结构,在项目开发中,请遵照这个目录结构组织代码。
-
-```text
-├── .mor - 临时目录
-├── dist - 产物目录
-│ ├── alipay - 支付宝小程序产物
-│ └── wechat - 微信小程序产物
-├── mock - Mock 文件目录
-├── src - 源码目录
-│ ├── assets - 静态资源
-│ │ └── logo.png - 图片
-│ ├── components - 小程序自定义组件目录
-│ │ └── add-button - 自定义组件
-│ │ ├── add-button.axml - 自定义组件模版文件
-│ │ ├── add-button.json - 自定义组件配置文件
-│ │ ├── add-button.less - 自定义组件样式文件
-│ │ └── add-button.ts - 自定义组件脚本文件
-│ ├── pages - 小程序页面目录
-│ │ ├── add-todo - 页面
-│ │ │ ├── add-todo.axml - 页面模版文件
-│ │ │ ├── add-todo.json - 页面配置文件
-│ │ │ ├── add-todo.less - 页面样式文件
-│ │ │ └── add-todo.ts - 页面脚本文件
-│ │ └── todos - 页面
-│ │ ├── todos.axml - 页面模版文件
-│ │ ├── todos.json - 页面配置文件
-│ │ ├── todos.less - 页面样式文件
-│ │ └── todos.ts - 页面脚本文件
-│ ├── app.json - 小程序全局配置文件
-│ ├── app.less - 小程序全局样式文件
-│ ├── app.ts - 小程序全局入口文件
-│ ├── mini.project.json - 支付宝小程序项目配置文件
-│ └── project.config.json - 微信小程序项目配置文件
-├── README.md - 项目说明文档
-├── .env - 环境变量文件
-├── mor.config.ts - MorJS 配置文件
-├── package.json - package.json 文件
-└── tsconfig.json - typescript 配置文件
-```
-
-## 根目录
-
-### package.json
-
-包含插件和项目依赖。
-
-### .env
-
-环境变量,比如:
-
-```text
-PORT=8888
-CACHE=none
-```
-
-### mor.config.ts
-
-配置文件,包含 MorJS 内置功能和插件的配置。
-
-### .mor 目录
-
-编译或集成时的临时文件目录,比如编译中间产物、集成模块产物等,都会被临时生成到这里。**不要提交 .mor 目录到 git 仓库,他们可能会在 MorJS 命令执行期间被更新或删除并重新生成。**
-
-### dist 目录
-
-执行 `mor compile` 或 `mor compose` 或 `mor pack` 等命令后,产物默认会存放在这里。可通过配置修改产物输出路径。
-
-### mock 目录
-
-存储 mock 文件,此目录下所有 `.ts` `.mjs` `.jsonc` `.json5` `.json` `.js` `.cjs` 类型格式文件会被解析为 mock 文件,优先级顺序依次,用于本地的模拟数据服务。
-
-### `src` 目录
-
-源代码目录。
diff --git a/website/docs/guides/basic/env-variables.md b/website/docs/guides/basic/env-variables.md
deleted file mode 100644
index 3db2d54b..00000000
--- a/website/docs/guides/basic/env-variables.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# 环境变量
-
-MorJS 可以通过环境变量来完成一些特殊的配置和功能。
-
-## 如何设置环境变量
-
-### 环境变量约定
-
-`''`、`none`、`false`、`0`、`undefined`、`null` 在环境变量中会被认为是 `false`,如:
-
-`CAHCE=none` 与 `CAHCE=''` 或 `CACHE=false` 具有相同的作用,均为关闭缓存。
-
-### 执行命令时设置
-
-例如需要改变 `mor compile --target web` 开发服务器的端口,进可以通过如下命令实现。
-
-```bash
-# OS X, Linux
-$ PORT=3000 mor compile --target web
-
-# Windows (cmd.exe)
-$ set PORT=3000&&mor compile --target web
-```
-
-如果需要同时在不同的操作系统中使用环境变量,推荐使用工具 [cross-env](https://github.com/kentcdodds/cross-env)
-
-```bash
-$ npm install cross-env -D
-$ cross-env PORT=3000 mor compile --target web
-```
-
-### 设置在 .env 文件中
-
-如果你的环境变量需要在开发者之间共享,推荐你设置在项目根目录的 `.env` 文件中,例如:
-
-```text
-# file .env
-PORT=3000
-CACHE=none
-```
-
-然后执行,
-
-```bash
-$ mor compile --target web
-```
-
-MorJS 会以 3000 端口启动 dev server,并且禁用缓存。
-
-## 环境变量列表
-
-按字母顺序排列。
-
-### ANALYZE
-
-用于分析 bundle 构成,默认关闭。
-
-比如:
-
-```bash
-$ ANALYZE=1 mor compile
-```
-
-### PROGRESS
-
-用于开启或关闭百分比进度显示,默认为开启。
-
-### CACHE
-
-是否开启缓存,`mode` 为 `development` 时自动开启,`mode` 为 `production` 时自动关闭。
-
-### HOST
-
-默认是 `0.0.0.0`,仅在编译为 web 产物且开启监听模式时生效。
-
-### PORT
-
-指定端口号,默认是 `8080`,仅在编译为 web 产物且开启监听模式时生效。
-
-### MOR_PLUGINS
-
-指定 MorJS 命令执行时额外加载的插件的路径,使用 `,` 隔开。
-
-```bash
-$ MOR_PLUGINS=./path/to/plugin1,./path/to/plugin2 mor compile
-```
diff --git a/website/docs/guides/basic/mock.md b/website/docs/guides/basic/mock.md
deleted file mode 100644
index b68e5858..00000000
--- a/website/docs/guides/basic/mock.md
+++ /dev/null
@@ -1,358 +0,0 @@
-# Mock
-
-MorJS 提供了开箱即用的 Mock 功能,能够通过方便简单的方式来完成 Mock 数据或 JSAPI 的设置。
-
-> **什么是 Mock 数据**:在前后端约定好 API 接口以后,前端可以使用 Mock 数据来在本地模拟出 API 应该要返回的数据,这样一来前后端开发就可以同时进行,不会因为后端 API 还在开发而导致前端的工作被阻塞。
->
-> **什么是 Mock JSAPI**:JSAPI 通常是由宿主环境提供的,用于调起宿主能力的接口,如支付宝小程序的 `my.alert` 或 微信小程序的 `wx.showModal` 等,Mock JSAPI 就是前端可以基于宿主本身提供的 JSAPI 的出入参作为标准,在本地模拟出 JSAPI 相同的调用方式,以解决部分 JSAPI 只能够通过真机调用或需要针对多端差异测试的场景。
-
-## 能力概览
-
-- 提供小程序本地 JSAPI mock 能力,解决开发阶段无法联调接口请求数据的痛点
-- 可灵活切换线上线下数据,快速便捷修改本地数据复现业务特定场景或流程
-- 支持绝大部分同步和异步的小程序 JSAPI,支持 MorJS 生态下的多端小程序适配
-- 保障使用安全,线上线下数据隔离,mock 数据不会带到线上
-- 支持自由扩展的 Adapter 能力,可定制化特殊逻辑接入到 mock 中
-- 兼容 `.ts` `.mjs` `.jsonc` `.json5` `.json` `.js` `.cjs` 文件类型格式,优先级顺序依次
-
-## 目录约定
-
-MorJS 约定 `/mock` 目录下的所有文件为 Mock 文件,例如这样的目录结构:
-
-```bash
-.
-├── mock
-│ ├── my
-│ │ └── getSystemInfo.ts
-│ ├── wx
-│ │ └── login.ts
-│ └── request
-│ └── user
-│ └── info.ts
-├── src
-│ ├── pages
-│ │ └── todos
-│ │ ├── todos.axml
-│ │ ├── todos.json
-│ │ ├── todos.less
-│ │ └── todos.ts
-│ ├── app.json
-│ ├── app.less
-│ ├── app.ts
-│ ├── mini.project.json
-│ └── project.config.json
-```
-
-则 `/mock` 目录中的 `my/getSystemInfo.ts`, `wx/login.ts` 和 `request/user/info.ts` 就会被 MorJS 视为 Mock 文件 来处理。
-
-## 快速接入
-
-1. 项目根目录创建 `/mock` 文件目录,该目录用于存放所有的 mock 文件;
-
-```bash
-.
-├── mock
-│
-├── src
-│ ├── pages
-│ ├── app.json
-```
-
-2. 根据需要 `mock` 的 JSAPI 类型,在 `/mock` 文件目录下创建对应的文件目录和 mock 文件:
-
-```bash
-.
-├── mock
-│ ├── my
-│ │ └── getLocation.ts
-│ ├── wx
-│ │ └── getSystemInfo.ts
-│ └── request
-│ └── getList.ts
-```
-
-3. 在业务代码中添加相关 JSAPI 请求,对于不同的 JSAPI 类型请查看下方详细说明;
-4. 终端运行 `mor compile --mock` 开启 mock;
-
-```bash
-$ mor compile --mock
-```
-
-5. 把编译产物用 IDE 打开,查看调用的 JSAPI,返回结果应为第 2 步创建的 mock 文件;
-
-> mock 文件兼容支持 `.ts` `.mjs` `.jsonc` `.json5` `.json` `.js` `.cjs` 文件类型格式,优先级顺序依次
-
-## 类型说明
-
-### JSAPI 类型详细说明
-
-#### 通用 JSAPI
-
-- 小程序基础 API,提供小程序的基础能力,如 `my.getLocation` `wx.getSystemInfo` 等等;
-- mock 目录下创建 my (微信为 wx) 目录,把需要 mock 的 API 文件创建在此处;
-
-```bash
-.
-├── mock
-│ ├── my
-│ │ ├── getLocation.ts
-│ │ └── getNetworkType.ts
-│ └── wx
-│ ├── getSetting.ts
-│ └── getSystemInfo.ts
-```
-
-#### request 请求
-
-- 小程序发起 HTTPS 网络请求调用的 JSAPI,由于 request 接口的特殊性和通用行,我们把该 API 单独处理;
-- 无论是支付宝、微信或是其他平台小程序,都适用该方式 mock HTTPS 网络请求;
-- mock 目录下创建 request 目录,把需要 mock 的 HTTPS 网络请求接口文件创建在此处;
-- 由完整 url 请求地址拆分为域名和接口两部分,将接口部分作为 mock 文件的路径
- - 如接口为 `my.request({ url: 'https://abc.org/api/abc/getList' })`,则 mock 文件路径为 `/mock/request/api/abc/getList.ts`
- - 如接口为 `my.request({ url: 'https://abc.org/aaa/getList' })`,则 mock 文件路径为 `/mock/request/aaa/getList.ts`
-
-```bash
-.
-├── mock
-│ └── request
-│ ├── getFeedsList.ts
-│ ├── api
-│ │ └── getList.ts
-│ └── aaa
-│ └── getList.ts
-```
-
-> 实际开发中,我们常常会遇到传入的参数不同,接口下发不同数据的情况,mock 同样支持该能力,详情见下发 mock 文件类型说明。
-
-### mock 文件类型说明
-
-我们目前兼容 `.ts` `.mjs` `.jsonc` `.json5` `.json` `.js` `.cjs` 五种文件类型格式,优先级顺序依次,以下分别说明不同类型文件的写法:
-
-- `.json` 文件、`.json5` 文件、`.jsonc` 文件,标准 json 类型文件,返回结果对应 json 的内容
-
-```json
-// /mock/wx/getSystemInfo.json
-{
- "data": { "a": 1, "b": 2 }
-}
-```
-
-- `.ts` 文件、`.js` 文件、`.mjs` 文件、`.cjs` 文件,支持 ESM 和 CJS 两种写法;
-- 同时支持函数写法,根据入参的不同,返回不同 mock 结果
-
-```typescript
-/* /mock/my/getHAMemoryInfo.js */
-
-// ESModule 写法
-export default {
- evaluatedStatus: 'good',
- currentMemory: 123
-}
-
-// CommonJS 写法
-module.exports = {
- evaluatedStatus: 'good',
- currentMemory: 123
-}
-
-// 函数写法,根据参数 opts 的不同,return 不同 mock 结果
-module.exports = function (opts) {
- const {
- data: { type }
- } = opts
- switch (type) {
- case 'ali':
- return { res: 'alipay' }
- case 'wx':
- return { res: 'wechat' }
- default:
- return { res: '其他' }
- }
-}
-```
-
-## mock 配置
-
-`mor.config.ts` 文件中的 `mock` 配置项,可不配置,默认值 `{}`,每项的详细说明如下:
-
-- debug: 是否开启小程序 debug,默认值 `false`,设置为 `true` 时,将显示哪些 JSAPI 命中 mock;
-- path: 本地 mock 目录路径,默认值 `'./mock'`,若你不想把 mock 文件放在根目录下,可通过此项更改 mock 文件目录位置;
-- originMap: 配置哪些 JSAPI 跳过 mock,强制使用原生的事件方法;
-- adapters: 扩展能力支持,用于自定义扩展 mock 逻辑,优先级高于 mock 流程;
-
-示例配置如下:
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'alipay' ,
- target: 'alipay',
- ...,
- mock: {
- debug: false, // 是否开启 debug
- path: './mock', // 本地 mock 目录路径
- originMap: { // 配置哪些 API 使用原生方法
- my: ['getSystemInfo', 'request'],
- },
- adapters: [], // adapters 扩展能力配置
- }
- },
-])
-```
-
-## Adapter 扩展配置
-
-`adapters` 配置用于支持 `mock` 的扩展能力,其返回结果的优先级高于 `mock` 逻辑,`mock` 优先级则高于原生方法(未命中配置 originMap 的情况下)
-
-`adapters` 配置项接收一个数组,支持配置多个 `adapter`,其执行顺序和优先级从上到下,当命中某个 `adapter`,返回正确的结果后,将不会再执行后续的 `adapter`
-
-### 如何使用 Adapter
-
-每个 adapter 支持 `string` 类型和 `array` 两种类型:
-
-- `string` 类型,参数为本地 adapter 路径或 npm 包名,配置以加载该 adapter
-
-```typescript
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'alipay' ,
- target: 'alipay',
- ...,
- mock: {
- ...,
- adapters: [
- './you_adapter_name.js', // string 类型本地 adapter 文件路径
- ],
- }
- },
-])
-```
-
-- `array` 类型,接收两个参数,加载 adapter 并向其传参
- - 第一个参数为本地 adapter 路径或 npm 包名
- - 第二个参数为传给 adapter 的参数(非必填)
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'alipay' ,
- target: 'alipay',
- ...,
- mock: {
- ...,
- adapters: [
- [
- // 参数①: 本地 adapter 或 npm 包名
- 'your_adapter_name',
- // 参数②: 提供 adapter 的参数
- {
- type: 'your_parameter_type',
- api: 'your_parameter_api'
- }
- ],
- ],
- }
- },
-])
-```
-
-### 如何编写 Adapter
-
-在 `adapters` 中配置的 `adapter`,会在 mock 初始化阶段中自动依次 `import`,`new` 对应的实例对象并执行 `run` 方法,`adapter` 的 `run` 需要返回一个结果用于优先替代后续的 mock 结果,若不返回或返回 `undefined` 则继续执行后续的 mock 流程,所以一个基本的 `adapter` 的结构如下:
-
-```typescript
-export default class XXXAdapter {
- private options: Record
-
- constructor(options) {
- this.options = options
- }
-
- public run(runOptions: IRunOptions) {
- // 执行相关逻辑 获取最终结果 result
- return result || undefined
- }
-}
-```
-
-#### `runOptions` 参数
-
-在 mock 初始化对应的实例对象后,自动调用的 `run` 方法会传一些固定的参数提供给开发者使用,`runOptions` 目前包含四个属性:
-
-- `apiName`: 调用的 JSAPI 名称,如 `getSystemInfo` `request` 等,开发者可以根据该属性选择介入哪些 JSAPI 的 mock 流程;
-- `apiArguments`: 调用的 API 的传参,例如调用 `request` 时的入参,可根据参数不同执行不会逻辑流程或返回不同结果;
-- `originalGlobal`: 小程序原生全局对象 如支付宝的 `my`(微信的 `wx`),该原生方法不会走 mock 流程避免 mock 嵌套死循环;
-- `mockContext`: webpack require 的 mock 目录结构,详情可参考 [webpack - Dependency Management](https://webpack.js.org/guides/dependency-management/);
-
-```typescript
-export default class XXXAdapter {
- private options: Record
-
- constructor(options) {
- this.options = options
- }
-
- public run(runOptions: IRunOptions) {
- const { apiName, apiArguments, originalGlobal, mockContext } = runOptions
- // 执行相关逻辑 获取最终结果 result
- return result || undefined
- }
-}
-```
-
-#### 给 `adapter` 传参
-
-在如何使用 `adapter` 的时候说过,每个 adapter 支持 `string` 类型和 `array` 两种类型,想要给 `adapter` 传参必须使用 `array` 类型,第二个参数为传给 adapter 的参数,传入的参数可以在 `constructor` 的 `options` 中获取
-
-```typescript
-// mor.config.ts
-export default defineConfig([
- {
- name: 'ali',
- target: 'alipay',
- ...,
- mock: {
- ...,
- adapters: [
- [
- // 参数①: 本地 adapter 或 npm 包名
- 'your_adapter_name',
- // 参数②: 提供 adapter 的参数
- {
- type: 'your_parameter_type',
- api: 'your_parameter_api'
- }
- ],
- ],
- }
- },
-])
-```
-
-```typescript
-// your_adapter_name/index.ts
-export default class MtopAdapter {
- private options: Record
-
- constructor(options) {
- this.options = options
- }
-
- public run(runOptions: IRunOptions) {
- const { apiName, apiArguments, mockContext, originalGlobal } = runOptions
- const {
- type, // your_parameter_type
- api // your_parameter_api
- } = this.options || {}
- // 执行相关逻辑 获取最终结果 result
- return result
- }
-}
-```
diff --git a/website/docs/guides/basic/plugin.md b/website/docs/guides/basic/plugin.md
deleted file mode 100644
index 6aa14cbb..00000000
--- a/website/docs/guides/basic/plugin.md
+++ /dev/null
@@ -1,262 +0,0 @@
-# 插件
-
-## 插件类型介绍
-
-- 工程插件:一般用于定制命令行、介入编译阶段或集成阶段
-- 运行时插件:一般用于介入小程序运行时的各阶段
-- 运行时解决方案:简单来说就是运行时插件集
-
-业务可基于自身业务诉求来定制或使用 工程插件 或 运行时插件/解决方案。
-
-## 如何使用插件?
-
-### 使用工程插件
-
-- 工程插件需要先安装依赖 `npm install @morjs/your-plugin-name -D`
-- 在 `mor.config.ts` 配置文件中进行引入,并加入到配置项 `plugins` 中即可
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-import PluginXXX from '@morjs/your-plugin-name'
-
-export default defineConfig([
- {
- // name: 'ali',
- // sourceType: 'alipay' ,
- // target: 'alipay',
- // compileMode: 'bundle',
- plugins: [new PluginXXX()]
- }
-])
-```
-
-### 使用运行时插件/解决方案
-
-- 运行时插件/解决方案需要在 `app.ts` 文件中进行引入,加入到对应配置项中即可
-
-```typescript
-import { aApp } from '@morjs/core'
-import RuntimePluginXXX from 'your-runtime-plugin-name'
-import RuntimeSolutionXXX from 'your-runtime-solution-name'
-
-aApp(
- {
- onLaunch() {
- console.log('app onlaunch')
- }
- },
- [
- RuntimeSolutionXXX(),
- () => {
- return {
- plugins: [new RuntimePluginXXX()]
- }
- }
- ]
-)
-```
-
-## 如何开发插件?
-
-### 开发工程插件
-
-开发工程插件有两种方法,推荐使用第一种:
-
-- 方法一:使用官方提供的脚手架初始化工程插件项目,在需要使用的项目中进行引入;
-- 方法二:直接在 `MorJS` 业务项目的 `mor.config.ts` 配置文件中进行编写;
-
-#### 通过脚手架编写 MorJS 工程插件
-
-1. 全局安装 mor cli 工具
-
-```bash
-npm i @morjs/cli -g
-```
-
-2. 通过 mor cli 工具创建项目
-
-```bash
-mor init
-```
-
-3. 选择 `MorJS 工程插件` 回车
-
-```bash
-? 请选择工程类型 › - Use arrow-keys. Return to submit.
- 小程序
- 小程序插件
- 小程序分包
-❯ MorJS 工程插件
- MorJS 运行时插件
- MorJS 运行时解决方案
- MorJS 多端组件库
- MorJS 自定义脚手架
-```
-
-4. 根据提示完成操作后,即可完成插件项目创建,随后按照 [如何使用工程插件](#使用工程插件) 配置到 `mor.config.ts` 配置文件中进行使用即可
-
-```bash
-✔ 请选择工程类型 › MorJS 工程插件
-✔ 请输入项目名称 … myplugin
-✔ 请输入项目描述 … my first plugin
-✔ 用户名 … yourUserName
-✔ 邮箱 … your@gmail.com
-✔ 请输入 Git 仓库地址 … https://github.com/yourUserName/myplugin
-✔ 请选择 npm 客户端 › npm / pnpm / yarn
-```
-
-#### mor.config.\* 的工程插件开发(不推荐)
-
-- 直接在 `MorJS` 项目的 `mor.config.ts` 配置文件中进行编写
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- // name: 'ali',
- // sourceType: 'alipay' ,
- // target: 'alipay',
- // compileMode: 'bundle',
- plugins: [
- {
- name: 'MorJSPluginXXX',
- apply(runner) {
- // modifyUserConfig: 可基于命令行选项修改用户配置
- runner.hooks.modifyUserConfig.tap(
- this.name,
- (userConfig, command) => {
- const { outputPath } = command.options
- // 获取命令行 outputPath 选项,若有则修改 userConfig 的 outputPath 配置为该值
- if (outputPath) userConfig.outputPath = outputPath
- return userConfig
- }
- )
- }
- }
- ]
- }
-])
-```
-
-### 开发运行时插件
-
-开发运行时插件有两种方法,推荐使用第一种方案:
-
-- 方法一:使用官方提供的脚手架初始化运行时插件项目,在需要使用的项目中进行引入;
-- 方法二:直接在 `MorJS` 业务项目的 `app.ts` 配置文件中进行编写;
-
-#### 通过脚手架编写 MorJS 运行时插件
-
-1. 全局安装 mor cli 工具
-
-```bash
-npm i @morjs/cli -g
-```
-
-2. 通过 mor cli 工具创建项目
-
-```bash
-mor init
-```
-
-3. 选择 `MorJS 运行时插件` 回车
-
-```bash
-? 请选择工程类型 › - Use arrow-keys. Return to submit.
- 小程序
- 小程序插件
- 小程序分包
- MorJS 工程插件
-❯ MorJS 运行时插件
- MorJS 运行时解决方案
- MorJS 多端组件库
- MorJS 自定义脚手架
-```
-
-4. 根据提示完成操作后,即可完成插件项目创建,随后按照 [如何使用运行时插件](#使用运行时插件) 配置到`app.ts`文件进行使用即可
-
-```bash
-✔ 请选择工程类型 › MorJS 运行时插件
-✔ 请输入项目名称 … myruntimeplugin
-✔ 请输入项目描述 … my first runtime plugin
-✔ 用户名 … yourUserName
-✔ 邮箱 … your@gmail.com
-✔ 请输入 Git 仓库地址 … https://github.com/yourUserName/myruntimeplugin
-✔ 请选择 npm 客户端 › npm / pnpm / yarn
-```
-
-#### app.ts 的运行时插件开发(不推荐)
-
-- 直接在 `MorJS` 项目的 `app.ts` 文件中进行编写
-
-```typescript
-import { aApp } from '@morjs/core'
-
-aApp(
- {
- onLaunch() {
- console.log('app onlaunch')
- }
- },
- [
- () => {
- return {
- plugins: [
- {
- pluginName: 'RuntimePluginXXX',
- apply(morHooks) {
- // appOnShow: 在 App 的 onShow 生命周期触发
- morHooks.appOnShow.tap(this.pluginName, function (this, options) {
- console.log('触发小程序 appOnShow 生命周期')
- })
- }
- }
- ]
- }
- }
- ]
-)
-```
-
-### 开发运行时 Solution
-
-开发运行时 Solution 可使用官方提供的脚手架初始化运行时 Solution ,在需要使用的项目中进行引入
-
-1. 全局安装 mor cli 工具
-
-```bash
-npm i @morjs/cli -g
-```
-
-2. 通过 mor cli 工具创建项目
-
-```bash
-mor init
-```
-
-3. 选择 `MorJS 运行时解决方案` 回车
-
-```bash
-? 请选择工程类型 › - Use arrow-keys. Return to submit.
- 小程序
- 小程序插件
- 小程序分包
- MorJS 工程插件
- MorJS 运行时插件
-❯ MorJS 运行时解决方案
- MorJS 多端组件库
- MorJS 自定义脚手架
-```
-
-4. 根据提示完成操作后,即可完成插件项目创建,随后按照 [如何使用运行时插件/Solution](#使用运行时插件solution) 配置到`app.ts`文件进行使用即可
-
-```bash
-✔ 请选择工程类型 › MorJS 运行时解决方案
-✔ 请输入项目名称 … mysolution
-✔ 请输入项目描述 … my first solution
-✔ 用户名 … yourUserName
-✔ 邮箱 … your@gmail.com
-✔ 请输入 Git 仓库地址 … https://github.com/yourUserName/mysolution
-✔ 请选择 npm 客户端 › npm / pnpm / yarn
-```
diff --git a/website/docs/guides/basic/runtime.md b/website/docs/guides/basic/runtime.md
deleted file mode 100644
index dac50dc8..00000000
--- a/website/docs/guides/basic/runtime.md
+++ /dev/null
@@ -1,429 +0,0 @@
-# 运行时
-
-基于源代码来做的静态转换过程中,很难去处理动态内容,所以 MorJS 提出了 **编译时** + **运行时** 的综合方案,其中针对 JS 的部分,提供了 **运行时** 的封装打包,在执行的时候动态适配。
-
-## 动态运行时示例
-
-在运行时,针对源码类型不同,`@morjs/core` 提供不了同的方式来替换原生的 `App`、`Page`、`Component`
-
-- 支付宝小程序 DSL 中,提供 `aApp`、`aPage`、`aComponent`
- - `aApp`: 提供了最顶层的入口,作为业务的 solution 执行地方,注册 MorJS 的运行时插件体系
- - `aPage`: 提供了额外的 mixins 能力来拓展业务,并拓展和自定义组件的函数执行抹平
- - `aComponent`: 提供了额外的 mixins 能力来拓展业务,提供了完整的自定义组件的多端抹平能力
-- 微信小程序 DSL 中,提供 `wApp`、`wPage`、`wComponent`
- - `wApp`: 提供了最顶层的入口,作为业务的 solution 执行地方,注册 MorJS 的运行时插件体系
- - `wPage`: 提供了额外的 mixins 能力来拓展业务,并拓展和自定义组件的函数执行抹平
- - `wComponent`: 提供了额外的 mixins 能力来拓展业务,提供了完整的自定义组件的多端抹平能力
-
-### 安装与使用
-
-1. 安装依赖: `npm install @morjs/core --save`
-2. 引用依赖:
-
-- 支付宝 DSL: `import { aApp, aPage, aComponent } from '@morjs/core'`
-- 微信 DSL: `import { wApp, wPage, wComponent } from '@morjs/core'`
-
-3. 全局替换:
-
-- 支付宝 DSL: `App -> aApp` / `Page -> aPage` / `Component -> aComponent`
-- 微信 DSL: `App -> wApp` / `Page -> wPage` / `Component -> wComponent`
-
-
-
-### 扩展能力使用
-
-在 MorJS 中默认集成了 contextPlugin 以及 eventPlugin 插件,因此在 `getApp()` 上,默认会挂载有 `$context` 及 `$event` 的属性
-
-```typescript
-import { aPage } from '@morjs/core'
-
-aPage({
- onLoad() {
- const { appQuery } = getApp().$context
- console.log('app.js 的 onLaunch 中的全局参数:', appQuery)
-
- const { all, emit, off, on, once } = getApp().$event
- // 全局事件支持,提供 emit, off, on, once 方法进行绑定
- }
-})
-```
-
-## aApp/wApp
-
-通过 `aApp(options, solution)` / `wApp(options, solution)` 作为小程序业务逻辑的入口逻辑收拢,实现底层抹平能力的调用及插件话能力输出,并提供拓展能力,同时支持业务自定义 `solution` 的集成。
-
-### 基础使用
-
-`aApp` / `wApp` 的第一个参数 `options` 和微信/支付宝小程序的 `App` 一致,具体使用请参考小程序文档:
-
-- [微信官方文档-小程序框架接口-小程序 App](https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html)
-- [支付宝文档中心-小程序全局配置-app.js 注册小程序](https://opendocs.alipay.com/mini/framework/app-detail)
-
-```typescript
-import { aApp } from '@morjs/core'
-
-aApp({
- onLaunch() {
- console.log('当小程序初始化完成时触发,全局只触发一次')
- },
- onShow() {
- console.log('当小程序启动,或从后台进入前台显示时触发')
- },
- onHide() {
- console.log('当当前页面被隐藏时触发,例如跳转、按下设备 Home 键离开')
- },
- onError() {
- console.log('当小程序发生 js 错误时触发')
- }
-})
-```
-
-`aApp` / `wApp` 的第二个参数 `solution` 可以提供业务自身业务域的运行时 `solution` 或运行时插件 `runtime-plugin`
-
-```typescript
-import { aApp } from '@morjs/core'
-import SolutionXXX from 'mor-runtime-solution-xxx'
-import PluginXXX from 'mor-runtime-plugin-xxx'
-
-aApp(
- {
- onLaunch() {
- console.log('当小程序初始化完成时触发,全局只触发一次')
- }
- },
- [
- SolutionXXX(),
- () => {
- return {
- plugins: [new PluginXXX()]
- }
- }
- ]
-)
-```
-
-## aPage/wPage
-
-通过 `aPage(options)` / `wPage(options)` 作为页面业务逻辑的统一收口,实现多端的底层转换抹平,并提供如 `mixins` 等拓展能力。
-
-### 基础使用
-
-`aPage` / `wPage` 在基础功能上和微信/支付宝小程序的 `Page` 一致,具体请参考小程序文档:
-
-- [微信官方文档 - 小程序框架接口 - 小程 序 Page](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Page.html)
-- [支付宝文档中心 - 小程序全局配置 - page.js 注册小程序](https://opendocs.alipay.com/mini/framework/page-detail)
-
-```typescript
-import { aPage } from '@morjs/core'
-
-aPage({
- data: {
- title: 'Alipay'
- },
- onLoad(query) {
- console.log('当页面初始化完成时触发')
- },
- onShow() {
- console.log('当页面启动,或从后台进入前台显示时触发')
- }
-})
-```
-
-### 生命周期拓展
-
-`aPage` / `wPage` 除已有的小程序生命周期外,还增加实现了 `appLifetimes` 用于监听 `App` 的 `onShow` 和 `onHide` 生命周期事件,示例用法如下:
-
-```typescript
-import { aPage } from '@morjs/core'
-
-aPage({
- appLifetimes: {
- show() {
- console.log('app onShow', 'index-page', this)
- },
- hide() {
- console.log('app onHide', 'index-page', this)
- }
- }
-})
-```
-
-### Mixins 支持
-
-小程序在 `Component` 的维度上支持的 `mixins`,使用 `mixins` 能够解耦业务可复用逻辑,因此 MorJS 在 `Page` 的维度上也实现了 `mixins` 的机制,使用上基本与 `Component` 一致,提供 `{ mixins: [mixin1, mixin2] }` 的 `mixin` 数组即可。有以下的注意点:
-
-- `mixin` 必须是一个对象,里面是希望给 `aPage` / `wPage` 合并的各种属性
-- `data` 等 `Object` 类型的对象属性均会合并
-- 生命周期的钩子函数会合并依次执行,`aPage` / `wPage` 选项的生命周期最后执行
-- 非 `Object` 类型的属性(如:函数)会被同名的属性覆盖,`aPage` / `wPage` 选项的属性优先级最高
-
-```typescript
-import { aPage } from '@morjs/core'
-
-const mixinA = {
- data: {
- x: 1,
- y: 2
- },
- onLoad() {
- console.log('mixina', 'onLoad')
- },
- foo() {
- console.log('mixina', 'foo')
- },
- test: {
- t: 1,
- o: 3
- },
- no: 'xxxx'
-}
-
-const mixinB = {
- data: {
- z: 3
- },
- onLoad() {
- console.log('mixinb', 'onLoad')
- },
- mixinBMethod() {
- console.log('mixinb', 'mixinBMethod')
- },
- foo() {
- console.log('mixinb', 'foo')
- },
- test: {
- t: 2
- },
- no: 'hahaha'
-}
-
-aPage({
- mixins: [mixinA, mixinB],
- onLoad() {
- // 生命周期依次打印 mixina onLoad -> mixinb onLoad -> page onLoad
- console.log('page', 'onLoad')
- // 执行的是 mixinB 的 foo 方法
- this.foo()
- // { x: 1, y: 2, z: 3 } mixinA 和 mixinB 的 data 会合并
- console.log(this.data)
- // { o: 3, t: 2 } mixinA 和 minxinB 都设置了 test 的 t
- // mixinB 的 test.t 会覆盖 mixinA 的 test.t
- console.log(this.test)
- // hahaha minxinB 会覆盖 minxinA 的同名属性
- console.log(this.no)
- // 当前实例会有 mixin 提供的方法
- console.log(this.mixinBMethod)
- }
-})
-```
-
-### $eventListener 语法糖
-
-针对 eventPlugin 插件上用到的高频用到的事件监听和取消监听,MorJS 拓展了语法,可以直接在 `aPage` / `wPage` 中直接使用。
-
-- `$eventListener` 会在 `Page` 的 `onLoad` 生命周期中进行事件的绑定,在 `onUnload` 生命周期中进行事件的解绑,业务可以不用再去关心事件的解绑逻辑
-- `$eventListener` 会在内部处理好 `this` 对象,直接指向当前的实例,不需要业务去关心绑定,业务请勿在事件的回调函数中使用箭头函数,否则会导致 `this` 对象异常
-- `$eventListener` 是一个对象: `key` 是事件名,`value` 是事件的回调函数
-- `$eventListener` 只针对需要多次监听的事件,对于只需要监听一次的,请参考 `event` 插件的 `once` 的用法
-
-以下示例代码以常见的刷新页面数据为例,其中 refreshPage 是事件名
-
-```typescript
-import { aPage } from '@morjs/core'
-
-aPage({
- // 会自动做事件的绑定和解绑
- $eventListener: {
- // refreshPage是监听的事件名
- refreshPage: function (storeId) {
- console.log('in page $eventListener refreshPage', storeId)
- }
- }
-})
-```
-
-触发代码示例:
-
-```typescript
-import { aPage } from '@morjs/core'
-
-aPage({
- data: {
- storeId: '123'
- },
- onStoreChange: function () {
- // 调用方依然只需要根据$event插件的方式,直接调用即可
- getApp().$event.emit('refreshPage', this.data.storeId)
- }
-})
-```
-
-## aComponent/wComponent
-
-通过 `aComponent(options)` / `wComponent(options)` 作为自定义组件业务逻辑的统一收口,实现多端的底层转换抹平,并提供如 `mixins` 等拓展能力。
-
-### 基础使用
-
-`aComponent(options)` / `wComponent(options)` 在基础功能上和微信/支付宝小程序的 `Component` 一致,具体请参考小程序文档:
-
-- [微信官方文档 - 小程序框架接口 - 小程序 Component](https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html)
-- [支付宝文档中心 - 小程序全局配置 - 自定义组件介绍](https://opendocs.alipay.com/mini/framework/custom-component-overview)
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-aComponent({
- // 组件内部数据
- data: { x: 1 },
- // 可给外部传入的属性添加默认值
- props: { y: 1 },
- // 生命周期函数
- didMount() {},
- didUpdate() {},
- didUnmount() {},
- // 自定义方法
- methods: {
- handleTap() {
- // 可使用 setData 改变内部属性
- this.setData({ x: this.data.x + 1 })
- }
- }
-})
-```
-
-### 生命周期拓展
-
-`aComponent` / `wComponent` 除已有的小程序生命周期外,还增加实现了 `pageLifetimes` 用于监听 `Page` 的 `onShow` 和 `onHide` 生命周期事件,示例用法如下:
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-aComponent({
- pageLifetimes: {
- show() {
- console.log('页面触发 onShow')
- },
- hide() {
- console.log('页面触发 onHide')
- }
- }
-})
-```
-
-### Mixins 支持
-
-小程序在 `Component` 的维度上支持的 `mixins`,使用 `mixins` 能够解耦业务可复用逻辑,因此 MorJS 在 `Component` 的维度上也同样支持 `mixins` 的机制,使用上基本与 `Component` 一致,提供 `{ mixins: [mixin1, mixin2] }` 的 `mixin` 数组即可。有以下的注意点:
-
-- `mixin` 必须是一个对象,里面是希望给 `aPage` / `wPage` 合并的各种属性
-- `data` 等 `Object` 类型的对象属性均会合并
-- 生命周期的钩子函数会合并依次执行,`aPage` / `wPage` 选项的生命周期最后执行
-- 非 `Object` 类型的属性(如:函数)会被同名的属性覆盖,`aPage` / `wPage` 选项的属性优先级最高
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-const mixinA = {
- data: {
- x: 1
- },
- didMount() {
- console.log('mixina', 'didMount')
- },
- methods: {
- foo() {
- console.log('mixina', 'foo')
- }
- }
-}
-
-const mixinB = {
- data: {
- y: 2
- },
- didMount() {
- console.log('mixinb', 'didMount')
- },
- methods: {
- foo() {
- console.log('mixinb', 'foo')
- }
- }
-}
-
-aComponent({
- mixins: [mixinA, mixinB],
- didMount() {
- // 生命周期依次打印 mixina didMount -> mixinb didMount -> component didMount
- console.log('component', 'didMount')
- // 执行的是 mixinB 的 foo 方法
- this.foo()
- // { x: 1, y: 2, z: 3 } mixinA 和 mixinB 的 data 会合并
- console.log(this.data)
- }
-})
-```
-
-### $eventListener 语法糖
-
-针对 eventPlugin 插件上用到的高频用到的事件监听和取消监听,MorJS 拓展了语法,可以直接在 `aComponent` / `wComponent` 中直接使用。
-
-- `$eventListener` 会在 `Component` 的 `didMount` 生命周期中进行事件的绑定,在 `didUnmount` 生命周期中进行事件的解绑,业务可以不用再去关心事件的解绑逻辑
-- `$eventListener` 会在内部处理好 `this` 对象,直接指向当前的实例,不需要业务去关心绑定,业务请勿在事件的回调函数中使用箭头函数,否则会导致 `this` 对象异常
-- `$eventListener` 是一个对象: `key` 是事件名,`value` 是事件的回调函数
-- `$eventListener` 只针对需要多次监听的事件,对于只需要监听一次的,请参考 `event` 插件的 `once` 的用法
-
-以下以修改了页面的门店为例,其中 changeStore 是事件名
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-aComponent({
- // 会自动做事件的绑定和解绑
- $eventListener: {
- // changeStore是监听的事件名
- changeStore: function (storeId) {
- console.log('in component $eventListener changeStore', storeId)
- }
- }
-})
-```
-
-触发代码示例:
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-aPage({
- data: {
- storeId: '123'
- },
- onStoreChange: function () {
- // 调用方依然只需要根据$event插件的方式,直接调用即可
- getApp().$event.emit('changeStore', this.data.storeId)
- }
-})
-```
-
-### 注意事项
-
-由于在微信小程序和支付宝小程序的自定义组件差异较大,因此有部分事项是需要特别注意的
-
-1. props 必须完整
-
-- 问题表现:在支付宝小程序中,你可以在 `props` 中没有定义某个属性,但是在实际使用中直接引用 `this.props.xx`,但是由于在微信等端外小程序中需要对 `props` 进行分析并动态赋值,因此必须要有完整的 `props` 列表
-- 解决方案:将所有使用到的 `props` 属性都声明在 `props` 中
-
-1. `props` 中的函数名字必须为 on 开头的 onEvent 格式
-
-- 问题表现:在支付宝中,自定义组件对外的函数入参都必须要求以 on 开头
-- 解决方案:
-
-```typescript
-import { aComponent } from '@morjs/core'
-
-aComponent({
- props: {
- onClick() {} // 必须为onX的格式
- }
-})
-```
diff --git a/website/docs/guides/compatibilities/alipay-to-wechat.md b/website/docs/guides/compatibilities/alipay-to-wechat.md
deleted file mode 100644
index eb853185..00000000
--- a/website/docs/guides/compatibilities/alipay-to-wechat.md
+++ /dev/null
@@ -1,242 +0,0 @@
-# 支付宝转微信
-
-## 自定义组件
-
-### props 必须完整
-
-- **问题表现:** 在支付宝小程序中,你可以在`props`中没有定义某个属性,但是在实际使用中直接引用`this.props.xx`,但是由于在微信小程序中需要对`props`进行分析并动态赋值,因此必须要有完整的`props`列表
-- **解决方案:** 将所有使用到的`props`属性都声明在`props`中
-
-### props 中的函数名字必须为 on 开头的 onEvent 格式
-
-- **问题表现:** 在支付宝中,自定义组件对外的函数入参都必须要求以 on 开头
-- **解决方案:**
-
-```javascript
-aComponent({
- props: {
- onClick() {} // 必须为onX的格式
- }
-})
-```
-
-### 样式覆盖优先级
-
-- **问题表现:** 微信中自定义组件的样式无法直接被覆盖
-- **解决方案:** 传入自定义组件的样式优先级比组件内的高即可
-
-```html
-
-
-
-```
-
-```css
-.content .image {
- width: 100rpx;
- height: 100rpx;
-}
-```
-
-### 获取 props 中的函数返回值
-
-- **问题表现:** 在支付宝小程序中,可以直接通过 `const result = this.props.onClick()` 来获取到传入的函数的返回值。由于在微信等端外小程序中事件处理机制差异过大,因此需要通过异步方式来处理。
-- **解决方案:** **在所有获取函数返回值的地方都通过 await 来获取即可**。而传入的函数不需要做任何改动,按照正常的方式 return 即可
-- 参考代码:
-
-传入方
-
-```javascript
-aPage({
- onComponentClick(...args) {
- console.log(args)
- return 'page-data' // 正常返回即可,不需要做任何特殊处理
- }
-})
-```
-
-调用方
-
-```javascript
-aComponent({
- methods: {
- async onClick() {
- const result = await this.props.onClick('1111111', '22222') // 需要await来拿返回值
- console.log(result) // 打印输出 'page-data'
- },
- },
-},
-```
-
-### 获取各种事件中目标元素 data 属性时优先从 currentTarget 获取
-
-- **问题表现:** 微信中元素产生 tap 或 touch 事件时,target 中元素 data 属性为空,只有 currentTarget 属性有值
-- **解决方案:** 优先从 currentTarget 获取
-
-```javascript
-aPage({
- onOpenItem(e) {
- const target = e.currentTarget || e.target
- const { index, type } = target.dataset || {}
-
- console.log(index, type)
- }
-})
-```
-
-### 不能使用 `default slot` 默认插槽
-
-- **问题表现:** 在支付宝中可以设置组件的 `slot` 的默认内容,在组件调用方不传的 `slot` 的内容的时候默认展示出来。但是由于微信尚未支持该功能。可参考微信的回答:[https://developers.weixin.qq.com/community/develop/doc/0008a04f2b0f289fa907b450b56000](https://developers.weixin.qq.com/community/develop/doc/0008a04f2b0f289fa907b450b56000)
-- **解决方案:** 目前没有办法抹平这种底层级别的差异,因此需要组件都自己传 `slot` 的内容来确保双端兼容性
-
-### 微信端没有 `$spliceData`
-
-- **问题表现:** 在微信小程序没有 `spliceData`
-- **解决方案:** 只使用 `setData` 或者判断环境再使用
-
----
-
-## AXML
-
-### AXML 中动态定义高度要加 PX 单位
-
-- **问题表现:** 在微信小程序中,不加单位,高度不生效
-- **解决方案:** 加单位
-
-![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2020/png/27413/1595323486788-7c509cb9-7d96-4ce2-872d-75cb285f3d45.png#height=1096&id=eF6j5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1096&originWidth=2008&originalType=binary&ratio=1&size=1657788&status=done&style=none&width=2008)
-
-### AXML 中的 style 属性不能传递对象
-
-- **问题表现:** 在支付宝小程序中传入 style 对象,解析为微信小程序代码则会出现错误
-- 问题解决:在支付宝小程序中使用字符串拼接(可引入变量)
-- 参考代码:
-
-有问题的写法 👇🏻
-
-```html
-
-
-
-
-
-```
-
-改为 👇🏻 即可
-
-```html
-
-
-```
-
-### AXML 中不支持 `\`\`` 模版字符串
-
-- **问题表现:** 微信小程序中的 {{ }} 中无法使用模版字符串
-- 问题解决:将模版字符串替换为字符串拼接 `+`
-- 参考代码:
-
-```html
-
-```
-
-改为 👇🏻 即可
-
-```html
-
-```
-
-### AXML 不能使用 `{{{}}}` 方式传递对象,除 template 的 data 属性之外,也不能使用解构语法
-
-- **问题表现:** 微信小程序中的 `{{{ }}}` 会报语法错误,也不能使用 `{{...data}}`
-- 问题解决:在 js 文件中声明完整对象,然后再 axml 中直接传递,如 `{{data}}`
-
----
-
-## SJS
-
-### 不能使用 namedExport
-
-- **问题表现:** 在微信小程序中,只支持`module.exports`而在支付宝中是除了`export default {}` 以外还支持了 `export const x = 1;` 然后在 xml 中通过``来引用。而这套机制在微信中无法抹平,而`export default`已经能够满足所有业务诉求。
-- **解决方案:** 所有`sjs`中只采用`export default {}`
-
----
-
-## 原生组件
-
-### slider
-
-- `track-size` 属性在微信小程序下不能支持
-
-### scroll-view 中 flex 布局失效
-
-- **问题表现:** 在微信小程序中,`sroll-view` 使用 `flex` 布局会失效。
-- **解决方案:**
- - 方法一:在 `scroll-view` 内层再嵌套一层 `view`,对这个 `view` 使用 `flex` 布局;参考[https://segmentfault.com/q/1010000007532480](https://segmentfault.com/q/1010000007532480)
- - 方法二:使用 `enable-flex` 属性
-- **问题示例 👇🏻**
-
-例如:
-
-原始效果(横向布局)
-
-![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2020/png/269922/1601632677440-9660077f-a4aa-46de-a533-2cfe56aab189.png#height=42&id=QErf3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=86&originWidth=796&originalType=binary&ratio=1&size=14215&status=done&style=none&width=386)
-
-迁移之后代码(纵向布局)
-
-![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2020/png/269922/1601632746857-85c9c822-00c4-4d49-8812-471373aca2f1.png#height=269&id=s5fTv&margin=%5Bobject%20Object%5D&name=image.png&originHeight=662&originWidth=244&originalType=binary&ratio=1&size=22908&status=done&style=none&width=99)
-
----
-
-## 配置相关
-
-### 使用自定义顶部导航栏时
-
-- **问题表现:** 在.json 文件中设置 **`"transparantTitle":"always"`** 时:
- - 微信端左上角的返回按钮和 home 按钮会无法显示,需要自定义
- - 支付宝仍可以获取到 **statusBarHeight** 和 **titleBarHeight** 的值,但微信获取到的 **titleBarHeight** 值为零
-- **解决方案:**
- - 没有返回按钮的问题只能是前端手动添加
- - 微信侧可以通过 api:**wx.getMenuButtonBoundingClientRect()** 获取到胶囊位置,手动计算出 title 部分高度,参考代码逻辑如下 👇🏻
-
-```javascript
-function getHeaderBar() {
- const systemInfo = getSystemInfoSync()
- if (systemInfo.app === 'wechat') {
- // 微信端
- // 低版本兼容,基础库 2.1.0 开始支持
- // eslint-disable-next-line no-undef
- if (wx.getMenuButtonBoundingClientRect) {
- // 该方法可使用
- // eslint-disable-next-line no-undef
- const { height, top, left } = wx.getMenuButtonBoundingClientRect()
- console.log('微信读取胶囊结果', { height, top, left })
- let { statusBarHeight } = systemInfo
- const extraHeight = 10
- statusBarHeight = top - statusBarHeight > 0 ? statusBarHeight : 0 // 华为p10状态栏是浮层
- const titleBarHeight = (top - statusBarHeight) * 2 + height + extraHeight
- return {
- height: statusBarHeight + titleBarHeight,
- titleBarHeight: titleBarHeight,
- statusBarHeight: statusBarHeight,
- buttonLeft: left,
- extraHeight
- }
- }
- // 低版本兼容
- return {
- height: 84,
- titleBarHeight: 40,
- statusBarHeight: 44
- }
- }
-
- // 非微信端
- const { titleBarHeight, statusBarHeight } = systemInfo
- return {
- height: titleBarHeight + statusBarHeight,
- titleBarHeight,
- statusBarHeight
- }
-}
-```
-
-
diff --git a/website/docs/guides/compatibilities/wechat-to-other.md b/website/docs/guides/compatibilities/wechat-to-other.md
deleted file mode 100644
index 8a3dc1c2..00000000
--- a/website/docs/guides/compatibilities/wechat-to-other.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# 微信 DSL 多端兼容性
-
-本文主要介绍微信 DSL 在多端兼容性方面的差异,微信转抖音、百度等小程序差异较小,多端适配问题较少,转支付宝等小程序注意事项可参考以下内容,具体详情可查询各小程序平台官网文档,转 Web 主要关注对于 JSAPI 和组件转端两方面的支持情况,除此之外,MorJS 提供了代码维度和文件维度两种条件编译能力,便于使用者按需解决多端代码适配问题。
-
-## 转支付宝
-
-因阿里系(支付宝、淘宝、钉钉…)小程序之间差异较小,这里以支付宝小程序为例,其他端可酌情参考。
-
-### WXML 中避免使用不支持的组件
-
-微信小程序 DSL 中尽可能使用 [官方标准组件](https://developers.weixin.qq.com/miniprogram/dev/component/) 进行业务开发,不要使用类似 `i` `span` `img` `h2` `strong` `em` `a` 等官方未提及的元素,当需要显示相关视图时,可以参考如下方式:
-
-- 用 [view](https://developers.weixin.qq.com/miniprogram/dev/component/view.html) 来代替 `label` 的使用,支付宝的 `label` 不支持 `tap` 事件;
-- 用 [view](https://developers.weixin.qq.com/miniprogram/dev/component/view.html) 来代替 `h2` `strong` `em` 等元素的使用;
-- 用 [image](https://developers.weixin.qq.com/miniprogram/dev/component/image.html) 代替 `img` 的使用;
-- 用 [text](https://developers.weixin.qq.com/miniprogram/dev/component/text.html) 代替 `span` 的使用;
-
-### 开启 component2 配置
-
-在 `MorJS` 转端实现中,部分运行时接口抹平方式依赖开启 `component2` 和 `enableAppxNg` 所提供的能力,开发者可以从以下两个方式中任选一种进行开启:
-
-- 在支付宝 IDE 中,点击 详情 => 项目配置,勾选【启用小程序基础库 2.0 构建】和【启用 component2】
-- 在小程序项目目录的 mini.project.json 文件(若无则可以新建)下,配置 `component2` 和 `enableAppxNg`
-
-```json
-{
- "component2": true,
- "enableAppxNg": true
-}
-```
-
-### 使用较新的基础库版本
-
-推荐使用较新的支付宝基础库,当基础库版本较低时,个别功能可能会出现一定程度的差异,包括但不限于以下:
-
-- 基础库版本小于 `2.8.5` 时,自定义组件的 `lifetimes` 节点树生命周期采用 MorJS 的自实现,且不支持 `moved` 生命周期方法
-- 基础库版本小于 `2.8.5` 时,不支持使用自定义组件的 `relations` 来建立组件关系
-- 基础库版本小于 `2.8.1` 时,自定义组件的 `observers` 数据变化观测器采用 MorJS 的自实现而非支付宝提供的官方能力
-- 基础库版本小于 `2.8.0` 时,自定义组件的 `$selectComponent` 和 `selectAllComponents` 采用 MorJS 的自实现而非支付宝提供官方能力
-- 基础库版本小于 `2.7.22` 时,自定义组件的 `selectOwnerComponent` 采用 MorJS 的自实现而非支付宝提供官方能力
-
-### ESModule 和 CommonJS 语法
-
-MorJS 虽然不限制模块的具体写法,但是项目中尽可能不要出现 ESModule 和 CommonJS 混用的情况,推荐全部使用 ESModule 或全部使用 CommonJS 来编写代码,两者混用可能会在产物生成时出现预期之外的问题。
-
-```typescript
-/* ESModule 的使用 */
-export const obj = { name: 'E1e' } // 导出 export
-export default { name: 'E1e' } // 默认导出
-
-import { obj } from './utils.js' // 引入 import
-
-/* CommonJS 的使用 */
-const obj = { a: 1 }
-module.exports = obj // 导出
-
-const obj = require('./utils.js') // 引入
-```
-
-### 不同的样式隔离支持
-
-如遇到转端编译后的产物在不同小程序端样式紊乱,可能是微信和支付宝对样式隔离的支持和默认值不同导致的。
-
-- 微信支持 6 种样式隔离的配置方式,默认值为:`isolated`,这代表默认情况下自定义组件间的样式互不影响;
-- 支付宝支持 2 种样式隔离的配置方式,默认值为:`shared`,代表默认情况下支付宝小程序组件和页面的样式是相互影响的,容易造成样式冲突;
-
-推荐开发者在最初开发时针对不同的页面模块使用不同的 `class` 命名处理样式隔离,对于已有的小程序工程,在基于支付宝基础库 2.7.2 及以上版本时,可以尝试在自定义组件的 JSON 文件中配置 `"styleIsolation": "apply-shared"`,避免页面的样式影响到外部。
-
-参考文档:[《微信样式隔离》](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#%E7%BB%84%E4%BB%B6%E6%A0%B7%E5%BC%8F%E9%9A%94%E7%A6%BB) [《支付宝样式隔离》](https://opendocs.alipay.com/mini/framework/page-acss#%E9%A1%B5%E9%9D%A2%E6%A0%B7%E5%BC%8F%E9%9A%94%E7%A6%BB)
-
-## 转 Web
-
-转 Web 主要关注对于 JSAPI 和组件转端两方面的支持情况。
-
-### JSAPI 差异
-
-使用小程序 DSL 转 Web 能力时,需要关注一下所使用的 API 具体的支持情况,MorJS 目前已完成 92 个 JSAPI 在转 Web 端的兼容,覆盖了大部分常用的业务功能。
-
-如遇到还未支持的 API,可在社区服务群(钉钉群号 `29445021084`)提出,开发同学将按照优先级排期兼容。
-
-参考文档:[《MorJS | Web 开发 - API 支持情况》](https://mor.eleme.io/web/basic/support)
-
-### 组件差异
-
-目前 MorJS 支持 32 个组件在转 Web 端的兼容,同时支持自定义组件替换能力。
-
-## 条件编译
-
-MorJS 提供了代码维度和文件维度两种能力的条件编译,便于使用者按需解决多端代码适配问题。
-
-### 代码维度条件编译
-
-对于代码转端中有适配差异难题,或期望能够根据当前环境和配置的变量,来构建输出不同的代码的,可以使用代码维度的条件编译,该能力主要根据注释来实现条件编译,编译后会把符合条件的代码直接清空。
-
-```xml
-
-只会在微信上显示
-
-
-
-只会在支付宝上显示
-
-```
-
-```typescript
-/* #ifdef wechat */
-console.log('这句话只会在微信上显示')
-/* #endif */
-
-/* #ifndef wechat */
-console.log('除了在微信以外的端都展示')
-/* #endif */
-```
-
-参考文档:[《MorJS | 条件编译 - 代码维度》](https://mor.eleme.io/guides/conditional-compile/code-level)
-
-### 文件维度条件编译
-
-对于不同端的业务需求,若存在大量的差异性代码,除了使用代码维度的条件编译外,MorJS 还提供了文件维度的条件编译,支持绝大多数的文件类型,以各端特殊后缀为编译条件,编译时根据端区分不同的文件后缀,优先使用对应端的源文件。
-
-参考文档:[《MorJS | 条件编译 - 代码维度》](https://mor.eleme.io/guides/conditional-compile/file-level)
diff --git a/website/docs/guides/conditional-compile/code-level.md b/website/docs/guides/conditional-compile/code-level.md
deleted file mode 100644
index 0a0ab9c6..00000000
--- a/website/docs/guides/conditional-compile/code-level.md
+++ /dev/null
@@ -1,244 +0,0 @@
-# 条件编译 (代码维度)
-
-## 背景
-
-目前对于多端代码有适配难题或者期望能够根据当前环境来构建输出不同的代码。因此 MorJS 支持根据注释来实现条件编译, 编译后会把符合条件的代码直接清空。
-
-## 语法支持
-
-### 目前支持的语法
-
-- `#if`(判断变量值)
-- `#ifdef` (判断是否有变量)
-- `#ifndef` (判断是否无变量)
-- `#endif` (结束语句, **必须要有!**)
-
-### 目前支持的文件类型
-
-- `js`
-- `ts`
-- `wxss`
-- `acss`
-- `less`
-- `scss`
-- `wxml`
-- `axml`
-- `jsonc`
-- `json5`
-
-### 尚未支持的文件类型
-
-目前由于 `json` 文件不支持注释语句, 针对 `json` 文件的条件编译, 可以使用 `jsonc` 或 `json5` 的代码纬度条件编译或者 `json` 的文件纬度条件编译。
-
-### 默认注入的变量
-
-- `name`(`mor.config.ts` 中的每项配置的 `name`)
-- `[name]: true` (配置的 `name` 会转成一个 key)
- - 例如: `name: 'ali'`,那么就会有一个 `ali: true`,主要用于 `ifdef` 的场景
-- `production` 是否是生产环境的配置,生产环境下默认为 `true`,开发环境下默认为 `undefined`
-- `target` (`mor.config.ts` 中的每项配置的 `target`)
-- `[target]: true` (配置中的 `target` 会自动转换成为一个 key)
- - 例如:`target: 'alipay'`,那么就会有一个 `alipay: true`,主要用于 `ifdef` 的场景
-
-例如:
-
-当用户配置(`mor.config.ts`)为如下内容时:
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-export default defineConfig([
- {
- name: 'ali',
- mode: 'production',
- target: 'alipay'
- }
-])
-```
-
-条件编译的上下文会自动注入如下变量:
-
-```javascript
-{
- name: 'ali',
- ali: true,
- production: true,
- target: 'alipay',
- alipay: true
-}
-```
-
-### 自定义条件编译变量
-
-如果默认注入的变量无法满足你的诉求, 业务可以在`mor.config.ts`中自定义条件编译的变量值, 请参考代码示例中的`conditionalCompile.context`配置。
-
-- 请注意, 如果有多个编译方案, `conditionalCompile.context` 建议是都需要设置, 且里面的 `key` 都必须存在在所有 `conditionalCompile.context` 中。
-- 如果缺失 `conditionalCompile.context` 值或者 `conditionalCompile.context` 中没有该 `key`, MorJS 会把 `#if test == '123'` 这种条件默认当成`false`处理。
-
-## 代码示例
-
-### mor.config.ts 配置示例
-
-```javascript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'alipay',
- conditionalCompile: {
- context: {
- test: '123'
- }
- }
- },
- {
- name: 'wechat',
- // 自定义条件编译的变量
- conditionalCompile: {
- context: {
- test: '456'
- }
- }
- }
-])
-```
-
-### #ifdef(判断是否有变量)
-
-#### js/ts 文件类型
-
-```javascript
-/* #ifdef wechat */
-console.log('这句话只会在微信上显示')
-/* #endif */
-/* #ifdef alipay */
-console.log('这句话只会在支付宝上显示')
-/* #endif */
-```
-
-#### acss/less 文件类型
-
-在微信下背景是红色, 在支付宝下是蓝色背景
-
-```less
-.index-page {
- /* #ifdef wechat */
- background: red;
- /* #endif */
- /* #ifdef alipay */
- background: blue;
- /* #endif */
-}
-```
-
-#### wxml/axml 文件类型
-
-```html
-
-只会在微信上显示
-
-
-只会在支付宝上显示
-
-```
-
-### #ifndef(判断是否无变量)
-
-#### js/ts 文件类型
-
-```javascript
-/* #ifndef wechat */
-console.log('除了在微信以外的端都展示')
-/* #endif */
-```
-
-#### wxss/acss/less/scss 文件类型
-
-```less
-.index-page {
- /* #ifndef wechat */
- background: red;
- /* #endif */
-}
-```
-
-#### wxml/axml 文件类型
-
-```html
-
-除了在微信以外的端都展示
-
-```
-
-#### jsonc/json5 文件类型
-
-```javascript
-{
- "component": true,
- "usingComponents": {
- // #ifndef wechat
- "any-component": "./wechat-any-component",
- // #endif
-
- "other-component": "./other-component"
- }
-}
-```
-
-### #if(判断变量值)
-
-#### js/ts 文件类型
-
-```javascript
-/* #if name == 'wechat' */
-console.log('这句话只会在微信上显示')
-/* #endif */
-
-/* #if name == 'alipay' */
-console.log('这句话只会在支付宝上显示')
-/* #endif */
-```
-
-#### wxss/acss/less/scss 文件类型
-
-```less
-.index-page {
- /* #if name == 'wechat' */
- background: red;
- /* #endif */
-
- /* #if name == 'alipay' */
- background: blue;
- /* #endif */
-}
-```
-
-#### wxml/axml 文件类型
-
-```html
-
-只会在微信上显示
-
-
-
-只会在支付宝上显示
-
-```
-
-#### jsonc/json5 文件类型
-
-```javascript
-{
- "component": true,
- "usingComponents": {
- // #if name == 'wechat'
- "any-component": "./wechat-any-component",
- // #endif
-
- // #if name == 'alipay'
- "any-component": "./alipay-any-component",
- // #endif
-
- "other-component": "./other-component"
- }
-}
-```
diff --git a/website/docs/guides/conditional-compile/file-level.md b/website/docs/guides/conditional-compile/file-level.md
deleted file mode 100644
index f5c68029..00000000
--- a/website/docs/guides/conditional-compile/file-level.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# 条件编译 (文件维度)
-
-对于存在业务上如果在端上有大量的端上的差异性代码的话,除了用[代码维度的条件编译](/guides/conditional-compile/code-level)外,还可以采用文件维度的条件编译。
-
-## 注意事项
-
-条件编译的维度是**项目源代码的维度,不会对 npm 库生效**。npm 库需要在输出的时候就需要做好各端文件的输出,具体可以参考
-
-- [JS 依赖库规范](/specifications/js.md)
-- [组件库规范](/specifications/component.md)
-
-## 目前支持的文件类型
-
-- 各端样式文件: `.wxss` 或 `.acss` 或 `.css` 或 `.qss` 等
-- 各端模版文件: `.wxml` 或 `.axml` 或 `.swan` 或 `.qml` 或 `ksml` 等
-- 各端脚本文件: `.js` 或 `.ts`
-- 各端配置文件: `.json` 或 `.jsonc` 或 `.json5`
-
-## 各端特殊后缀列表
-
-以下以`index.js`文件示例,其他文件一样的规则, 各端默认配置如下
-
-- 微信小程序 (`.wx`): `index.wx.js`
-- 支付宝小程序 (`.my`): `index.my.js`
-- 百度小程序 (`.bd`): `index.bd.js`
-- QQ 小程序 (`.qq`): `index.qq.js`
-- 字节小程序 (`.tt`): `index.tt.js`
-- 快手小程序 (`.ks`): `index.ks.js`
-- 钉钉小程序 (`.dd`): `index.dd.js`
-- 淘宝小程序 (`.tb`): `index.tb.js`
-- Web 应用 (`.web`): `index.web.js`
-
-### `mor.config.ts` 配置示例
-
-```javascript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'alipay',
- conditionalCompile: {
- // fileExt 支持配置配置单个或多个, 如 { fileExt: '.my' } 或 { fileExt: ['.my', '.share'] }
- // 如配置为多个, 则文件寻址及解析的优先级以实际配置的先后顺序为准
- // 以 { fileExt: ['.my', '.share'] } 为例
- // 优先查找 xxxx.my.xx, 如无则查找 xxxx.share.xx, 如无则查找 xxxx.xx 文件
- fileExt: '.my'
- }
- },
- {
- name: 'wechat',
- conditionalCompile: {
- fileExt: '.wx'
- }
- }
-])
-```
-
-## 实现效果
-
-文件默认输出就是(支付宝)小程序的版本,因此条件编译主要是针对域外的小程序(如:微信小程序)
-
-如:自定义组件(页面也是如此)需要做两端的区分
-页面引用该组件的代码:
-
-```javascript
-{
- "usingComponents": {
- "demo": "../../components/demo/index"
- }
-}
-```
-
-默认情况下,组件都包含了`axml`/`acss`/`js`/`json`四个文件
-
-```bash
-- components
- - demo
- - index.axml
- - index.acss
- - index.js
- - index.json
-```
-
-由于在微信小程序下。逻辑差异较大。可以直接用`.wx`来做区分
-
-```bash
-- components
- - demo
- - index.axml(支付宝版本)
- - index.acss(支付宝版本)
- - index.js(支付宝版本)
- - index.json
- - index.wx.axml(微信版本)
- - index.wx.acss(微信版本)
- - index.wx.js(微信版本)
-```
-
-在 MorJS 编译输出的时候,在输出目录下`_wechat`,会优先用`.wx`的版本来生成对应的微信版本源文件
-
-```bash
-- _wechat
- - components
- - demo
- - index.wxml
- - index.wxss
- - index.js
- - index.json
-```
-
-而在`Page`的`json`中的`usingComponents`是不需要做任何修改的,依然保留原本的引用路径即可。
-
-## js 引用说明
-
-比方说在`pages/index/index`中,你希望区分引入不同的`util.js`也是能够支持的
-
-```bash
-- pages
- - index
- - index.axml
- - index.acss
- - index.js
- - index.json
- - util.js(支付宝版本)
- - util.wx.js(微信版本)
-```
-
-在`pages/index/index.js`文件中,`import`语句并不需要做文件引用的区分,统一用文件前缀即可。MorJS 会按照文件后缀的优先级来实现不同文件的加载
-
-微信小程序下生效的是`util.wx.js`,支付宝小程序下生效的是`util.js`
-
-```javascript
-import { createPage } from '@morjs/core'
-import { log } from './util'
-
-createPage({
- onLoad() {
- log()
- }
-})
-```
diff --git a/website/docs/guides/contributing.md b/website/docs/guides/contributing.md
deleted file mode 100644
index f4007f16..00000000
--- a/website/docs/guides/contributing.md
+++ /dev/null
@@ -1,110 +0,0 @@
-# 参与贡献
-
-❤️ 喜欢 MorJS 并且希望能够参与到其中?非常欢迎!
-
-## 环境准备
-
-### Node.js 和 pnpm
-
-开发 MorJS 需要 Node.js 14+ 和 `pnpm` v7。
-
-推荐使用 [`nvm`](https://github.com/nvm-sh/nvm) 管理 Node.js,避免权限问题的同时,还能够随时切换当前使用的 Node.js 的版本。在 Windows 系统下的开发者可以使用 [`nvm-windows`](https://github.com/coreybutler/nvm-windows)。
-
-在 `pnpm` 的[官网](https://pnpm.io/installation)选择一种方式安装即可。
-
-### Clone 项目
-
-```bash
-git clone git@github.com:eleme/morjs.git
-cd morjs
-```
-
-### 安装依赖并构建
-
-```bash
-pnpm i && pnpm bootstrap && pnpm build
-```
-
-## 开发 MorJS
-
-### 启动 dev 命令
-
-本地开发 MorJS 必开命令,用于编译 `src` 下的 TypeScript 文件到 `dist` 或 `lib` 目录,同时监听文件变更,有变更时增量编译。
-
-```bash
-pnpm dev
-```
-
-如果觉得比较慢,也可以只跑特定 package 的 `pnpm dev` 命令,比如。
-
-```bash
-pnpm dev -- plugin-compiler
-```
-
-### 跑 Example
-
-`examples` 目录下保存了各种用于测试的例子,跑 example 是开发 MorJS 时确认功能正常的常用方式。每个 example 都配了 dev 脚本,所以进入 example 然后执行 `pnpm dev` 即可。
-
-```bash
-cd examples/alipay
-pnpm dev
-```
-
-## 贡献 MorJS 文档
-
-MorJS 的文档由 [Docusaurus](https://docusaurus.io) 实现。在根目录执行如下命令即可开始 MorJS 文档的开发:
-
-```bash
-# 安装 MorJS 文档依赖
-$ pnpm docs:deps
-
-# 启动 MorJS 文档开发
-# 首次启动时编译耗时较长,请耐心等待
-$ pnpm docs:start
-```
-
-打开指定的端口号,即可实时查看文档更新的内容。
-
-### 撰写 MorJS 文档
-
-MorJS 文档的编写基于 MDX 格式。MDX 是 Markdown 格式的拓展,允许您在撰写 MorJS 文档时插入 JSX 组件。
-
-
-MDX 文档示例
-
-
-在根目录执行如下命令可以格式化仓库中已有的 MorJS 文档:
-
-```bash
-pnpm format:docs
-```
-
-格式化文档后,建议**仅提交您撰写或修改的 MorJS 文档**。不同文档贡献者的写作风格有一定的差异,格式化以后不一定能保留原来期望的样式。
-
-## 新增 package
-
-新增 package 有封装脚本,无需手动复制 `package.json` 等文件:
-
-```bash
-# 创建 package 目录
-$ mkdir packages/foo
-
-# 初始化 package 开发
-$ pnpm bootstrap
-```
-
-## 发布
-
-只有 Core Maintainer 才能执行发布。
-
-```bash
-pnpm release
-```
-
-## 加入 Contributor 群
-
-提交过 Bugfix 或 Feature 类 PR 的同学,如果有兴趣一起参与维护 MorJS,可用钉钉扫下方二维码加入到 MorJS 社区钉钉群与我们交流。
-
-
-
-如果你不知道可以贡献什么,可以到源码里搜 TODO 或 FIXME 找找。
diff --git a/website/docs/guides/faq.md b/website/docs/guides/faq.md
deleted file mode 100644
index fcb97f8a..00000000
--- a/website/docs/guides/faq.md
+++ /dev/null
@@ -1,118 +0,0 @@
-# FAQ
-
-### 怎么编译成微信或抖音小程序
-
-以编译成微信小程序为例:
-
-1. 首先明确我们编译目标为微信小程序,需要在 `mor.config.ts` 配置中添加编译为微信的配置,其中 `target` 值设置为 `wechat`(配置参考 [MorJS 基础 - 配置 - target - 编译目标平台](/guides/basic/config#target---编译目标平台))
-2. 给这份配置起一个配置名字,把 `name` 设置为配置名称(如:`wechat`),其他配置可与基础配置相同保持不变
-3. 在 `package.json` 的 `script` 中添加编译为微信的命令 `"dev:wechat": "mor compile -w --name wechat"`
-4. 终端运行 `npm run dev:wechat`,产物 `dist/wechat` 即为编译成微信的产物,用微信 IDE 打开即可
-
-> 更多具体配置项可查阅 [MorJS 基础 - 配置](/guides/basic/config)
-
-```typescript
-// mor.config.ts
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- ...
- {
- name: 'wechat', // 配置名称
- sourceType: 'alipay', // 源码 DSL 类型
- target: 'wechat', // 编译目标平台
- compileType: 'miniprogram', // 编译类型
- compileMode: 'bundle', // 编译模式
- }
-]
-```
-
-### 怎么指定产物的路径
-
-默认产物目录 `dist` 下是编译的产物结果,对输出产物目录进行修改有两种方式:
-
-1. `mor.config.ts` 配置修改,通过 [MorJS 基础 - 配置](/guides/basic/config#outputpath---%E8%BE%93%E5%87%BA%E4%BA%A7%E7%89%A9%E7%9B%AE%E5%BD%95) 可以查到配置项 outputPath 对此进行设置,修改输出产物目录。
-2. 命令行 `--output-path` 配置,通过 [MorJS 基础 - 命令行](/guides/basic/cli) 可以查到 `--output-path` 用于修改输出产物目录,优先级比 `mor.config.ts` 配置。
-
-方案一:
-
-```typescript
-// mor.config.ts
-export default defineConfig([
- ...
- {
- name: 'wechat',
- ...,
- outputPath: 'build/wechat', // 产物路径
- }
-]
-```
-
-方案二:
-
-```bash
-$ mor compile --name wechat --output-path build/wechat
-```
-
-### 未被使用的文件会被编译到产物里吗?
-
-不会,但如果你想把某些未被使用的文件放到产物里,可以在 `mor.config.ts` 配置中,通过 [MorJS 基础 - 配置](guides/basic/config#copy---文件拷贝) 配置项 copy,设置要复制到输出目录的文件或文件夹;
-
-```typescript
-// mor.config.ts
-export default defineConfig([
- ...
- {
- name: 'wechat',
- ...,
- copy: [
- { from: 'anotherFile.json', to: './' }
- ]
- }
-]
-```
-
-### 小程序可以转换为小程序插件或分包吗?
-
-可以,MorJS 小程序形态一体化支持小程序、小程序插件、小程序分包之间的互相转换,相关文档请查阅 [MorJS 进阶 - 小程序形态一体化](/guides/advance/unity-of-forms)
-
-### 可以接入第三方的 UI 框架吗,接入的组件会一同转端吗?
-
-可以,理论上(微信/支付宝)小程序原生的组件库是可以一并转换的,使用方式上,需按照对应平台的 npm 组件的规范来使用,无其他特别的要求。使用方法如下:
-
-> 注意:我们内部并没有使用任何社区的组件库,各第三方 UI 框架表现不同,相关的兼容性需要具体进一步验证
-
-1. 安装需要接入的第三方 UI 框架,具体方式请参照各 UI 框架的文档
-2. 在配置文件 `mor.config.ts` 中添加对 `node_modules` 的处理,具体配置项 `processNodeModules`,相关文档请查阅 [MorJS 基础用法 - 配置 processNodeModules](/guides/basic/config/#processnodemodules---%E6%98%AF%E5%90%A6%E5%A4%84%E7%90%86-node_modules)
-
-```typescript
-// mor.config.ts
-export default defineConfig([
- ...
- {
- name: 'alipay', // 配置名称
- ...,
- processNodeModules: {
- // 只有 npm 名称包含 @abc/alsc- 的 npm 才会被处理
- include: [/@abc\/alsc\-/]
- }
- }
-]
-```
-
-3. 在项目中按 [照组件库规范](/specifications/component) 来引用组件,或按照实际路径引用组件,比如:"@vant/weapp/popup/index" 或 "@vant/weapp/lib/popup/index"
-
-```json
-{
- "usingComponents": {
- "van-button": "@vant/weapp/button/index", // 引用 @vant/weapp 的 button 组件
- "van-popup": "@vant/weapp/lib/popup/index" // 引用 @vant/weapp 的 popup 组件
- }
-}
-```
-
-4. 执行编译命令,用对应平台 IDE 打开对应产物即可
-
-### 运行时提供的 hooks 的执行顺序是在页面原始方法前还是后?
-
-目前运行时的 hooks 都是在原始方法之前执行
diff --git a/website/docs/guides/introduction/getting-started.md b/website/docs/guides/introduction/getting-started.md
deleted file mode 100644
index cae96040..00000000
--- a/website/docs/guides/introduction/getting-started.md
+++ /dev/null
@@ -1,137 +0,0 @@
-# 快速上手
-
-## 环境准备
-
-MorJS 项目基于 [node](https://nodejs.org/zh-cn/),请确保已具备较新的 node 环境(>=14),推荐使用 node 版本管理工具 [nvm](https://github.com/nvm-sh/nvm) 来管理 node(Windows 下使用 [nvm-windows](https://github.com/coreybutler/nvm-windows)),这样可以很方便地切换 node 版本,全局安装时候也不必再使用 `sudo`。
-
-```
-# mac 或 linux 下安装 nvm
-$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
-$ nvm -v
-0.39.1
-
-# 安装 node
-$ nvm install 14
-$ nvm use 14
-$ node -v
-v14.21.3
-```
-
-## 创建项目
-
-Mor 提供了 `create-mor` 和 `mor cli` 工具两种方式来创建新项目,选择其中任一一种即可。
-
-- **使用 create-mor 创建项目**
-
-确保你安装了符合版本的 Node.js,选定项目目录
-
-```shell
-$ mkdir myapp && cd myapp # 创建项目目录
-```
-
-在目录终端执行以下任一命令:
-
-```shell
-$ npm init mor # npm 创建项目
-$ yarn create mor # yarn 创建项目
-$ pnpm create mor # pnpm 创建项目
-```
-
-这一指令将会安装并执行 `create-mor`,它是 Mor 官方的项目脚手架工具。
-
-- **使用 mor cli 创建项目**
-
-确保你安装了符合版本的 Node.js,创建项目目录,全局安装 mor cli 工具
-
-```shell
-$ mkdir myapp && cd myapp # 创建项目目录
-$ npm i @morjs/cli -g # 全局安装 mor cli
-$ mor -v # 查看全局 mor 版本
-```
-
-此时你已安装了 mor cli 工具,然后通过 `mor init` 命令即可创建项目:
-
-```shell
-$ mor init
-```
-
-## 初始化项目
-
-创建项目后你会看到如下命令号交互界面,选择对应的工程类型,按照提示完成初始化操作:
-
-```shell
-✔ 请选择工程类型 › 小程序
-✔ 请选择源码类型 › 微信小程序 DSL
-✔ 是否使用 Typescript … 否 / 是
-✔ 请选择 CSS 预处理器 › less
-✔ 请输入 小程序 的名称 … myapp
-✔ 请输入 小程序 的描述 … my first app
-✔ 用户名 … yourUserName
-✔ 邮箱 … your@gmail.com
-✔ 请输入 Git 仓库地址 … https://github.com/yourUserName/myapp
-✔ 请选择 npm 客户端 › npm / pnpm / yarn
-…
-[mor] ✔ 安装 node_modules 完成!
-[mor] ✔ 小程序项目初始化完成 ^_^ 在终端运行命令 👇🏻
-
- npm run dev
-
- 即可启动项目。
-```
-
-在项目初始化之后,Mor 会默认开始安装项目所需要的依赖,一般来说,依赖安装会自动完成,但某些情况下可能会安装失败,这时候你可以在项目目录下自己使用安装命令进行安装:
-
-```shell
-$ npm i
-```
-
-## 编译运行
-
-使用 MorJS 的 `compile` 命令可以把 MorJS 代码编译成不同端的代码,然后在对应的开发工具中查看效果。MorJS 初始的编译命令配置了 `dev` 和 `build` 两种模式:
-
-- `dev` 模式(增加 --watch 参数)将会监听文件修改。
-- `build` 模式(增加 --production 参数)将对代码进行压缩打包。
-
-执行 `npm run dev` 命令,进行浏览调试:
-
-```
-[mor] ℹ 发现配置文件: mor.config.ts
-[mor] ✔ 配置文件加载成功: mor.config.ts
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: wechat-miniprogram
- 编译目标: 微信小程序
- 编译环境: development
- 编译类型: 小程序
- 编译模式: bundle
- 源码类型: wechat
- 源码目录: src
- 输出目录: dist/wechat
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 启动文件监听模式
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 25.125412 ms
-[mor] ✔ 编译完成, 耗时: 1451.202285 ms
-
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: alipay-miniprogram
- 编译目标: 支付宝小程序
- 编译环境: development
- 编译类型: 小程序
- 编译模式: bundle
- 源码类型: wechat
- 源码目录: src
- 输出目录: dist/alipay
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 启动文件监听模式
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 24.112123 ms
-[mor] ✔ 编译完成, 耗时: 441.548922 ms
-```
-
-多端产物已构建在 dist 目录下,分别用对应平台的 IDE 打开即可开发预览:
-
-在 [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html) 中打开 `dist/wechat` 目录即可开始微信小程序开发预览
-
-在 [支付宝小程序开发者工具](https://opendocs.alipay.com/mini/ide/download) 中打开 `dist/alipay` 目录即可开始微信小程序开发预览
diff --git a/website/docs/guides/introduction/how-mor-works.md b/website/docs/guides/introduction/how-mor-works.md
deleted file mode 100644
index ee7bd903..00000000
--- a/website/docs/guides/introduction/how-mor-works.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# MorJS 如何工作?
-
-MorJS 内置了一套完整的插件体系,覆盖从源码构建到生成产物的各个阶段,主要分为以下三方面:
-
-1. 通过插件干预命令行阶段,实现所需的一个个新的命令
-2. 利用工程插件,定制或扩展整个 `compiler` 编译流程
-3. 通过运行时插件,介入到小程序的生命周期
-
-## 架构概览
-
-- **灵活的插件架构**
- - 支持命令行、编译流程、编译平台扩展、集成流程、用户配置文件等各个方面的定制
-- **微信、支付宝双 DSL 支持**
- - 域外多以 微信小程序 DSL 为准,域内多以支付宝小程序 DSL 为准,而 MorJS 两者都支持
-- **开箱即用的转端能力**
- - 无需借助任何外部依赖,即可完成微信小程序和支付宝小程序转其他端
-- **极致的性能和研发体验**
- - 从日志输出到缓存利用,从配置兼容到构建提示,从编译压缩到分包优化,始终以提升开发者体验为第一原则
-- **更加健壮的组件研发规范**
- - 不论是已有的多端组件规范,还是 npm 依赖,亦或是微信小程序的 npm 组件规范,通通支持
-- **适配大中小不同类型的小程序项目**
- - 小项目只需编译能力,中等项目结合编译和页面注入能力,而大项目可使用复杂小程序集成能力
-
-
-
-## 静态编译原理
-
-
-
-静态编译转换主要用于处理 `JS`、`WXS/SJS`、`WXML/AXML`、`WXSS/ACSS`、`JSON` 等源码中约束强且不能动态修改的部分,如:
-
-- **模块引用:** `JS`/`WXS`/`SJS`/`WXML`/`AXML`/`WXSS`/`ACSS`/`JSON` 等源码中的模块引用替换和后缀名修改;
-- **模版属性映射或语法兼容:** `AXML`/`WXML` 中如
- - `a:if` ➙ `wx:if`
- - `onTap` ➙ `bind:tap`
- - `` {{`${name}Props`}} `` ➙ `{{name + 'Props'}}` 等;
-- **配置映射:** 如页面配置
- - `{ "titleBarColor": "#000000" }` ➙ `{ "navigationBarBackgroundColor: "#000000", "navigationBarTextStyle": "white" }` 等
-
-等,通过静态编译环节去抹平差异性处理。
-
-## 运行时补偿原理
-
-
-
-运行时补偿主要用于处理静态编译无法处理的一些运行时动态内容,如:
-
-- **JSAPI:** 实际业务使用上,不管是 `JSAPI` 的名字还是 `JSAPI` 的入参都会存在动态赋值的情况,导致了在 `JSAPI` 的真实调用上,很难通过 `AST` 去解析出实际传参;
-- **自定义组件 - Props 属性:** 支付宝属性使用 props 声明,而微信属性使用 properties 声明,配置方式不同且使用时分别使用 `this.props.x`及 `this.properties.x`的方式获取,同时可能存在动态取值的情况;
-- **自定义组件 - 生命周期:** 支付宝小程序中的`didUpdate`生命周期,在触发了`props`和`data`更新后都会进入`didUpdate`这个生命周期,且能够在`didUpdate`中访问到`prevProps` / `prevData`,而在微信小程序中静态转义出这个生命周期就意味着你需要去动态分析出`didUpdate`里面要用到的所有属性,然后去动态生成出这些属性的监听函数。这显然可靠程度是极其低的;
-
-等(这里不再一一列举)。
-
-## 功能定制
-
-业务可基于自身业务诉求来定制 **工程插件** 或 **运行时插件/解决方案**。
-
-### 工程能力定制
-
-
-
-### 运行时能力定制
-
-
diff --git a/website/docs/guides/introduction/how-to-develop-todo-list.md b/website/docs/guides/introduction/how-to-develop-todo-list.md
deleted file mode 100644
index 453cdccb..00000000
--- a/website/docs/guides/introduction/how-to-develop-todo-list.md
+++ /dev/null
@@ -1,444 +0,0 @@
----
-title: 支付宝 DSL
----
-
-# 开发一个 To-Do List (支付宝 DSL)
-
-这篇文章将带领你使用 MorJS,开发一个简单的 To-Do List 小程序,并部署到不同的小程序平台。
-
-## 成果展示
-
-- 支付宝小程序
-
-
-- 微信小程序
-
-
-- 字节(抖音)小程序
-
-
-## 环境准备
-
-首先需要有 node,并确保 node 版本为 14 或以上,该部分的内容在 [快速上手](/guides/introduction/getting-started) 中已经提到了,我们这里就不再赘述了。
-
-使用 `node -v` 来查看当前 node 版本
-
-```shell
-$ myapp node -v
-v14.19.3
-```
-
-待会儿我们需要部署到不同的小程序平台,所以需要对应小程序的 IDE 模拟器进行调试,以下是各小程序 IDE 下载地址,您只需要下载需要的平台的开发者工具即可,本文以支付宝开发者工具为例。
-
-
-
-- [支付宝开发者工具](https://opendocs.alipay.com/mini/ide/download)
-- [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
-- [抖音开发者工具](https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/developer-instrument/download/developer-instrument-update-and-download)
-- [百度开发者工具](https://smartprogram.baidu.com/docs/develop/devtools/history/)
-- [QQ 开发者工具](https://q.qq.com/wiki/tools/devtool/)
-- [快手开发者工具](https://mp.kuaishou.com/docs/develop/developerTools/downloadPath.html)
-
-## 配置小程序
-
-打开项目根目录下的 mor.config.ts 文件,该文件是 mor 项目的主要配置文件,根据 [快速上手](/guides/introduction/getting-started) 初始化生成的配置有两份:
-
-1. 其中 `target` 值为 `alipay` 的,代表我们编译目标是支付宝小程序,这一份配置默认名称为 `alipay-miniprogram`
-2. 第二份 `target` 值为 `wechat` 的,代表我们编译目标是微信小程序,这一份配置默认名称为 `wechat-miniprogram`
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'alipay-miniprogram',
- sourceType: 'wechat',
- target: 'alipay',
- compileType: 'miniprogram',
- compileMode: 'bundle'
- },
- {
- name: 'wechat-miniprogram',
- sourceType: 'wechat',
- target: 'wechat',
- compileType: 'miniprogram',
- compileMode: 'bundle'
- }
-])
-```
-
-接下来我们添加一份字节(抖音)小程序的配置:
-
-1. 首先明确我们编译目标为字节小程序,需要把 `target` 值设置为 `bytedance`
-2. 然后再给这份配置起一个名字,就叫 `douyin` ,把 `name` 设置为 `douyin`
-3. 其他的配置就先复制一份,更多具体配置项可查阅 [MorJS 基础 - 配置](/guides/basic/config)
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- ...
- {
- name: 'douyin', // 配置名称
- sourceType: 'alipay', // 源码 DSL 类型
- target: 'bytedance', // 编译目标平台
- compileType: 'miniprogram', // 编译类型
- compileMode: 'bundle', // 编译模式
- }
-]
-```
-
-如果你 `npm run dev` 命令行没有关闭的话,你会发现 `dist/` 下多出来一份 `dist/bytedance` 的文件,恭喜你完成了字节(抖音)端的小程序编译构建,这就是用于抖音端的开发产物啦~ 🎉 🎉 🎉
-
-## 实作页面组件
-
-接下来我们将对目前的初始化项目添加页面和组件。如你所见,初始化后的页面已经具备了显示 Tode List 和添加 Todo 功能,下面我们使用添加页面来实现编辑 Todo 功能,使用添加组件来实现删除 Todo 功能。
-
-### 添加页面
-
-#### 页面配置
-
-1. 在 `src/pages` 下创建文件夹 `src/pages/edits-todo` 用于存放编辑 Todo 功能相关的页面
-2. 在该文件夹下创建小程序页面的四个基础文件 `edits-todo.axml` `edits-todo.less` `edits-todo.ts` `edits-todo.json`
-3. 打开 `edits-todo.json` 文件进行编译,先写一个 `{}` 作为空配置
-4. 在页面配置 `src/app.json` 中添加该页面到 `pages` 中
-
-```json
-{
- "pages": [
- "pages/todos/todos",
- "pages/add-todo/add-todo",
- "pages/edit-todo/edit-todo"
- ]
-}
-```
-
-> 1. 关于 `xml` 文件,若项目初始化时选择的是微信 DSL,页面的基础文件可改为 `edits-todo.wxml`
-> 2. 关于 `css` 文件,MorJS 支持 wxss/acss/less/scss 文件类型,开发者可选择适合的文件格式进行编写
-
-#### 页面功能
-
-1. 编辑入口:首页 `src/pages/todos` 需要添加一下编辑的入口,修改一下首页的样式,js 中需要增加点击跳转方法,并把该项的 index 传给页面,用于标记哪一项的内容需要被编辑。
-
-```xml
-
-
-```
-
-```typescript
-// src/pages/todos/todos.ts
-import { aApp } from '@morjs/core'
-
-aPage({
- ...,
- editTodo(e) {
- my.navigateTo({url: `../edit-todo/edit-todo?index=${e.target.targetDataset.index}`})
- },
-})
-```
-
-```css
-/* src/pages/todos/todos.less */
-.todo-items {
- padding: 50rpx 30rpx;
-}
-.todo-item {
- display: flex;
- align-items: center;
-}
-.todo-item-text {
- width: 360rpx;
-}
-.todo-item-edit {
- margin: 0 20rpx;
-}
-```
-
-2. 编辑功能:
-
-- xml 文件中需要一个 input 用于显示和修改被编辑项的内容和一个按钮用于触发完成编辑
-- css 文件编辑页面样式
-- js 文件中,对页面传入的 index 对应的内容进行保存,提供给 xml 中的 input 显示,并添加一个方法用于按钮点击后触发
-
-```xml
-
-
-
-
-
-
-
-```
-
-```typescript
-// src/pages/todos/edit-todos.ts
-import { aPage } from '@morjs/core'
-
-const app = getApp()
-
-aPage({
- onLoad(query: any): void {
- this.setData({
- index: query.index,
- inputValue: app.todos[query.index].text
- })
- },
-
- data: {
- index: '',
- inputValue: ''
- },
-
- onBlur(e: any) {
- this.setData({
- inputValue: e.detail.value
- })
- },
-
- edit() {
- const { index, inputValue } = this.data
- app.todos[index].text = inputValue
- my.navigateBack()
- }
-})
-```
-
-```css
-/* src/pages/todos/edit-todos.less */
-.page-edit-todo {
- display: flex;
- flex: 1;
- flex-direction: column;
-}
-
-.edit-todo {
- padding: 40px;
- flex-grow: 1;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.edit-todo-input {
- display: block;
- font-size: 50rpx;
- font-weight: 100;
- padding: 5px 5px;
- background: none;
- border: none;
- border-bottom: 1px solid #dfdfdf;
- color: #0effd6;
- width: 100%;
-}
-
-.todo-footer {
- padding: 50rpx 0 100rpx;
- font-size: 48rpx;
- font-weight: 200;
- text-align: center;
-}
-```
-
-```json
-// src/pages/todos/edit-todos.json
-{
- "usingComponents": {
- "add-button": "/components/add-button/add-button"
- }
-}
-```
-
-3. 通过上述流程后,我们在 todo list 的每一项后面都会有一个「编辑」按钮,点击将会调转到编辑页,修改完内容后点击编辑页下方的按钮即可报错并回到 todo list 页,以上,恭喜你学会了怎么添加和编辑页面代码!🎉 🎉 🎉
-
-### 添加组件
-
-#### 组件配置
-
-1. 在 `src/components` 下创建文件夹 `delete-check` 用于存放删除 Todo 功能相关的组件
-2. 在该文件夹下创建小程序组件的四个基础文件 `delete-check.axml` `delete-check.less` `delete-check.ts` `delete-check.json`
-3. 在需要使用到该组件的页面 `todos.json` 中配置引入该组件
-
-```json
-// src/pages/todos/todos.json
-{
- "usingComponents": {
- "add-button": "../../components/add-button/add-button",
- "delete-check": "../../components/delete-check/delete-check"
- }
-}
-```
-
-4. 在需要使用到该组件的页面 `todos.axml` 中使用引入的组件
-
-```xml
-
-
- ...
-
-
-
-```
-
-#### 组件功能
-
-1. 删除入口:首页 `src/pages/todos` 需要添加一下删除的触发入口,修改一下首页的样式,js 中需要增加点击删除方法,并把该项的 index 传给组件,用于标记哪一项的内容需要被删除,同时添加一个方法 onCancelDel 用于设置 showDeleteCheck 为 false 关闭删除确认框。
-
-```xml
-
-
-```
-
-```typescript
-// src/pages/todos/todos.ts
-aPage({
- data: {
- checkIndex: '',
- showDeleteCheck: false
- },
- // 打开删除框
- delTodo(e) {
- const index = e.target?.targetDataset?.index || e.target?.dataset?.index
- this.setData({
- checkIndex: index,
- showDeleteCheck: true
- })
- },
- // 关闭删除框
- onCancelDel(e) {
- this.setData({
- todos: app.todos,
- checkIndex: '',
- showDeleteCheck: false
- })
- }
-})
-```
-
-```css
-/* src/pages/todos/todos.less */
-.todo-item-del {
- margin: 0 20rpx;
- color: crimson;
-}
-```
-
-2. 删除功能:
-
-- xml 文件用于显示弹窗的浮层,其中一个确认删除按钮用于触发删除,一个取消按钮用于关闭弹窗
-- css 文件编辑页面样式
-- js 文件中,对页面传入的 index 对应的内容进行保存,提供给 xml 中显示,并添加一个删除方法和一个关闭弹窗方法提供给 xml 点击触发
-
-```xml
-
-
-
- 确认删除「{{text}}」
-
- 删除
- 取消
-
-
-
-```
-
-```typescript
-// src/components/delete-check/delete-check.ts
-import { aComponent } from '@morjs/core'
-
-// 获取全局 app 实例
-const app = getApp()
-
-aComponent({
- props: {
- checkIndex: '',
- onCancelDel: () => {}
- },
- data: {
- text: ''
- },
- didMount() {
- const text = app.todos[this.props.checkIndex].text
- this.setData({ text })
- },
- methods: {
- del() {
- app.todos.splice(this.props.checkIndex, 1)
- this.cancel()
- },
- cancel() {
- this.props.onCancelDel()
- }
- }
-})
-```
-
-```css
-/* src/components/delete-check/delete-check.less */
-.delete-check-bg {
- width: 100vw;
- height: 100vh;
- background-color: rgba(#fff, 0.6);
- position: fixed;
- top: 0;
- left: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- .delete-check {
- width: 400rpx;
- border: 1rpx solid #ccc;
- background: #fff;
- border-radius: 8rpx;
- }
- .delete-check__text {
- padding: 50rpx 30rpx;
- text-align: center;
- }
- .delete-check__btn-box {
- display: flex;
- align-items: center;
- .btn-del {
- width: 50%;
- text-align: center;
- color: crimson;
- padding: 20rpx;
- border: 1rpx solid #ccc;
- border-right: none;
- }
- .btn-cancel {
- width: 50%;
- text-align: center;
- padding: 20rpx;
- border: 1rpx solid #ccc;
- }
- }
-}
-```
-
-```json
-// src/components/delete-check/delete-check.json
-{
- "component": true
-}
-```
-
-3. 通过上述流程后,我们在 todo list 的每一项后面都会有一个「删除」按钮,点击将会打开删除弹窗,点击删除后即可删除该项,以上,恭喜你学会了怎么添加和编辑组件代码!🎉 🎉 🎉
-
-## 多端部署
-
-之前我们通过 `npm run dev` 命令行开启了多端的编译及监听,若是改为 `npm run dev:wechat` 则是只开启对于微信端的编译及监听,从 package.json 中配置不难发现,其区别在于命令行多了一个 `--name wechat` 的配置,通过 [MorJS 基础 - 命令行](/guides/basic/cli) 可以查到 `--name` 用于指定配置名称,也就是我们配置文件 `mor.config.ts` 中的配置 name。
-
-通过 `npm run compile:prod` 命令行可对源码进行多端打包编译,不同于 dev 的是开启了生产模式编译构建,开启生产模式后会自动开启压缩支持,增加代码维度 context 条件编译、关闭 mock 等默认行为,同样若是改为 `npm run compile:prod:wechat` 则是只开启对于微信端的生产构建编译。
-
-默认产物目录 `dist` 下则是多端编译的产物结果,对输出产物目录进行修改有两种方式:
-
-1. `mor.config.ts` 配置修改,通过 [MorJS 基础 - 配置](/guides/basic/config#outputpath---%E8%BE%93%E5%87%BA%E4%BA%A7%E7%89%A9%E7%9B%AE%E5%BD%95) 可以查到配置 outputPath 可以修改输出产物目录。
-2. 命令行 `--output-path` 配置,通过 [MorJS 基础 - 命令行](/guides/basic/cli) 可以查到 `--output-path` 用于修改输出产物目录,优先级比 `mor.config.ts` 配置。
diff --git a/website/docs/guides/introduction/how-to-develop-todo-list_wechat.md b/website/docs/guides/introduction/how-to-develop-todo-list_wechat.md
deleted file mode 100644
index 58dfec42..00000000
--- a/website/docs/guides/introduction/how-to-develop-todo-list_wechat.md
+++ /dev/null
@@ -1,435 +0,0 @@
----
-title: 微信 DSL
----
-
-# 开发一个 To-Do List (微信 DSL)
-
-这篇文章将带领你使用 MorJS,开发一个简单的 To-Do List 小程序,并部署到不同的小程序平台。
-
-## 成果展示
-
-- 微信小程序
-
-
-- 支付宝小程序
-
-
-- 字节(抖音)小程序
-
-
-## 环境准备
-
-首先需要有 node,并确保 node 版本为 14 或以上,该部分的内容在 [快速上手](/guides/introduction/getting-started) 中已经提到了,我们这里就不再赘述了。
-
-使用 `node -v` 来查看当前 node 版本
-
-```shell
-$ myapp node -v
-v14.19.3
-```
-
-待会儿我们需要部署到不同的小程序平台,所以需要对应小程序的 IDE 模拟器进行调试,以下是各小程序 IDE 下载地址,您只需要下载需要的平台的开发者工具即可,本文以微信开发者工具为例。
-
-
-
-- [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)
-- [支付宝开发者工具](https://opendocs.alipay.com/mini/ide/download)
-- [抖音开发者工具](https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/developer-instrument/download/developer-instrument-update-and-download)
-- [百度开发者工具](https://smartprogram.baidu.com/docs/develop/devtools/history/)
-- [QQ 开发者工具](https://q.qq.com/wiki/tools/devtool/)
-- [快手开发者工具](https://mp.kuaishou.com/docs/develop/developerTools/downloadPath.html)
-
-## 配置小程序
-
-打开项目根目录下的 mor.config.ts 文件,该文件是 mor 项目的主要配置文件,根据 [快速上手](/guides/introduction/getting-started) 初始化生成的配置有两份:
-
-1. 其中 `target` 值为 `wechat` 的,代表我们编译目标是微信小程序,这一份配置默认名称为 `wechat-miniprogram`
-2. 另一份 `target` 值为 `alipay` 的,代表我们编译目标是支付宝小程序,这一份配置默认名称为 `alipay-miniprogram`
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'wechat-miniprogram',
- sourceType: 'wechat',
- target: 'wechat',
- compileType: 'miniprogram',
- compileMode: 'bundle'
- },
- {
- name: 'alipay-miniprogram',
- sourceType: 'wechat',
- target: 'alipay',
- compileType: 'miniprogram',
- compileMode: 'bundle'
- }
-])
-```
-
-接下来我们添加一份字节(抖音)小程序的配置:
-
-1. 首先明确我们编译目标为字节小程序,需要把 `target` 值设置为 `bytedance`
-2. 然后再给这份配置起一个名字,就叫 `douyin` ,把 `name` 设置为 `douyin`
-3. 其他的配置就先复制一份,更多具体配置项可查阅 [MorJS 基础 - 配置](/guides/basic/config)
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- ...
- {
- name: 'douyin', // 配置名称
- sourceType: 'wechat', // 源码 DSL 类型
- target: 'bytedance', // 编译目标平台
- compileType: 'miniprogram', // 编译类型
- compileMode: 'bundle', // 编译模式
- }
-]
-```
-
-如果你 `npm run dev` 命令行没有关闭的话,你会发现 `dist/` 下多出来一份 `dist/bytedance` 的文件,恭喜你完成了字节(抖音)端的小程序编译构建,这就是用于抖音端的开发产物啦~ 🎉 🎉 🎉
-
-## 实作页面组件
-
-接下来我们将对目前的初始化项目添加页面和组件。如你所见,初始化后的页面已经具备了显示 Tode List 和添加 Todo 功能,下面我们使用添加页面来实现编辑 Todo 功能,使用添加组件来实现删除 Todo 功能。
-
-### 添加页面
-
-#### 页面配置
-
-1. 在 `src/pages` 下创建文件夹 `src/pages/edits-todo` 用于存放编辑 Todo 功能相关的页面
-2. 在该文件夹下创建小程序页面的四个基础文件 `edits-todo.wxml` `edits-todo.less` `edits-todo.ts` `edits-todo.json`
-3. 打开 `edits-todo.json` 文件进行编译,先写一个 `{}` 作为空配置
-4. 在页面配置 `src/app.json` 中添加该页面到 `pages` 中
-
-```json
-{
- "pages": [
- "pages/todos/todos",
- "pages/add-todo/add-todo",
- "pages/edit-todo/edit-todo"
- ]
-}
-```
-
-> 1. 关于 `xml` 文件,若项目初始化时选择的是支付宝 DSL,页面的基础文件可改为 `edits-todo.axml`
-> 2. 关于 `css` 文件,MorJS 支持 wxss/acss/less/scss 文件类型,开发者可选择适合的文件格式进行编写
-
-#### 页面功能
-
-1. 编辑入口:首页 `src/pages/todos` 需要添加一下编辑的入口,修改一下首页的样式,js 中需要增加点击跳转方法,并把该项的 index 传给页面,用于标记哪一项的内容需要被编辑。
-
-```xml
-
-
-```
-
-```typescript
-// src/pages/todos/todos.ts
-import { wPage } from '@morjs/core'
-
-wPage({
- ...,
- editTodo(e) {
- my.navigateTo({url: `../edit-todo/edit-todo?index=${e.target.targetDataset.index}`})
- },
-})
-```
-
-```css
-/* src/pages/todos/todos.less */
-.todo-items {
- padding: 50rpx 30rpx;
-}
-.todo-item {
- display: flex;
- align-items: center;
-}
-.todo-item-text {
- width: 360rpx;
-}
-.todo-item-edit {
- margin: 0 20rpx;
-}
-```
-
-2. 编辑功能:
-
-- xml 文件中需要一个 input 用于显示和修改被编辑项的内容和一个按钮用于触发完成编辑
-- css 文件编辑页面样式
-- js 文件中,对页面传入的 index 对应的内容进行保存,提供给 xml 中的 input 显示,并添加一个方法用于按钮点击后触发
-
-```xml
-
-
-
-
-
-
-
-```
-
-```typescript
-// src/pages/todos/edit-todos.ts
-import { wPage } from '@morjs/core'
-
-const app = getApp()
-
-wPage({
- onLoad(query: any): void {
- this.setData({
- index: query.index,
- inputValue: app.todos[query.index].text
- })
- },
-
- data: {
- index: '',
- inputValue: ''
- },
-
- onBlur(e: any) {
- this.setData({
- inputValue: e.detail.value
- })
- },
-
- edit() {
- const { index, inputValue } = this.data
- app.todos[index].text = inputValue
- my.navigateBack()
- }
-})
-```
-
-```css
-/* src/pages/todos/edit-todos.less */
-.page-edit-todo {
- display: flex;
- flex: 1;
- flex-direction: column;
-}
-
-.edit-todo {
- padding: 40px;
- flex-grow: 1;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.edit-todo-input {
- display: block;
- font-size: 50rpx;
- font-weight: 100;
- padding: 5px 5px;
- background: none;
- border: none;
- border-bottom: 1px solid #dfdfdf;
- color: #0effd6;
- width: 100%;
-}
-
-.todo-footer {
- padding: 50rpx 0 100rpx;
- font-size: 48rpx;
- font-weight: 200;
- text-align: center;
-}
-```
-
-```json
-// src/pages/todos/edit-todos.json
-{
- "usingComponents": {
- "add-button": "/components/add-button/add-button"
- }
-}
-```
-
-3. 通过上述流程后,我们在 todo list 的每一项后面都会有一个「编辑」按钮,点击将会调转到编辑页,修改完内容后点击编辑页下方的按钮即可报错并回到 todo list 页,以上,恭喜你学会了怎么添加和编辑页面代码!🎉 🎉 🎉
-
-### 添加组件
-
-#### 组件配置
-
-1. 在 `src/components` 下创建文件夹 `delete-check` 用于存放删除 Todo 功能相关的组件
-2. 在该文件夹下创建小程序组件的四个基础文件 `delete-check.wxml` `delete-check.less` `delete-check.ts` `delete-check.json`
-3. 在需要使用到该组件的页面 `todos.json` 中配置引入该组件
-
-```json
-// src/pages/todos/todos.json
-{
- "usingComponents": {
- "add-button": "../../components/add-button/add-button",
- "delete-check": "../../components/delete-check/delete-check"
- }
-}
-```
-
-4. 在需要使用到该组件的页面 `todos.wxml` 中使用引入的组件
-
-```xml
-
-
- ...
-
-
-
-```
-
-#### 组件功能
-
-1. 删除入口:首页 `src/pages/todos` 需要添加一下删除的触发入口,修改一下首页的样式,js 中需要增加点击删除方法,并把该项的 index 传给组件,用于标记哪一项的内容需要被删除,同时添加一个方法 onCancelDel 用于设置 showDeleteCheck 为 false 关闭删除确认框。
-
-```xml
-
-
-```
-
-```typescript
-// src/pages/todos/todos.ts
-import { wPage } from '@morjs/core'
-
-wPage({
- data: {
- checkIndex: '',
- showDeleteCheck: false
- },
- // 打开删除框
- delTodo(e) {
- const index = e.target?.targetDataset?.index || e.target?.dataset?.index
- this.setData({
- checkIndex: index,
- showDeleteCheck: true
- })
- },
- // 关闭删除框
- onCancelDel(e) {
- this.setData({
- todos: app.todos,
- checkIndex: '',
- showDeleteCheck: false
- })
- }
-})
-```
-
-```css
-/* src/pages/todos/todos.less */
-.todo-item-del {
- margin: 0 20rpx;
- color: crimson;
-}
-```
-
-2. 删除功能:
-
-- xml 文件用于显示弹窗的浮层,其中一个确认删除按钮用于触发删除,一个取消按钮用于关闭弹窗
-- css 文件编辑页面样式
-- js 文件中,对页面传入的 index 对应的内容进行保存,提供给 xml 中显示,并添加一个删除方法和一个关闭弹窗方法提供给 xml 点击触发
-
-```xml
-
-
-
- 确认删除「{{text}}」
-
- 删除
- 取消
-
-
-
-```
-
-```typescript
-// src/components/delete-check/delete-check.ts
-import { wComponent } from '@morjs/core'
-
-// 获取全局 app 实例
-const app = getApp()
-
-wComponent({
- props: {
- checkIndex: '',
- onCancelDel: () => {}
- },
- data: {
- text: ''
- },
- created() {
- const text = app.todos[this.props.checkIndex].text
- this.setData({ text })
- },
- methods: {
- del() {
- app.todos.splice(this.props.checkIndex, 1)
- this.cancel()
- },
- cancel() {
- this.props.onCancelDel()
- }
- }
-})
-```
-
-```css
-/* src/components/delete-check/delete-check.less */
-.delete-check-bg {
- width: 100vw;
- height: 100vh;
- background-color: rgba(#fff, 0.6);
- position: fixed;
- top: 0;
- left: 0;
- display: flex;
- justify-content: center;
- align-items: center;
- .delete-check {
- width: 400rpx;
- border: 1rpx solid #ccc;
- background: #fff;
- border-radius: 8rpx;
- }
- .delete-check__text {
- padding: 50rpx 30rpx;
- text-align: center;
- }
- .delete-check__btn-box {
- display: flex;
- align-items: center;
- .btn-del {
- width: 50%;
- text-align: center;
- color: crimson;
- padding: 20rpx;
- border: 1rpx solid #ccc;
- border-right: none;
- }
- .btn-cancel {
- width: 50%;
- text-align: center;
- padding: 20rpx;
- border: 1rpx solid #ccc;
- }
- }
-}
-```
-
-```json
-// src/components/delete-check/delete-check.json
-{
- "component": true
-}
-```
-
-3. 通过上述流程后,我们在 todo list 的每一项后面都会有一个「删除」按钮,点击将会打开删除弹窗,点击删除后即可删除该项,以上,恭喜你学会了怎么添加和编辑组件代码!🎉 🎉 🎉
diff --git a/website/docs/guides/migrate-from-original-miniprogram-to-mor.md b/website/docs/guides/migrate-from-original-miniprogram-to-mor.md
deleted file mode 100644
index 439d962d..00000000
--- a/website/docs/guides/migrate-from-original-miniprogram-to-mor.md
+++ /dev/null
@@ -1,166 +0,0 @@
-# 原生小程序接入
-
-本文主要描述从没有任何框架依赖的原生小程序,迁移并接入到 MorJS 的步骤。
-
-## 环境准备
-
-首先需要有 [node](https://nodejs.org/zh-cn/), 并确保 `node` 版本为 `14` 或以上。
-
-```bash
-$ node -v
-v14
-```
-
-## 增加必要的依赖
-
-> 如果不存在 `package.json`,建议在安装依赖前,先执行 `npm init --yes` 生成 `package.json` 文件。
-
-- 步骤一:进入小程序项目根目录:`cd your_project_dir`
-- 步骤二:添加 MorJS 必要的依赖:`npm i @morjs/cli -D && npm i @morjs/core --save`
-
-```diff
-{
- "dependencies": {
-+ "@morjs/core": "*",
- },
- "devDependencies": {
-+ "@morjs/cli": "*",
- }
- }
-```
-
-## 调整目录结构
-
-你需要将小程序的源码文件(`app.json`、`app.js`、`app.acss`、`pages`、`components`、`mini.project.json` 等文件),从项目根目录移动到 `src` 中
-
-- 调整前:
-
-```
-.
-├── .gitignore
-├── LEGAL.md
-├── app.acss
-├── app.js
-├── app.json
-├── mini.project.json
-└── pages
- └── index
- ├── index.axml
- ├── index.acss
- ├── index.json
- └── index.js
-└── components
- └── index
- ├── index.axml
- ├── index.acss
- ├── index.json
- └── index.js
-```
-
-- 调整后:
-
-```
-.
-├── .gitignore
-├── LEGAL.md
-└── src
- ├── app.acss
- ├── app.js
- ├── app.json
- ├── mini.project.json
- └── pages
- └── index
- ├── index.axml
- ├── index.acss
- ├── index.json
- └── index.js
- └── components
- └── index
- ├── index.axml
- ├── index.acss
- ├── index.json
- └── index.js
-```
-
-## 增加配置
-
-在项目根目录中增加配置文件 `mor.config.ts`:
-
-```typescript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'alipay',
- target: 'alipay'
- },
- {
- name: 'wechat',
- sourceType: 'alipay',
- target: 'wechat'
- }
-])
-```
-
-这里的配置仅供参考,有关配置的详细说明和使用方式,参见: [MorJS 基础 - 配置](/guides/basic/config.md)。
-
-## 配置脚本
-
-```diff
-{
- "scripts": {
-+ "dev": "mor compile -w",
-+ "mock": "mor compile -w --mock",
-+ "build": "mor compile --production"
- }
- }
-```
-
-## 开发和验证
-
-接下来,就可以开始投入开发和验证了:
-
-```bash
-# 项目根目录执行命令 👇
-npm run dev # 即 mor compile -w
-```
-
-执行命令后的效果如下:
-
-```
-[mor] ⚑ 当前 MorJS 为开源版本: @morjs/cli
-[mor] ℹ 发现配置文件: mor.config.ts
-[mor] ✔ 配置文件加载成功: mor.config.ts
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: ali
- 编译目标: 支付宝小程序
- 编译类型: 小程序
- 编译模式: bundle
- 源码目录: src
- 输出目录: dist/alipay
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 启动文件监听模式
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 15.520708 ms
-[mor] ✔ 编译完成, 耗时: 581.601542 ms
-
-[mor] ℹ 准备配置中, 即将开始编译 👇
- 配置名称: wechat
- 编译目标: 微信小程序
- 编译类型: 小程序
- 编译模式: bundle
- 源码目录: src
- 输出目录: dist/wechat
-[mor] ℹ 已开启缓存, 可通过 --no-cache 关闭
-[mor] ℹ 启动文件监听模式
-[mor] ℹ 开始编译 ...
-[mor] ℹ 依赖分析中 ...
-[mor] ℹ 依赖分析完成: 耗时: 10.393 ms
-[mor] ✔ 编译完成, 耗时: 464.704167 ms
-```
-
-在 [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html) 中打开 `dist/wechat` 目录即可开始微信小程序开发预览
-
-在 [支付宝小程序开发者工具](https://opendocs.alipay.com/mini/ide/download) 中打开 `dist/alipay` 目录即可开始微信小程序开发预览
diff --git a/website/docs/specifications/README.md b/website/docs/specifications/README.md
deleted file mode 100644
index b7c52a69..00000000
--- a/website/docs/specifications/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# 规范介绍
-
-> MorJS 是一种开发方式,以微信小程序或支付宝小程序 DSL 为基础的渐进式工程化开发迭代方案,希望能够让小程序开发过程变得幸福 ^\_^
->
-> 我们期望通过一系列规范的指引,来确保 MorJS 工程的长期可维护性和健壮性。
-
-## 研发规范
-
-- [代码样式规范](/specifications/code-styles.md)
-- [代码提交和审查规范](/specifications/git-commit-and-review.md)
-
-## 技术规范
-
-- [JS 依赖库规范](/specifications/js.md)
-- [多端组件库规范](/specifications/component.md)
-- [多端运行时基础库规范](/specifications/runtime.md)
-
-## 文档规范
-
-- [文档编写及排版规范](/specifications/document.md)
diff --git a/website/docs/specifications/code-styles.md b/website/docs/specifications/code-styles.md
deleted file mode 100644
index aea5747e..00000000
--- a/website/docs/specifications/code-styles.md
+++ /dev/null
@@ -1,176 +0,0 @@
-# 代码样式规范
-
-`MorJS` 仓库已配置了 `eslint`、`tsconfig.json`、`prettier`、`husky`、`lint-staged` 等 `lint` 工具和格式化工具,用于确保多人协作下的代码样式和编码习惯保持基本一致。
-
-以下为项目中各个 `lint` 的配置,如无必要,请勿修改。
-
-## `eslint` 配置
-
-```javascript
-// @ts-check
-const { defineConfig } = require('eslint-define-config')
-
-module.exports = defineConfig({
- root: true,
- extends: [
- 'eslint:recommended',
- 'plugin:node/recommended',
- 'plugin:@typescript-eslint/recommended'
- ],
- parser: '@typescript-eslint/parser',
- parserOptions: {
- sourceType: 'module',
- ecmaVersion: 2020
- },
- globals: {
- my: true,
- wx: true,
- tt: true,
- qq: true,
- swan: true,
- dd: true,
- Swiper: true
- },
- env: {
- node: true,
- browser: true,
- es6: true
- },
- rules: {
- eqeqeq: ['warn', 'always', { null: 'never' }],
- 'no-debugger': ['error'],
- 'no-empty': ['warn', { allowEmptyCatch: true }],
- 'no-process-exit': 'off',
- 'no-useless-escape': 'off',
- 'prefer-const': [
- 'warn',
- {
- destructuring: 'all'
- }
- ],
-
- 'node/no-missing-import': [
- 'error',
- {
- allowModules: ['types', 'estree', 'testUtils', 'stylus'],
- tryExtensions: ['.ts', '.js', '.d.ts']
- }
- ],
- 'node/no-missing-require': [
- 'error',
- {
- // for try-catching yarn pnp
- allowModules: ['pnpapi'],
- tryExtensions: ['.ts', '.js', '.d.ts']
- }
- ],
- 'node/no-deprecated-api': 'off',
- 'node/no-unpublished-import': 'off',
- 'node/no-unpublished-require': 'off',
- 'node/no-unsupported-features/es-syntax': 'off',
- '@typescript-eslint/no-empty-function': [
- 'error',
- { allow: ['arrowFunctions'] }
- ],
- '@typescript-eslint/no-empty-interface': 'off',
- '@typescript-eslint/no-explicit-any': 'off',
- '@typescript-eslint/no-extra-semi': 'off', // conflicts with prettier
- '@typescript-eslint/no-inferrable-types': 'off',
- '@typescript-eslint/no-var-requires': 'off'
- },
- overrides: [
- {
- files: ['*.js'],
- rules: {
- '@typescript-eslint/explicit-module-boundary-types': 'off'
- }
- },
- {
- files: ['*.d.ts'],
- rules: {
- '@typescript-eslint/triple-slash-reference': 'off'
- }
- }
- ]
-})
-```
-
-## `tsconfig.json` 配置
-
-基础 `tsconfig.base.json` 配置
-
-```json
-{
- "compilerOptions": {
- "declaration": true,
- "target": "ES2019",
- "importHelpers": true,
- "moduleResolution": "Node",
- "sourceMap": true,
- "noImplicitOverride": true,
- "noUnusedLocals": true,
- "esModuleInterop": true,
- "lib": ["ES6", "ESNext", "DOM"]
- }
-}
-```
-
-运行时 `tsconfig.json` 配置
-
-```json
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "target": "ES5",
- "rootDir": "./src",
- "outDir": "./lib",
- "module": "CommonJS",
- "skipLibCheck": true,
- "typeRoots": ["./node_modules/@types/"]
- },
- "include": ["./src"]
-}
-```
-
-编译时 `tsconfig.json` 配置
-
-```json
-{
- "extends": "../../tsconfig.base.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./lib",
- "module": "CommonJS",
- "typeRoots": ["./node_modules/@types/"]
- },
- "include": ["src"]
-}
-```
-
-## `prettier` 配置
-
-```json
-{
- "semi": false,
- "tabWidth": 2,
- "singleQuote": true,
- "printWidth": 80,
- "trailingComma": "none",
- "overrides": [
- {
- "files": ["*.json5"],
- "options": {
- "singleQuote": false,
- "quoteProps": "preserve"
- }
- },
- {
- "files": ["*.yml"],
- "options": {
- "singleQuote": false
- }
- }
- ],
- "plugins": ["prettier-plugin-organize-imports"]
-}
-```
diff --git a/website/docs/specifications/component.md b/website/docs/specifications/component.md
deleted file mode 100644
index dc95be7b..00000000
--- a/website/docs/specifications/component.md
+++ /dev/null
@@ -1,319 +0,0 @@
-# 多端组件库规范
-
-## 概要
-
-MorJS 在编译的过程中,不会处理 `node_modules` 中的小程序多端组件,所以需要每个组件或者组件库在输出给到业务使用的时候都是适配了多端,如: **微信小程序、支付宝小程序、字节小程序、QQ 小程序、百度小程序等**,因此需要各个组件、组件库要做好严格的自测以确保多端下的兼容性。
-
-## 特别说明
-
-- 请在输出组件 **JS** 代码的时候输出 `ES5` 版本的
- - 小程序并不会去做 `node_modules` 里面的 `ESNext` 语法转换
- - 建议使用 `tsc` 输出 `ES5` 代码,原因参考: [小程序 JS 依赖库规范](/specifications/js)
-- 组件输出多端版本的时候,建议使用 MorJS 的 `compile` 能力来输出产物
-- 组件的运行时必须是采用 `aComponent` 或 `wComponent` 来替代 `Component`,用法请参考: [运行时文档](/guides/basic/runtime)
-- 组件库与组件的规范是一致的,区别只是输出多个组件还是单个组件
-- 各个小程序平台的兼容性问题,超出多端编译覆盖范围的,需要自行处理,如支付宝小程序是否开启 `component2` 支持的情况
-
-## 多端适配简要说明
-
-- MorJS 是通过目录结构结合 `package.json` 的目录指向字段配置来实现的,在 NPM 组件 `npm publish` 环节中需要将已经适配好多端的文件编译处理输出发布;
-- MorJS 的编译环节会根据业务引用路径结合 `NPM 组件` 目录配置来按需拷贝对应的组件文件,并改写对应的引用路径来实现一个路径多个端可兼容运行;
-- 请注意: MorJS 是不会在编译环节动态编译处理 `node_modules` 的 `NPM 组件`,原因大致有以下几点:
- - 动态编译性能非常差: `node_modules` 里面文件繁多,需要所有文件都去判断是否需要进行编译处理,效率非常低;
- - 排查问题困难: 动态转换会变成黑箱,使用方无法直接感知到转换过程中所做的处理;
- - 无法直接给原生小程序复用: 组件在满足一定条件下,是可以同时给非 MorJS 的小程序工程使用的,如果采用动态编译就有且只能给 MorJS 工程使用
- - 降低了组件提供方的自测责任: 在 `NPM 组件` 输出时直接提供了编译后产物,能够要求 `NPM 组件` 做好对应测试,而不是依赖于 MorJS 动态编译来确保可用性
- - ...
-
-### 目录字段配置
-
-MorJS 是通过 `package.json` 中指定的入口字段来做多端逻辑区分的,详细如下:
-
-**重要: `main` 字段遵从 `NPM` 的 `package.json` 本身对于该字段的定义,参见 [文档](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#main)。其他多端入口字段为目录配置字段。**
-
-- `main`: 默认加载入口, 用于存放 `CommonJS` 产物
- - 未指定多端入口的情况下,所有端都会读取该入口
- - 部分多端的情况下,未明确以下方字段指定入口的端,均会读取该缺省入口
-- `module`: 默认加载入口,用于存放 `ESModule` 产物, 作用和 `main` 类似
- - 仅当配置为 `ESNext` 的端默认情况下会优先使用 `module`
-- `alipay`: 支付宝小程序加载入口
-- `miniprogram`: 微信小程序加载入口,**该字段和微信/QQ/企业微信小程序官方一致**
-- `wechat`: 微信小程序加载入口
- - 优先级比 `miniprogram` 高
-- `qq`: QQ 小程序加载入口
- - 优先级比 `miniprogram` 高
-- `bytedance`: 字节跳动小程序加载入口
-- `baidu`: 百度小程序加载入口
-- `dingding`: 钉钉小程序加载入口
-- `taobao`: 淘宝小程序加载入口
-- `kuaishou`: 快手小程序加载入口
-- `miniforweb`: Web 应用专用 **小程序产物** 加载入口,需要注意的是这个目录存放的依然是小程序产物,不要存放 Web 产物,`MorJS` 会在编译时自动解析并将其转换为 Web 产物
-
-请注意,以上的入口字段规范是要求 `NPM 组件` 支持哪个端就 **必须设置好对应的字段**。
-
-### 多端适配输出目录结构说明
-
-这里主要是阐述输出目录,整体的 `NPM 组件` 说明,请参考下面的组件示例说明环节
-
-#### `exmaple-component` 的 `package.json` 配置示例
-
-```javascript
-{
- "name": "exmaple-component",
-
- // 缺省目录设置,JS 入口文件为 lib/index.js,
- // 未指定端的小程序组件文件会从该目录下获取,
- // 如将该字段配置为 "lib/index.js", 则有可能会
- // 无法找到正确的组件文件
- "main": "lib",
-
- // 微信小程序的入口配置,请注意,只需要配置目录名即可
- "miniprogram": "miniprogram_dist",
-
- // 支付宝小程序的入口配置,请注意,只需要配置目录名即可
- "alipay": "alipay",
-
- // 建议配置只输出组件内容目录
- "files": [
- "lib",
- "miniprogram_dist",
- "alipay"
- ]
-}
-```
-
-#### `exmaple-component` 的整体输出目录结构示例
-
-```bash
-- lib
- - index.js
- - index.axml
- - index.acss
- - index.json
-- miniprogram_dist
- - lib
- - index.js
- - index.wxml
- - index.wxss
- - index.json
-- alipay
- - lib
- - index.js
- - index.wxml
- - index.wxss
- - index.json
-- package.json
-```
-
-**请注意: miniprogram_dist 和 alipay 目录下是有 lib 目录的!**
-
-#### 使用方引用 `NPM 组件` 示例
-
-```javascript
-{
- "usingComponents": {
- "demo-component": "exmaple-component/lib/index"
- }
-}
-```
-
-#### MorJS 编译说明
-
-默认情况下,使用方引用组件 `exmaple-component` 去掉多端专属的那个目录就可以了。在不同端下 MorJS 会根据组件的 `package.json` 中的相关入口字段,如 `miniprogram` 字段来自动匹配加上对应的路径,来确保使用方只需一个引用路径,即可在多个端上生效。
-
-## 组件完整示例
-
-为了解决组件本地预览的问题,建议组件本身也是一个小程序项目。只是在输出的时候采用指定目录输出的形式。
-
-请注意: 组件的运行时必须是用 `aApp` 或 `wPage` 替代 `App`,`aPage` 或 `wPage` 替代 `Page`,`aComponent` 或 `wComponent` 替代 `Component`。
-
-### 组件源代码
-
-这里以项目根目录的 `component` 为源代码目录:
-
-```bash
-- component
- - index.js
- - index.less
- - index.axml
- - index.json
-```
-
-### 小程序目录规范完善项目
-
-- example 目录: 小程序页面,用于直接引用组件,本地预览用
-- app: 小程序入口
-- mor.config.ts: MorJS 小程序配置文件
-- mini.project.json: 支付宝小程序项目配置文件
-- project.config.json: 微信小程序项目配置文件
-- project.tt.json: 字节小程序项目配置文件
- - 也可以直接使用 project.config.json 文件
-- project.qq.json: QQ 小程序项目配置文件
- - 也可以直接使用 project.config.json 文件
-- project.swan.json: 百度小程序项目配置文件
-- project.taobao.json: 淘宝小程序项目配置文件
-- project.kuaishou.json: 淘宝小程序项目配置文件
- - 也可以直接使用 mini.project.json 文件
-- project.dd.json: 钉钉小程序项目配置文件
- - 也可以直接使用 mini.project.json 文件
-- package.json: NPM 依赖配置文件
-
-```bash
-- example
- - index.js
- - index.wxss
- - index.wxml
- - index.json
-- app.js
-- app.json
-- package.json
-- mini.project.json
-- project.config.json
-- project.tt.json
-- project.qq.json
-- project.swan.json
-- project.dd.json
-- mor.config.ts
-```
-
-`example/index.json` 示例:
-
-- 引用组件
-
-```javascript
-{
- "defaultTitle": "组件测试页",
- "usingComponents": {
- "demo-component": "../component/index"
- }
-}
-
-```
-
-`example/index.wxml` 示例:
-
-```html
-
-
-
-```
-
-`app.json` 示例:
-
-- 增加页面入口
-
-```json
-{
- "pages": ["example/index"]
-}
-```
-
-`mor.config.ts` 内容示例:
-
-- IDE 预览配置
-
-```javascript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'alipay',
- target: 'alipay',
- compileMode: 'bundle'
- },
- {
- name: 'wechat',
- sourceType: 'alipay',
- target: 'wechat',
- compileMode: 'bundle'
- }
-])
-```
-
-`package.json` 内容示例:
-
-- 增加 scripts 配置
-
-```javascript
-{
- "scripts": {
- "compile": "mor compile",
- "dev": "mor compile --watch"
- }
-}
-```
-
-`project.config.json` 内容示例:
-
-```json
-{
- "miniprogramRoot": "dist/wechat"
-}
-```
-
-`mini.project.json` 内容示例:
-
-```json
-{
- "miniprogramRoot": "dist/alipay"
-}
-```
-
-项目运行:
-
-`npm run dev` 然后微信小程序 IDE、支付宝小程序 IDE 等打开项目根目录即可。
-
-### 构建处理
-
-MorJS 支持配置文件指定,因此在组件输出的时候,我们可以利用 MorJS 的 `compile` 能力来直接输出支持多端的构建产物。
-这里以组件输出`lib`目录为示例。
-
-项目根目录下新增 `mor.build.config.ts` 文件,用于组件编译输出
-
-```javascript
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'alipay',
- sourceType: 'alipay',
- target: 'alipay',
- compileMode: 'default',
- srcPath: './component',
- outputPath: './alipay'
- },
- {
- name: 'wechat',
- sourceType: 'alipay',
- target: 'wechat',
- compileMode: 'default',
- srcPath: './component',
- outputPath: './miniprogram_dist'
- }
-])
-```
-
-pacakge.json 内容示例:
-
-- 增加相关 `scripts`
-
-```javascript
-{
- "miniprogram": "miniprogram_dist",
- "alipay": "alipay",
- "files": [
- "miniprogram_dist",
- "alipay"
- ],
- "scripts": {
- "clean": "rm -rf alipay miniprogram_dist", // 清空构建产物目录
- "build": "npm run clean && mor compile --production --config mor.build.config.ts", // 构建产物
- "prepublishOnly": "npm run build", // 发布前进行一次构建,确保发布的代码是最新版本
- "compile": "mor compile", // 用于本地预览
- "dev": "mor compile --watch" // 用于本地预览
- }
-}
-```
-
-后续通过 `npm publish` 发布即可
diff --git a/website/docs/specifications/development.md b/website/docs/specifications/development.md
deleted file mode 100644
index c19c0026..00000000
--- a/website/docs/specifications/development.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 多端研发规范
-
-> 规范编写中
->
-> 本规范主要侧重于使用 mor 来编写项目时的一些最佳实践,如:
->
-> - 如何组织代码?
-> - 如何处理多端差异?
-> - 如何使用条件编译?
-> - 如何 mock ?
-> - 如何配置多端产物?
diff --git a/website/docs/specifications/document.md b/website/docs/specifications/document.md
deleted file mode 100644
index 9cfe7e2c..00000000
--- a/website/docs/specifications/document.md
+++ /dev/null
@@ -1,287 +0,0 @@
-# 文档编写及排版规范
-
-## 如何写好文档?
-
-参见 👉🏻 [文档四象限](https://documentation.divio.com/)
-
-## 文案排版规范
-
-规范来源: [中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines/blob/master/README.zh-Hans.md)
-
-统一中文文案、排版的相关用法,降低团队成员之间的沟通成本,增强网站气质。
-
----
-
-### 空格
-
-> 「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。
->
-> 与大家共勉之。」——[vinta/pangu.js](https://github.com/vinta/pangu.js)
-
-#### 中英文之间需要增加空格
-
-正确:
-
-> 在 LeanCloud 上,数据存储是围绕 `AVObject` 进行的。
-
-错误:
-
-> 在 LeanCloud 上,数据存储是围绕`AVObject`进行的。
->
-> 在 LeanCloud 上,数据存储是围绕`AVObject` 进行的。
-
-完整的正确用法:
-
-> 在 LeanCloud 上,数据存储是围绕 `AVObject` 进行的。每个 `AVObject` 都包含了与 JSON 兼容的 key-value 对应的数据。数据是 schema-free 的,你不需要在每个 `AVObject` 上提前指定存在哪些键,只要直接设定对应的 key-value 即可。
-
-例外:「豆瓣 FM」等产品名词,按照官方所定义的格式书写。
-
-#### 中文与数字之间需要增加空格
-
-正确:
-
-> 今天出去买菜花了 5000 元。
-
-错误:
-
-> 今天出去买菜花了 5000 元。
->
-> 今天出去买菜花了 5000 元。
-
-#### 数字与单位之间需要增加空格
-
-正确:
-
-> 我家的光纤入屋宽带有 10 Gbps,SSD 一共有 20 TB
-
-错误:
-
-> 我家的光纤入屋宽带有 10Gbps,SSD 一共有 20TB
-
-例外:度数/百分比与数字之间不需要增加空格:
-
-正确:
-
-> 角度为 90° 的角,就是直角。
->
-> 新 MacBook Pro 有 15% 的 CPU 性能提升。
-
-错误:
-
-> 角度为 90 ° 的角,就是直角。
->
-> 新 MacBook Pro 有 15 % 的 CPU 性能提升。
-
-#### 全角标点与其他字符之间不加空格
-
-正确:
-
-> 刚刚买了一部 iPhone,好开心!
-
-错误:
-
-> 刚刚买了一部 iPhone ,好开心!
->
-> 刚刚买了一部 iPhone, 好开心!
-
-#### 用 `text-spacing` 来挽救?
-
-CSS Text Module Level 4 的 [`text-spacing`](https://www.w3.org/TR/css-text-4/#text-spacing-property) 和 Microsoft 的 [`-ms-text-autospace`]() 可以实现自动为中英文之间增加空白。不过目前并未普及,另外在其他应用场景,例如 macOS、iOS、Windows 等用户界面目前并不存在这个特性,所以请继续保持随手加空格的习惯。
-
-### 标点符号
-
-#### 不重复使用标点符号
-
-即使中国大陆的标点符号用法允许重复使用标点符号,但是这么做会破坏句子的美观性。
-
-正确:
-
-> 德国队竟然战胜了巴西队!
->
-> 她竟然对你说「喵」?!
-
-错误:
-
-> 德国队竟然战胜了巴西队!!
->
-> 德国队竟然战胜了巴西队!!!!!!!!
->
-> 她竟然对你说「喵」??!!
->
-> 她竟然对你说「喵」?!?!??!!
-
-### 全角和半角
-
-不明白什么是全角(全形)与半角(半形)符号?请查看维基百科条目『[全角和半角](https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2)』。
-
-#### 使用全角中文标点
-
-正确:
-
-> 嗨!你知道嘛?今天前台的小妹跟我说「喵」了哎!
->
-> 核磁共振成像(NMRI)是什么原理都不知道?JFGI!
-
-错误:
-
-> 嗨! 你知道嘛? 今天前台的小妹跟我说 "喵" 了哎!
->
-> 嗨!你知道嘛?今天前台的小妹跟我说"喵"了哎!
->
-> 核磁共振成像 (NMRI) 是什么原理都不知道? JFGI!
->
-> 核磁共振成像(NMRI)是什么原理都不知道?JFGI!
-
-#### 数字使用半角字符
-
-正确:
-
-> 这个蛋糕只卖 1000 元。
-
-错误:
-
-> 这个蛋糕只卖 1000 元。
-
-例外:在设计稿、宣传海报中如出现极少量数字的情形时,为方便文字对齐,是可以使用全角数字的。
-
-#### 遇到完整的英文整句、特殊名词,其内容使用半角标点
-
-正确:
-
-> 乔布斯那句话是怎么说的?「Stay hungry, stay foolish.」
->
-> 推荐你阅读《Hackers & Painters: Big Ideas from the Computer Age》,非常的有趣。
-
-错误:
-
-> 乔布斯那句话是怎么说的?「Stay hungry,stay foolish。」
->
-> 推荐你阅读《Hackers&Painters:Big Ideas from the Computer Age》,非常的有趣。
-
-### 名词
-
-#### 专有名词使用正确的大小写
-
-大小写相关用法原属于英文书写范畴,不属于本 wiki 讨论内容,在这里只对部分易错用法进行简述。
-
-正确:
-
-> 使用 GitHub 登录
->
-> 我们的客户有 GitHub、Foursquare、Microsoft Corporation、Google、Facebook, Inc.。
-
-错误:
-
-> 使用 github 登录
->
-> 使用 GITHUB 登录
->
-> 使用 Github 登录
->
-> 使用 gitHub 登录
->
-> 使用 g イん ĤЦ8 登录
->
-> 我们的客户有 github、foursquare、microsoft corporation、google、facebook, inc.。
->
-> 我们的客户有 GITHUB、FOURSQUARE、MICROSOFT CORPORATION、GOOGLE、FACEBOOK, INC.。
->
-> 我们的客户有 Github、FourSquare、MicroSoft Corporation、Google、FaceBook, Inc.。
->
-> 我们的客户有 gitHub、fourSquare、microSoft Corporation、google、faceBook, Inc.。
->
-> 我们的客户有 g イん ĤЦ8、キ ouЯƧqu ム гє、๓เςг๏ร๏Ŧt ς๏гק๏гคtเ๏ภn、900913、ƒ4ᄃëв๏๏к, IПᄃ.。
-
-注意:当网页中需要配合整体视觉风格而出现全部大写/小写的情形,HTML 中请使用标淮的大小写规范进行书写;并通过 `text-transform: uppercase;`/`text-transform: lowercase;` 对表现形式进行定义。
-
-#### 不要使用不地道的缩写
-
-正确:
-
-> 我们需要一位熟悉 TypeScript、HTML5,至少理解一种框架(如 React、Next.js)的前端开发者。
-
-错误:
-
-> 我们需要一位熟悉 Ts、h5,至少理解一种框架(如 RJS、nextjs)的 FED。
-
-### 争议
-
-以下用法略带有个人色彩,即:无论是否遵循下述规则,从语法的角度来讲都是**正确**的。
-
-#### 链接之间增加空格
-
-用法:
-
-> 请 [提交一个 issue](#) 并分配给相关同事。
->
-> 访问我们网站的最新动态,请 [点击这里](#) 进行订阅!
-
-对比用法:
-
-> 请[提交一个 issue](#)并分配给相关同事。
->
-> 访问我们网站的最新动态,请[点击这里](#)进行订阅!
-
-#### 简体中文使用直角引号
-
-用法:
-
-> 「老师,『有条不紊』的『紊』是什么意思?」
-
-对比用法:
-
-> “老师,‘有条不紊’的‘紊’是什么意思?”
-
-### 工具
-
-| 仓库 | 语言 |
-| ------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
-| [vinta/pangu.js](https://github.com/vinta/pangu.js) | JavaScript |
-| [serkodev/vue-pangu](https://github.com/serkodev/vue-pangu) | Vue.js (Web Converter) |
-| [huacnlee/auto-correct](https://github.com/huacnlee/auto-correct) | Ruby |
-| [huacnlee/autocorrect](https://github.com/huacnlee/autocorrect) | Rust, WASM, CLI |
-| [huacnlee/go-auto-correct](https://github.com/huacnlee/go-auto-correct) | Go |
-| [sparanoid/space-lover](https://github.com/sparanoid/space-lover) | PHP (WordPress) |
-| [nauxliu/auto-correct](https://github.com/NauxLiu/auto-correct) | PHP |
-| [jxlwqq/chinese-typesetting](https://github.com/jxlwqq/chinese-typesetting) | PHP |
-| [hotoo/pangu.vim](https://github.com/hotoo/pangu.vim) | Vim |
-| [sparanoid/grunt-auto-spacing](https://github.com/sparanoid/grunt-auto-spacing) | Node.js (Grunt) |
-| [hjiang/scripts/add-space-between-latin-and-cjk](https://github.com/hjiang/scripts/blob/master/add-space-between-latin-and-cjk) | Python |
-| [hustcc/hint](https://github.com/hustcc/hint) | Python |
-| [studygolang/autocorrect](https://github.com/studygolang/autocorrect) | Go |
-| [n0vad3v/Tekorret](https://github.com/n0vad3v/Tekorrect) | Python |
-| [VS Code - huacnlee.auto-correct](https://marketplace.visualstudio.com/items?itemName=huacnlee.auto-correct) | VS Code Extension |
-
-### 谁在这样做?
-
-| 网站 | 文案 | UGC |
-| -------------------------------------------------- | ---- | --- |
-| [Apple 中国](https://www.apple.com/cn/) | 是 | N/A |
-| [Apple 香港](https://www.apple.com/hk/) | 是 | N/A |
-| [Apple 台湾](https://www.apple.com/tw/) | 是 | N/A |
-| [Microsoft 中国](https://www.microsoft.com/zh-cn/) | 是 | N/A |
-| [Microsoft 香港](https://www.microsoft.com/zh-hk/) | 是 | N/A |
-| [Microsoft 台湾](https://www.microsoft.com/zh-tw/) | 是 | N/A |
-| [LeanCloud](https://leancloud.cn/) | 是 | N/A |
-| [V2EX](https://www.v2ex.com/) | 是 | 是 |
-| [Apple4us](https://apple4us.com/) | 是 | N/A |
-| [Ruby China](https://ruby-china.org/) | 是 | 是 |
-| [少数派](https://sspai.com/) | 是 | N/A |
-
-### 参考文献
-
-- [Guidelines for Using Capital Letters - ThoughtCo.](https://www.thoughtco.com/guidelines-for-using-capital-letters-1691724)
-- [Letter case - Wikipedia](https://en.wikipedia.org/wiki/Letter_case)
-- [Punctuation - Oxford Dictionaries](https://en.oxforddictionaries.com/grammar/punctuation)
-- [Punctuation - The Purdue OWL](https://owl.english.purdue.edu/owl/section/1/6/)
-- [How to Use English Punctuation Correctly - wikiHow](https://www.wikihow.com/Use-English-Punctuation-Correctly)
-- [格式 - openSUSE](https://zh.opensuse.org/index.php?title=Help:%E6%A0%BC%E5%BC%8F)
-- [全形和半形 - 维基百科](https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2)
-- [引号 - 维基百科](https://zh.wikipedia.org/wiki/%E5%BC%95%E8%99%9F)
-- [疑问惊叹号 - 维基百科](https://zh.wikipedia.org/wiki/%E7%96%91%E5%95%8F%E9%A9%9A%E5%98%86%E8%99%9F)
-
-### Forks
-
-衍生项目的用法可能与本项目存在差异。
-
-- [mzlogin/chinese-copywriting-guidelines](https://github.com/mzlogin/chinese-copywriting-guidelines)
diff --git a/website/docs/specifications/git-commit-and-review.md b/website/docs/specifications/git-commit-and-review.md
deleted file mode 100644
index 9385ec43..00000000
--- a/website/docs/specifications/git-commit-and-review.md
+++ /dev/null
@@ -1,292 +0,0 @@
-# 代码提交和审查规范
-
-## 约定式代码提交(Git Commit)
-
-### 概述
-
-约定式提交规范是一种基于提交信息的轻量级约定。
-它提供了一组简单规则来创建清晰的提交历史;
-这更有利于编写自动化工具。
-通过在提交信息中描述功能、修复和破坏性变更,
-使这种惯例与 [SemVer](http://semver.org) 相互对应。
-
-提交说明的结构如下所示:
-
----
-
-原文:
-
-```text
-[optional scope]:
-
-[optional body]
-
-[optional footer(s)]
-```
-
-译文:
-
-```text
-<类型>[可选 范围]: <描述>
-
-[可选 正文]
-
-[可选 脚注]
-```
-
----
-
-提交说明包含了下面的结构化元素,以向类库使用者表明其意图:
-
-1. **fix:** _类型_ 为 `fix` 的提交表示在代码库中修复了一个 bug(这和语义化版本中的 [`PATCH`](https://semver.org/lang/zh-CN/#%E6%91%98%E8%A6%81) 相对应)。
-2. **feat:** _类型_ 为 `feat` 的提交表示在代码库中新增了一个功能(这和语义化版本中的 [`MINOR`](https://semver.org/lang/zh-CN/#%E6%91%98%E8%A6%81) 相对应)。
-3. **BREAKING CHANGE:** 在脚注中包含 `BREAKING CHANGE:` 或 <类型>(范围) 后面有一个 `!` 的提交,表示引入了破坏性 API 变更(这和语义化版本中的 [`MAJOR`](https://semver.org/lang/zh-CN/#%E6%91%98%E8%A6%81) 相对应)。破坏性变更可以是任意 _类型_ 提交的一部分。
-4. 除 `fix:` 和 `feat:` 之外,也可以使用其它提交 _类型_ ,例如 [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional)(基于 [Angular 约定](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines))中推荐的 `build:`、`chore:`、`ci:`、`docs:`、`style:`、`refactor:`、`perf:`、`test:` 等。
-5. 脚注中除了 `BREAKING CHANGE: ` ,其它条目应该采用类似 [git trailer format](https://git-scm.com/docs/git-interpret-trailers) 这样的惯例。
-
-其它提交类型在约定式提交规范中并没有强制限制,并且在语义化版本中没有隐式影响(除非它们包含 BREAKING CHANGE)。
-
-可以为提交类型添加一个围在圆括号内的范围,以为其提供额外的上下文信息。例如 `feat(parser): adds ability to parse arrays.`。
-
-### 示例
-
-#### 包含了描述并且脚注中有破坏性变更的提交说明
-
-```text
-feat: allow provided config object to extend other configs
-
-BREAKING CHANGE: `extends` key in config file is now used for extending other config files
-```
-
-#### 包含了 `!` 字符以提醒注意破坏性变更的提交说明
-
-```text
-feat!: send an email to the customer when a product is shipped
-```
-
-#### 包含了范围和破坏性变更 `!` 的提交說明
-
-```text
-feat(api)!: send an email to the customer when a product is shipped
-```
-
-#### 包含了 `!` 和 BREAKING CHANGE 脚注的提交说明
-
-```text
-chore!: drop support for Node 6
-
-BREAKING CHANGE: use JavaScript features not available in Node 6.
-```
-
-#### 不包含正文的提交说明
-
-```text
-docs: correct spelling of CHANGELOG
-```
-
-#### 包含范围的提交说明
-
-```text
-feat(lang): add polish language
-```
-
-#### 包含多行正文和多行脚注的提交说明
-
-```text
-fix: prevent racing of requests
-
-Introduce a request id and a reference to latest request. Dismiss
-incoming responses other than from latest request.
-
-Remove timeouts which were used to mitigate the racing issue but are
-obsolete now.
-
-Reviewed-by: Z
-Refs: #123
-```
-
-### 约定式提交规范
-
-本文中的关键词 “必须(MUST)”、“禁止(MUST NOT)”、“必要(REQUIRED)”、“应当(SHALL)”、“不应当(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可以(MAY)” 和 “可选(OPTIONAL)” ,其相关解释参考 [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt) 。
-
-1. 每个提交都**必须**使用类型字段前缀,它由一个名词构成,诸如 `feat` 或 `fix` ,其后接**可选的**范围字段,**可选的** `!`,以及**必要的**冒号(英文半角)和空格。
-2. 当一个提交为应用或类库实现了新功能时,**必须**使用 `feat` 类型。
-3. 当一个提交为应用修复了 bug 时,**必须**使用 `fix` 类型。
-4. 范围字段**可以**跟随在类型字段后面。范围**必须**是一个描述某部分代码的名词,并用圆括号包围,例如: `fix(parser):`
-5. 描述字段**必须**直接跟在 <类型>(范围) 前缀的冒号和空格之后。描述指的是对代码变更的简短总结,例如: _fix: array parsing issue when multiple spaces were contained in string_ 。
-6. 在简短描述之后,**可以**编写较长的提交正文,为代码变更提供额外的上下文信息。正文**必须**起始于描述字段结束的一个空行后。
-7. 提交的正文内容自由编写,并**可以**使用空行分隔不同段落。
-8. 在正文结束的一个空行之后,**可以**编写一行或多行脚注。每行脚注都**必须**包含一个令牌(token),后面紧跟 `:` 或 `#` 作为分隔符,后面再紧跟令牌的值(受 [git trailer convention](https://git-scm.com/docs/git-interpret-trailers) 启发)。
-9. 脚注的令牌**必须**使用 `-` 作为连字符,比如 `Acked-by` (这样有助于区分脚注和多行正文)。有一种例外情况就是 `BREAKING CHANGE`,它**可以**被认为是一个令牌。
-10. 脚注的值**可以**包含空格和换行,值的解析过程**必须**直到下一个脚注的令牌/分隔符出现为止。
-11. 破坏性变更**必须**在提交信息中标记出来,要么在 <类型>(范围) 前缀中标记,要么作为脚注的一项。
-12. 包含在脚注中时,破坏性变更**必须**包含大写的文本 `BREAKING CHANGE`,后面紧跟着冒号、空格,然后是描述,例如:_BREAKING CHANGE: environment variables now take precedence over config files_ 。
-13. 包含在 <类型>(范围) 前缀时,破坏性变更**必须**通过把 `!` 直接放在 `:` 前面标记出来。如果使用了 `!`,那么脚注中**可以**不写 `BREAKING CHANGE:`,同时提交信息的描述中**应该**用来描述破坏性变更。
-14. 在提交说明中,**可以**使用 `feat` 和 `fix` 之外的类型,比如:_docs: updated ref docs._ 。
-15. 工具的实现必须**不区分**大小写地解析构成约定式提交的信息单元,只有 `BREAKING CHANGE` **必须**是大写的。
-16. BREAKING-CHANGE 作为脚注的令牌时**必须**是 BREAKING CHANGE 的同义词。
-
-### 为什么使用约定式提交
-
-- 自动化生成 CHANGELOG。
-- 基于提交的类型,自动决定语义化的版本变更。
-- 向同伴、公众与其他利益关系者传达变化的性质。
-- 触发构建和部署流程。
-- 让人们探索一个更加结构化的提交历史,以便降低对你的项目做出贡献的难度。
-
-### FAQ
-
-#### 在初始开发阶段我该如何处理提交说明?
-
-我们建议你按照假设你已发布了产品那样来处理。因为通常总 _有人_ 使用你的软件,即便那是你软件开发的同伴们。他们会希望知道诸如修复了什么、哪里不兼容等信息。
-
-#### 提交标题中的类型是大写还是小写?
-
-大小写都可以,但最好是一致的。
-
-#### 如果提交符合多种类型我该如何操作?
-
-回退并尽可能创建多次提交。约定式提交的好处之一是能够促使我们做出更有组织的提交和 PR。
-
-#### 这不会阻碍快速开发和迭代吗?
-
-它阻碍的是以杂乱无章的方式快速前进。它助你能在横跨多个项目以及和多个贡献者协作时长期地快速演进。
-
-#### 约定式提交会让开发者受限于提交的类型吗(因为他们会想着已提供的类型)?
-
-约定式提交鼓励我们更多地使用某些类型的提交,比如 `fixes`。除此之外,约定式提交的灵活性也允许你的团队使用自己的类型,并随着时间的推移更改这些类型。
-
-#### 这和 SemVer 有什么关联呢?
-
-`fix` 类型提交应当对应到 `PATCH` 版本。`feat` 类型提交应该对应到 `MINOR` 版本。带有 `BREAKING CHANGE` 的提交不管类型如何,都应该对应到 `MAJOR` 版本。
-
-#### 我对约定式提交做了形如 `@jameswomack/conventional-commit-spec` 的扩展,该如何版本化管理这些扩展呢?
-
-我们推荐使用 SemVer 来发布你对于这个规范的扩展(并鼓励你创建这些扩展!)
-
-#### 如果我不小心使用了错误的提交类型,该怎么办呢?
-
-##### 当你使用了在规范中但错误的类型时,例如将 `feat` 写成了 `fix`
-
-在合并或发布这个错误之前,我们建议使用 `git rebase -i` 来编辑提交历史。而在发布之后,根据你使用的工具和流程不同,会有不同的清理方案。
-
-##### 当使用了 _不在_ 规范中的类型时,例如将 `feat` 写成了 `feet`
-
-在最坏的场景下,即便提交没有满足约定式提交的规范,也不会是世界末日。这只意味着这个提交会被基于规范的工具错过而已。
-
-#### 所有的贡献者都需要使用约定式提交规范吗?
-
-并不!如果你使用基于 squash 的 Git 工作流,主管维护者可以在合并时清理提交信息——这不会对普通提交者产生额外的负担。
-有种常见的工作流是让 git 系统自动从 pull request 中 squash 出提交,并向主管维护者提供一份表单,用以在合并时输入合适的 git 提交信息。
-
-#### 约定式提交规范中如何处理还原(revert)提交?
-
-还原提交(Reverting)会比较复杂:你还原的是多个提交吗?如果你还原了一个功能模块,下次发布的应该是补丁吗?
-
-约定式提交不能明确的定义还原行为。所以我们把这个问题留给工具开发者,
-基于 _类型_ 和 _脚注_ 的灵活性来开发他们自己的还原处理逻辑。
-
-一种建议是使用 `revert` 类型,和一个指向被还原提交摘要的脚注:
-
-```text
-revert: let us never again speak of the noodle incident
-
-Refs: 676104e, a215868
-```
-
-## 代码审查规范(Code Review)
-
-### 概要
-
-审查别人的代码是一项艰巨的任务。你需要有效地处理它,同时牢记你是一名专业人员,不仅要对项目负责,还要对你的同伴负责。
-
-### 尊重大家的时间
-
-一个好的代码审查过程从尊重时间开始。理想情况下,你希望在首次提交后两小时内开始审查代码。这主要是为了尊重提交 PR 的人的工作。
-
-例如,你的一位同伴要求你审阅他们的工作,他们可能会等待你审阅几分钟。但如果审查没有迅速完成,他们将开始处理其他事情。
-
-你的同伴将创建一个新的功能分支并开始为新任务编写代码。如果在四个小时后,你查看他们的第一个代码并发现它有错误,你的同伴将不得不暂停他们现在正在做的事情来进行更改。像这样的上下文切换可能非常耗时。由于不同人的工作方式各有差异,他们可能需要相当一段时间才能在回归原始任务时恢复注意力。
-
-如果几天或几周过去了,而你依然不检查代码,情况会变得更糟。这个时候,你的同伴估计连代码是干什么的都忘记了。让他们回忆之前代码时会浪费大量的时间,而且你的同伴将更容易引入错误,因为他们已经有一段时间没有处理该功能了。
-
-始终尊重他人的时间和工作,努力成为最及时的审阅者,并能够意识到你的同伴等待审阅的时间非常宝贵。
-
-### 始终提供建设性反馈
-
-即使您正在审查代码,也要记住代码的背后是人。当你在谈论他们的工作时,尽可能避免触发其他人的情绪。
-
-在对合并请求中的错误提供反馈时,采用建设性的心态并尝试使用积极的语言。
-
-例如:
-
-使用 _“我建议”_ 或 _“你可以通过做 Y 来改进 X”_。
-
-避免使用 _“这样做”_ 或 _“这是错误的,你为什么不做 Z?”_
-
-用书面文字表达意见是非常困难的——要注意有人可能会误解你的建议并认为是针对个人。
-
-将改进项目代码作为你的使命,但仍要记住代码背后的人需要得到鼓励。除了保持积极的工作环境之外,这还可以大大有助于确保相同的错误不会成为下一个合并请求的一部分。
-
-### 让自我远离代码审查
-
-有时,你会发现自己不同意提交者对代码的实现或 PR 的其他审阅者给出的建议。
-
-如:_我们应该使用这个接口吗?这个名称是否适合这些变量?_
-
-在这种情况下,你和工程团队应该致力于营造一种以最佳论据获胜的文化。
-
-请记住,仅仅作为高级开发人员,并不意味着你对某些初级编码人员的想法一定是正确的。向其他团队成员提供理由而不是感受以支持你的立场。如果你认为这是最好的方法,请坚持,但不要忘记提供你所说的一切背后的理由。例如,链接到文章或文档以加强你的观点。
-
-如果争论变得激烈,请尝试安排立即通话并积极讨论你的想法。最后,要么你是对的,要么你会带着新的知识从讨论中走出来。
-
-### 明确需要改进的地方
-
-仔细检查你写的每条评论。一个简单的语义错误就有可能会给他人带来不必要的麻烦和理解成本。
-
-一个混淆语义的例子:
-
-`类和函数的逻辑看上去没什么问题,但我建议修改下它的名称以更好的反应它所代表的功能和逻辑。`
-
-需要更改的是什么,类还是函数?究竟指哪个?为什么一个忙碌的同伴必须要通过询问你,以搞清楚你评论的真正意图?
-
-另外,请注意明确指出你正在讨论的确切的代码所在行。
-
-### 不能只要求代码能工作
-
-要求代码的作者已经测试过代码是没问题的,但你也应该始终尝试运行或测试。两个脑袋总比一个好,所以检查引用分支并在本地拉下代码是更好的做法。
-
-检查功能本身,但不要将自己局限于简单的测试,尝试去引发一些错误,或提出一些边缘案例,并将实际的代码库用于测试。
-
-### 强化代码提交的最佳实践
-
-参考 [约定式代码提交](/specifications/git-commit-and-review) 的内容,并在提交合并请求的时候,明确本次提交的内容或更改(例如,错误修复、修补程序、重构等),甚至是一些注意事项,以帮助审阅者更好的了解本次代码合并所涉及到方方面面。
-
-### 严格审阅临时代码
-
-偶尔会有人提交一些临时的代码。临时代码通常是一些临时修补程序或为某个模块能够正常工作而进行的临时重构。
-
-在测试代 码时,不要因为是临时代码就降低审查标准。短期的解决方案有一种神奇的力量——可以很快将遗留代码变成肮脏的历史债务。如果你不想在未来处理更大的问题,那么无论是在审查一个巨大的功能合并请求还是最微小的临时代码,都要始终遵循相同的原则。
-
-### 检查项目的卫星文件
-
-每个大中型项目都会带来数百个围绕代码结构本身的文件。我们通常将它们称为**卫星文件**。其中包括文档、测试和配置文件。
-
-请记住检查这些文件,因为它们通常与代码一样经常更新并且同等重要。例如,检查是否已为新功能添加测试用例(如果你的项目中有测试用例的话)。
-
-如果一个函数或类已经被重构,那么文档也需要做相应的更新。
-
-同样,构建产物需要能够反映对项目或单个文件所做的更改,而 CHANGELOG 也需要能够始终反映出项目执行的变更。
-
-### 始终考虑长期可维护性
-
-请大家注意,代码不仅仅是你写的那一行,而是这行代码应当如何更好的与项目本身结合在一起,并为项目本身提供正向或积极的作用。
-
-比如:这种变化是否有利于项目的长期可维护性?我们是否因为它不可扩展而必须更改它?六个月之后,我和我的同伴是否还能够读懂这段代码?
-
-合并请求绝不是一个孤立的事件。它是更广泛、更复杂系统中的一个环节。牢记最佳实践,并将其作为你决定某个变更是“批准”还是“拒绝”的指导思想。
-
-## 参考
-
-- [约定式提交规范](https://www.conventionalcommits.org/zh-hans/v1.0.0/#%e7%ba%a6%e5%ae%9a%e5%bc%8f%e6%8f%90%e4%ba%a4%e8%a7%84%e8%8c%83)
-- [Awesome Code Review](https://github.com/joho/awesome-code-review)
diff --git a/website/docs/specifications/js.md b/website/docs/specifications/js.md
deleted file mode 100644
index 4d24867a..00000000
--- a/website/docs/specifications/js.md
+++ /dev/null
@@ -1,259 +0,0 @@
-# JS 依赖库规范
-
-## 概要
-
-由于多端小程序运行环境的限制和约束,`JS 依赖库` 和一般意义上的 `NPM 包` 有些区别,这里特指专为小程序定制的 `NPM 包`。
-
-MorJS 要求所有依赖库都需要都是**兼容微信、支付宝小程序等小程序平台**,需要各个库在输出的时候要做好严格的测试以及多端小程序的兼容性。
-
-## 代码约束
-
-### 禁止使用动态函数
-
-由于小程序有安全性相关要求,严禁使用动态函数,请勿请勿使用动态函数 `new Function` 和 `eval`,否则会直接报错。
-
-```javascript
-// 千万不要这么干,会报错
-function createFunction() {
- var x = 20
- return new Function('return x;')
-}
-
-// no!!!
-eval('var a = 1')
-```
-
-### 严格模式下开发
-
-请在严格模式下进行代码开发,由于小程序的源码在编译后都是在严格模式下,MorJS 的 `bundle` 模式会在构建打包环节,将用到的依赖库变成 `mor.v.js` 文件,因此库的开发也需要遵循严格模式,避免发生不可预料的后果。严格模式的说明,请 [参考文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)。
-
-### TypeScript 的 Polyfill 支持
-
-如果采用 `tsc` 去编译输出 `ES5` 代码,请注意 `tsc` 并不会像 `babel` 一样针对一些原型方法做 `polyfill`。另外由于不同的小程序平台对 `JS` 特性及 `Polyfill` 的支持情况不同,因此需要在写源码的时候尽可能规避以下一些函数、对象的使用。
-
-例如:
-
-- `Array.prototype.includes`
- - 请用 `Array.prototype.indexOf` 替代
-- `String.prototype.includes`
- - 请用 `String.prototype.indexOf` 替代
-- `Object.values`
- - 请用 `for...in` 循环或者`Object.keys` + `Array.prototype.map`替代
-- 不能使用 `Reflect`
-- 不能使用 `Proxy`
-
-各平台详细兼容情况,可参考文档:
-
-- [微信小程序 JS 支持情况](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/js-support.html)
-- [支付宝小程序 JS 支持情况](https://opendocs.alipay.com/mini/framework/implementation-detail)
-- [百度小程序 JS 支持情况](https://smartprogram.baidu.com/docs/develop/framework/operating-environment/)
-- [字节小程序 JS 支持情况](https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/framework/mini-app-runtime/java-script-support)
-- [QQ 小程序 JS 支持情况](https://q.qq.com/wiki/develop/miniprogram/frame/useful/useful_env.html)
-
-## 代码规范
-
-- 源代码:
-
- - 原则上使用 `TypeScript` 写源代码,并输出 `.d.ts` 类型申明文件,方便开发同学快速上手,MorJS 提供了多端组件库的脚手架,可以快速初始化项目,并利用 MorJS 进行多端产物输出。
-
-- 代码输出 `ES5` 版本:
-
- - 依赖库输出的版本需要为 `ES5` 的版本,原因是小程序构建的时候并不会对 `node_modules` 里面的代码进行 **ES6 转 ES5**,所以在不支持 **ES6** 的机型会直接报错
- - 如果采用的是 `TypeScript`,建议在 `tsconfig.json` 中把 `importHelpers` 设置成 `true`,来减少生成出来的代码体积。注:使用 MorJS 的项目,会建议装 `tslib` 这个依赖
-
-- `babel` 的特别说明:
-
- - 同样,原则上如果没有特别的需要建议直接用 `TypeScript` 的 `tsc` 即可
- - `babel` 默认情况下针对 `async/await` 的语法会使用 [regenerator-runtime](https://www.npmjs.com/package/regenerator-runtime) 这个库做 polyfill,而这个库默认情况下是不会声明这个 `regeneratorRuntime` 变量,因此会在严格模式下报错 `Can't find variable: regeneratorRuntime`,而库的兜底策略是会采用动态函数赋值(参考 [源代码](https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js#L728)),而动态函数在小程序上由于安全问题不允许执行。所以导致在小程序上会直接报错。
- - 目前 `mor bundle` 模式针对该问题已经做了兼容兜底
-
-- 单元测试:
- - 单元测试建议采用 **Jest**,具体使用上请参考 [Jest 官网](https://jestjs.io/)
- - 建议测试覆盖率达到 `90%` 以上,**Jest** 可直接输出代码覆盖率报告
-
-## 如何实现多端支持
-
-### MorJS 的加载规范
-
-MorJS 是通过 `package.json` 中指定的入口字段来做多端逻辑区分的,详细如下:
-
-**重要: `main` 字段遵从 `NPM` 的 `package.json` 本身对于该字段的定义,参见 [文档](https://docs.npmjs.com/cli/v7/configuring-npm/package-json#main)。其他多端入口字段为目录配置字段。**
-
-- `main`: 默认加载入口, 用于存放 `CommonJS` 产物
- - 未指定多端入口的情况下,所有端都会读取该入口
- - 部分多端的情况下,未明确以下方字段指定入口的端,均会读取该缺省入口
-- `module`: 默认加载入口,用于存放 `ESModule` 产物, 作用和 `main` 类似
- - 仅当配置为 `ESNext` 的端默认情况下会优先使用 `module`
-- `alipay`: 支付宝小程序加载入口
-- `miniprogram`: 微信小程序加载入口,**该字段和微信/QQ/企业微信小程序官方一致**
-- `wechat`: 微信小程序加载入口
- - 优先级比 `miniprogram` 高
-- `qq`: QQ 小程序加载入口
- - 优先级比 `miniprogram` 高
-- `bytedance`: 字节跳动小程序加载入口
-- `baidu`: 百度小程序加载入口
-- `dingding`: 钉钉小程序加载入口
-- `taobao`: 淘宝小程序加载入口
-- `kuaishou`: 快手小程序加载入口
-- `miniforweb`: Web 应用专用小程序产物加载入口
-
-Q:为什么会有 `miniprogram` 和 `wechat` 两个字段作为微信小程序的加载入口?我要如何选择?
-A:一般情况下我们建议直接用 `miniprogram` 字段即可,除非是库是希望在默认引用的情况下还提供文件路径的依赖加载且还要支持微信小程序的 `NPM构建`。在这种情况下,就需要同时用到 `miniprogram` 和 `wechat` 两个字段了。具体参考下面的多端适配示例。
-
-### 可兼容多端的 JS
-
-如果是纯 `JS` 代码,并不涉及小程序特定端的特殊逻辑,且能保证多端都可兼容运行的情况下,只输出一份代码即可(仅指定 main 入口字段)。这种情况下建议输出的 `module` 类型是 `CommonJS` 规范的模块。`package.json` 中建议配置 `main` 字段来指向实际构建后的文件或目录。
-
-#### 目录结构
-
-```bash
-- src
- - index.ts(源代码)
-- lib
- - index.js(输出的 ES5 版本代码,采用 CommonJS 模块规范)
- - index.d.ts(输出的类型申明)
-```
-
-#### `tsconfig.json` 示例
-
-这里提供的是最少的配置项
-
-```javascript
-{
- "compilerOptions": {
- "declaration": true,
- "target": "ES5",
- "importHelpers": true,
- "module": "CommonJS"
- }
-}
-```
-
-#### `package.json` 示例
-
-无需配置 `miniprogram` / `wechat` 等字段!
-
-```javascript
-{
- "main": "lib" // 所有端小程序都生效
-}
-```
-
----
-
-### 正常情况下的多端规范示例
-
-以一个需要适配 **微信小程序**、**支付宝小程序 等**模式的小程序的 **JS** 库举例:
-业务项目中可以通过 `import { xx } from 'example'` 引用依赖,所有的模块均从根模块下导出。
-
-#### 目录结构
-
-输出的目录结构示例
-
-- 在支付宝小程序中会加载的是 `lib/index.js` 这份文件
-- 在微信小程序中会加载的是 `miniprogram_dist/index.js` 这份文件
-
-```bash
-- src
- - index.ts(源代码)
-- lib
- - index.js(输出的 ES5 版本代码,支付宝小程序加载用)
- - index.d.ts(输出的类型申明)
-- miniprogram_dist
- - index.js(输出的 ES5 版本代码,微信小程序加载用)
- - index.d.ts(输出的类型申明)
-```
-
-#### `package.json` 配置示例:
-
-```javascript
-{
- "main": "lib" // 支付宝小程序,缺省情况下使用 main 字段,也可以配置专属字段 alipay
- "miniprogram": "miniprogram_dist" // 微信小程序
-}
-```
-
-#### 模块规范说明
-
-- 微信小程序:微信小程序由于兼容性问题,建议输出的 `module` 规范是 `CommonJS` 模块规范
-- 支付宝小程序:由于支付宝小程序支持 `node_modules` 中使用 `ESNext` 规范的模块,可以方便做 `tree shaking`,因此在多端版本输出的情况下,支付宝小程序版本建议输出的 `module` 规范是 `ESNext` 模块规范
-
----
-
-### 复杂情况下的多端规范示例【待移除 - mor 自行支持,降低用户理解成本】
-
-以一个需要适配 **微信小程序、支付宝小程序,`mor bundle`** 模式的小程序的 **JS** 库举例:
-
-业务项目中可以通过 `import { xx } from 'example'` 引用依赖,且要求能够支持 `import { oo } from 'example/lib/zz'` 的情况下也能够加载依赖,可以参考以下的配置示例。
-
-**一般情况下,并不建议大家这样做,所有需要能够加载的模块最好都直接从依赖根模块导出。避免直接去某个特定目录下加载。**
-
-#### 目录结构
-
-这里以最简单的目录形式展示:
-
-```bash
-- src
- - index.ts(源代码)
-- lib
- - index.js(输出的 ES5 版本代码)
- - index.d.ts(输出的类型申明)
-```
-
-#### 支付宝小程序适配
-
-在 `package.json` 中,我们指定 `main` 字段,指向生成后的 `lib` 目录,这样支付宝小程序会采用 `lib/index.js` 这份代码。
-
-由于支付宝小程序支持 `node_modules` 中使用 `ESNext` 规范的模块,可以方便做 `tree shaking`,因此在多端版本输出的情况下,支付宝小程序版本建议输出的 `module` 规范是 `ESNext` 模块规范
-
-##### `package.json` 配置示例:
-
-```javascript
-{
- "main": "lib" // 支付宝小程序
-}
-```
-
-#### 微信原生小程序适配
-
-由于在微信原生小程序中,针对 `NPM包` 是采用 `miniprogram` 字段来指定目录,且实际是通过拷贝目录来 `构建NPM`,因此适配微信原生小程序的话,需要套多一层目录。
-
-建议输出的 `module` 规范是 `CommonJS` 模块规范
-
-```bash
-- src
- - index.ts(源代码)
-- lib
- - index.js(输出的 ES5 版本代码)
- - index.d.ts(输出的类型申明)
-- miniprogram_dist
- - lib
- - index.js(针对微信版本输出的 ES5 版本代码)
- - index.d.ts(输出的类型申明)
-```
-
-然后在 `package.json` 中需要通过 `miniprogram` 字段来指向目录,微信小程序下会采用 `miniprogram/lib/index.js`这份代码。
-
-##### `package.json` 配置示例:
-
-```javascript
-{
- "main": "lib", // 支付宝小程序
- "miniprogram": "miniprogram_dist" // 微信原生小程序
-}
-```
-
-#### `mor bundle` 模式适配
-
-由于 MorJS 是自己做依赖解析的,如果库在支持了微信原生小程序的依赖解析方式上,MorJS 通过 `miniprogram` 字段去做解析的话,会因为路径解析问题直接导致报错。
-构建并不需要专门为 MorJS 生成一份代码,MorJS 依然会采用`miniprogram_dist`下的代码,只需要在`package.json`中增加`wechat`字段的配置即可
-
-##### `package.json`配置示例:
-
-```javascript
-{
- "main": "lib", // 支付宝小程序
- "miniprogram": "miniprogram_dist", // 微信原生小程序
- "wechat": "miniprogram_dist/lib" // mor bundle 模式
-}
-```
diff --git a/website/docs/specifications/plugin.md b/website/docs/specifications/plugin.md
deleted file mode 100644
index c8d14e82..00000000
--- a/website/docs/specifications/plugin.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# 多端工程插件扩展规范
-
-> 规范编写中
->
-> 本规范主要侧重于如何编写工程插件,如:
->
-> - 工程插件有那些类型?
-> - 如何选择适用的插件类型?
-> - 如何编写工程插件?
diff --git a/website/docs/specifications/runtime.md b/website/docs/specifications/runtime.md
deleted file mode 100644
index e877d9ce..00000000
--- a/website/docs/specifications/runtime.md
+++ /dev/null
@@ -1,180 +0,0 @@
-# 多端运行时基础库规范
-
-## 概要
-
-MorJS 的运行时插件体系主要是基于:
-
-- 小程序生命周期的维度
-- 复杂小程序多形态支持
-
-两个方面的需求,来开发和实现的。
-
-请注意,MorJS 要求所有运行时插件都必须微信小程序、支付宝小程序等,如果仅支持单端,请务必说明,以免对使用方造成不必要的麻烦。
-
-依赖库的开发需要遵循 [小程序 JS 依赖库规范](/specifications/js),请务必查看。
-
-关于复杂小程序多形态支持,参见文档 [复杂小程序集成](/guides/advance/complex-miniprogram-integration.md) 和 [小程序形态一体化](/guides/advance/unity-of-forms.md)
-
-## 基础规范
-
-- 命名:运行时插件名称请都采用 `mor-runtime-plugin-`开头,保持统一
-- 版本:都以 `1.x` 为开始
-- 文档:请在插件的 `README.md` 上面提供完整的使用说明文档及多端支持情况
-
-## 注意事项
-
-- 插件的初始化、逻辑等耗时需要密切关注,不能过长,因为项目的逻辑执行顺序是在插件的 `hook` 之后
-- 插件逻辑不能强依赖业务输入,务必做好异常或者参数缺失等的兜底处理,并在异常情况下提供友好的带指引的消息提醒
- - 建议的格式为 `console.warn('[plugin-xx]: 消息内容')`
-- 插件请使用 `TypeScript`,并通过 `tsc` 输出 `ES5` 版本的代码
-- MorJS 会通过 `hooks` 对象开放对应的生命周期的 `hook` 注册监听。
-- 除了 `appOnConstruct`、`pageOnConstruct`、`componentOnConstruct` 这三个生命周期以外,其余均是标准的小程序生命周期
- - 在标准的小程序生命周期 `hook` 中,插件均能完整拿到对应的参数,比如在 `appOnLaunch` 中,插件可以获取到一个`options` 对象,里面有 `query`、`scene`、`path` 等参数。其他生命周期如此类推,直接看小程序的官方文档即可
- - 在 `appOnConstruct`、`pageOnConstruct`、`componentOnConstruct` 这三个生命周期中,插件可以获取到当前传入给 `aApp/wApp`、`aPage/wPage`、`aComponent/wComponent` 的 `options` 对象实例,请谨慎修改
-
-## 生命周期列表
-
-| 类型 | 生命周期 Hook 名称 | 说明 |
-| ------------------------ | ---------------------------------------- | ---------------------------------------------------------------------------------------------------- |
-| wApp 或 aApp | appOnConstruct | 在应用初始化前执行,请注意不要进行长时间耗时的任务 |
-| | appOnLaunch | 在 `wApp` 或 `aApp` 的 `onLaunch` 生命周期触发 |
-| | appOnError | 在 `wApp` 或 `aApp` 的 `onError` 生命周期触发 |
-| | appOnShow | 在 `wApp` 或 `aApp` 的 `onShow` 生命周期触发 |
-| | appOnHide | 在 `wApp` 或 `aApp` 的 `onHide` 生命周期触发 |
-| wPage 或 aPage | pageOnConstruct | 在页面初始化前执行,请注意这个生命周期会在应用启动后就立刻执行,并不是等用户切换到对应的页面才会执行 |
-| | pageOnLoad | 在 `wPage` 或 `aPage` 的 `onLoad` 生命周期触发 |
-| | pageOnReady | 在 `wPage` 或 `aPage` 的 `onReady` 生命周期触发 |
-| | pageOnShow | 在 `wPage` 或 `aPage` 的 `onShow` 生命周期触发 |
-| | pageOnHide | 在 `wPage` 或 `aPage` 的 `onHide` 生命周期触发 |
-| | pageOnUnload | 在 `wPage` 或 `aPage` 的 `onUnload` 生命周期触发 |
-| wComponent 或 aComponent | componentOnConstruct | 在组件初始化前执行,请注意这个生命周期会在应用启动后就立刻执行,并不是等组件渲染的时候才执行 |
-| | componentOnInit, componentOnCreated | 在 `wComponent` 的 `created` 或 `aComponent` 的 `onInit` 生命周期触发 |
-| | componentDidMount, componentOnReady | 在 `wComponent` 的 `ready` 或 `aComponent` 的 `didMount` 生命周期触发 |
-| | componentDidUnmount, componentOnDetached | 在 `wComponent` 的 `detached` 或 `aComponent` 的 `didUnmount` 生命周期触发 |
-
-### `hook` 函数
-
-在插件的 `apply` 函数中,会得到一个 `hooks` 对象,对象中会有上面的所有生命周期列表的 `hook`。
-
-插件请用 `tap` 来注册对应的 `hook`, `tap` 接受两个参数:
-
-- `pluginName`:插件名
-- `pluginHandle`:插件逻辑
-
-```typescript
-$hooks.appOnLaunch.tap(pluginName, pluginHandle)
-```
-
-详情可以参考下面的插件源代码示例。
-
-## 插件示例
-
-### 初始化
-
-MorJS 已经提供脚手架,请通过以下命令来快速初始化。
-
-```bash
-mor init your_custom_runtime_plugin
-```
-
-并选择 `MorJS 多端组件库工程`。
-
-### 类型声明
-
-MorJS 提供了 `@morjs/api` 基础库,插件项目直接引用这个库即可。
-
-可以参考该 `tsconfig.json` 示例:
-
-```typescript
-{
- "compilerOptions": {
- "declaration": true,
- "target": "ES5",
- "importHelpers": true,
- "module": "CommonJS",
- "moduleResolution": "Node",
- "rootDir": "./src",
- "outDir": "./lib",
- "lib": ["ES6", "ESNext", "DOM"]
- },
- "include": ["src"]
-}
-```
-
-### 插件源代码示例
-
-- 如果插件需要有设置参数,请务必将 `options` 的 `interface` `export` 出去,方便可能需要集成的使用方引用
-- 插件需要声明为一个 `class`,同时实现 `MorJSPlugin` 这个 `interface`
-- 插件必须要有 `apply` 函数
-- 插件调用方不能保证 `apply` 函数里面的 `this` 指向,因此建议都 `class` 下面的方法**都用箭头函数**,避免 `this` 指向问题
-- `hook` 里面的监听函数必须用普通函数,因为在 `hook` 调用的时候会动态修改 `this` 指向,指向当前的 `app`、`page`、`component` 实例
-
-```typescript
-import type { MorJSPlugin, MorJSHooks } from '@morjs/api'
-
-// export 出去,方便使用方集成
-export interface IRuntimePluginExampleOptions {}
-
-export default class RuntimePluginExample implements MorJSPlugin {
- // 必须要有插件名字
- pluginName = 'RuntimePluginExample'
-
- options: IRuntimePluginExampleOptions
-
- /**
- * 根据插件特性决定是否需要开放选项配置
- */
- constructor(public options: IRuntimePluginExampleOptions = {}) {}
-
- /**
- * 必须要有 apply 函数
- * class 下面的方法用 arrow function
- */
- apply = (hooks: MorJSHooks): void => {
- // 注意,这里是 arrow function
-
- // hooks 里面包含上面生命周期列表中的所有hook
- // 请用 tap 来做 hook 的事件监听注册
- // 传入的插件执行函数必须是 function(){}, 因为会动态修改 this 指向
- hooks.appOnLaunch.tap(
- this.pluginName,
- function (
- this: tinyapp.IAppInstance,
- options: tinyapp.IAppLaunchOptions
- ) {
- // 这里可以拿到对应生命周期里面的参数
- console.log(options)
- }
- )
- }
-}
-```
-
-### 插件编译输出
-
-- 请采用 `tsc` 输出 `ES5` 代码
-- 如果运行时插件可以同时兼容多端,直接输出单个 `lib` 目录即可
-- 如果运行时插件不能同时兼容多端,请参考分端加载规范
-
-完整规范请查看 [小程序 JS 依赖库规范](/specifications/js.md)
-
-### 使用方式
-
-通过 MorJS 提供的 `aApp` 或 `wApp` 来使用插件的方法:
-
-```javascript
-// 在小程序的 app.js 中
-import aApp from '@morjs/core'
-import YourCustomRuntimePlugin from 'your_custom_runtime_plugin'
-
-aApp(
- {
- onLaunch() {}
- },
- [
- () => {
- plugins: [new YourCustomRuntimePlugin()]
- }
- ]
-)
-```
diff --git a/website/docs/web/basic/quickstart.md b/website/docs/web/basic/quickstart.md
deleted file mode 100644
index 3f782e6c..00000000
--- a/website/docs/web/basic/quickstart.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# 快速上手
-
-`MorJS` 提供将小程序项目转换成 `Web` 项目的能力(转换成一个基于 `React` 的项目),让业务能够快速拓展部署渠道。
-
-接下来,你只需要根据自己的场景(新建工程 or 基于已有 `MorJS` 工程改造)跟着下面的文档操作就可以快速开始。
-
-## 新建 MorJS 工程
-
-```shell
-npm i @morjs/cli -g # 全局安装 MorJS cli(如已安装可跳过)
-mor init # 创建工程时会有 <请选择是否需要增加转 Web 配置> 选项,选择 “是”
-npm run dev:web # 运行项目,控制台会打印地址和二维码
-```
-
-执行完上述步骤,项目就已经跑在 `Web` 上了~ 如果你需要更多的定制,可以继续浏览更多章节。
-
-## 已有 MorJS 工程
-
-针对已有的 `MorJS` 工程,按照以下方法配置,可以进行 `Web` 端的编译。
-
-### 增加配置
-
-打开 `mor.config.[js|ts]`,写入 `web` 转换配置
-
-```
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'web',
- sourceType: 'alipay', // 根据业务工程类型配置,微信就填 wechat
- target: 'web',
- compileType: 'miniprogram', // 根据业务形态类型配置,小程序/插件/分包 分别对应 miniprogram/plugin/subpackage
- compileMode: 'bundle',
- }
-])
-
-```
-
-### 运行项目
-
-如果已经全局安装了 `@morjs/cli`,可以直接运行如下指令 👇🏻
-
-```shell
-# 开发命令
-mor compile --name web -w
-
-# 构建命令
-mor compile --name web --production
-```
-
-如果没有全局安装 `@morjs/cli`,打开项目的 `package.json`,在 `scripts` 字段中增加指令 👇🏻
-
-```json
-"compile:web": "mor compile --name web --production",
-"dev:web": "mor compile --name web -w",
-```
-
-配置完成后使用 `npm` 运行指令即可。
-
-至此,你的项目已经可以运行在 `Web` 端了 🎇,接下来我们继续看一下 `Web` 端都支持哪些配置吧 ~
diff --git a/website/docs/web/basic/support.md b/website/docs/web/basic/support.md
deleted file mode 100644
index 2e9ec8d4..00000000
--- a/website/docs/web/basic/support.md
+++ /dev/null
@@ -1,780 +0,0 @@
-# API 支持情况
-
-本文简要归纳了 MorJS 对支付宝小程序 API 的支持情况。
-
-## 域内独有 API
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------- | ------------------ | ------------------ |
-| my.sendMtop | 发送一个 mtop 请求 | ✓ |
-| my.on | 绑定事件 | ✓ |
-| my.call | 调用 JS API | ✓ |
-
-
-
-## 基础
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------- | ------------------ |
-| [my.canIUse](https://opendocs.alipay.com/mini/api/can-i-use) | 判断当前小程序的 API、入参或返回值、组件、属性等在当前版本是否支持。 | ✗ |
-| [my.env](https://opendocs.alipay.com/mini/api/env) | 小程序环境变量对象 API。 | ✗ |
-| [my.base64ToArrayBuffer](https://opendocs.alipay.com/mini/api/021zmy) | 将 Base64 字符串转成 ArrayBuffer 对象。 | ✗ |
-| [my.arrayBufferToBase64](https://opendocs.alipay.com/mini/api/021zmz) | 将 ArrayBuffer 对象转成 Base64 字符串。 | ✗ |
-| [my.getAppIdSync](https://opendocs.alipay.com/mini/api/gazkkm) | 同步获取小程序 APPID。 | ✗ |
-| [my.getLaunchOptionsSync](https://opendocs.alipay.com/mini/api/getLaunchOptionsSync) | 获取小程序启动时的参数。 | ✗ |
-| [my.getRunScene](https://opendocs.alipay.com/mini/api/runscene) | 获取当前小程序的运行版本。 | ✗ |
-| [my.SDKVersion](https://opendocs.alipay.com/mini/api/sdk-version) | 获取基础库版本号。 | ✓ |
-| [my.getEnterOptionsSync](https://opendocs.alipay.com/mini/api/029i75) | 获取本次小程序启动时的参数。 | ✗ |
-
-
-
-## 应用级事件
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------- | --------------------------------------------------------------- | ------------------ |
-| [my.onAppHide](https://opendocs.alipay.com/mini/api/tv6qvi) | 监听小程序切后台事件。 | ✗ |
-| [my.offAppHide](https://opendocs.alipay.com/mini/api/dldh0a) | 取消监听小程序切后台事件。 | ✗ |
-| [my.onAppShow](https://opendocs.alipay.com/mini/api/nn7do1) | 监听小程序切前台事件。 | ✗ |
-| [my.offAppShow](https://opendocs.alipay.com/mini/api/tkohmw) | 取消监听小程序切前台事件。 | ✗ |
-| [my.onComponentError](https://opendocs.alipay.com/mini/api/oncomponent) | 监听小程序自定义组件内部 JS 代码的 error 事件 | ✗ |
-| [my.offComponentError](https://opendocs.alipay.com/mini/api/offcomponent) | 取消监听小程序自定义组件内部 JS 代码的 error 事件。 | ✗ |
-| [my.onError](https://opendocs.alipay.com/mini/00nnsx) | 监听小程序错误事件。 | ✗ |
-| [my.offError](https://opendocs.alipay.com/mini/00njqm) | 取消监听小程序错误事件。 | ✗ |
-| [my.onPageNotFound](https://opendocs.alipay.com/mini/01zdng) | 监听小程序要打开的页面不存在事件。 | ✗ |
-| [my.offPageNotFound](https://opendocs.alipay.com/mini/01zarw) | 取消监听小程序要打开的页面不存在事件。 | ✗ |
-| [my.onUnhandledRejection](https://opendocs.alipay.com/mini/00nd0f) | 监听未处理的 Promise 拒绝事件(即 unhandledrejection 事件)。 | ✗ |
-| [my.offUnhandledRejection](https://opendocs.alipay.com/mini/00nfnd) | 取消监听 unhandledrejection 事件。 | ✗ |
-
-
-
-## 界面
-
-
-
-### 导航栏
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------------- | ------------------------------------------------------------ | ------------------ |
-| [my.getTitleColor](https://opendocs.alipay.com/mini/api/dplf2s) | 获取导航栏背景色。 | ✓ |
-| [my.hideBackHome](https://opendocs.alipay.com/mini/api/ui-navigate) | 隐藏 TitleBar 上的返回首页图标,和通用菜单中的返回首页功能。 | ✓ |
-| [my.hideNavigationBarLoading](https://opendocs.alipay.com/mini/api/ncgsga) | 在当前页面隐藏导航条加载动画。 | ✓ |
-| [my.setNavigationBar](https://opendocs.alipay.com/mini/api/xwq8e6) | 设置导航栏文字及样式。 | ✓ |
-| [my.showNavigationBarLoading](https://opendocs.alipay.com/mini/api/lydg2a) | 在当前页面显示导航条加载动画。 | ✓ |
-
-
-
-### TabBar
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------- | ---------------------------------- | ------------------ |
-| [my.hideTabBar](https://opendocs.alipay.com/mini/api/at18z8) | 隐藏 TabBar。 | ✓ |
-| [my.hideTabBarRedDot](https://opendocs.alipay.com/mini/api/mg428a) | 隐藏 TabBar 某一项的右上角的红点。 | ✓ |
-| [my.removeTabBarBadge](https://opendocs.alipay.com/mini/api/lpbp5g) | 移除 TabBar 某一项右上角的文本。 | ✓ |
-| [my.setTabBarBadge](https://opendocs.alipay.com/mini/api/qm7t3v) | 为 TabBar 某一项的右上角添加文本。 | ✓ |
-| [my.setTabBarItem](https://opendocs.alipay.com/mini/api/zu37bk) | 动态设置 TabBar 某一项的内容。 | ✓ |
-| [my.setTabBarStyle](https://opendocs.alipay.com/mini/api/wcf0sv) | 动态设置 TabBar 的整体样式。 | ✓ |
-| [my.showTabBar](https://opendocs.alipay.com/mini/api/dpq5dh) | 显示 TabBar。 | ✓ |
-| [my.showTabBarRedDot](https://opendocs.alipay.com/mini/api/dquxiq) | 显示 TabBar 某一项的右上角的红点。 | ✓ |
-| [onTabItemTap](https://opendocs.alipay.com/mini/api/navg36) | 点击 Tab 时触发。 | ✗ |
-
-
-
-### 路由
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| [my.switchTab](https://opendocs.alipay.com/mini/api/ui-tabbar) | 跳转到指定 TabBar 页面,并关闭其他所有非 TabBar 页面。 | ✓ |
-| [my.reLaunch](https://opendocs.alipay.com/mini/api/hmn54z) | 关闭当前所有页面,跳转到应用内的某个指定页面。 | ✓ |
-| [my.redirectTo](https://opendocs.alipay.com/mini/api/fh18ky) | 关闭当前页面,跳转到应用内的某个指定页面。 | ✓ |
-| [my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx) | 从当前页面,跳转到应用内的某个指定页面,可以使用 [my.navigateBack](https://opendocs.alipay.com/mini/api/kc5zbx) 返回到原来页面。 | ✓ |
-| [my.navigateBack](https://opendocs.alipay.com/mini/api/kc5zbx) | 关闭当前页面,返回上一级或多级页面。 | ✓ |
-
-
-
-### 交互反馈
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------- | ------------------------------------------ | ------------------ |
-| [my.alert](https://opendocs.alipay.com/mini/api/ui-feedback) | 警告框。 | ✓ |
-| [my.confirm](https://opendocs.alipay.com/mini/api/lt3uqc) | 确认框。 | ✓ |
-| [my.prompt](https://opendocs.alipay.com/mini/api/vqpy01) | 弹出一个对话框,让用户在对话框内输入文本。 | ✓ |
-| [my.showToast](https://opendocs.alipay.com/mini/api/fhur8f) | 显示一个弱提示,可选择多少秒之后消失。 | ✓ |
-| [my.hideLoading](https://opendocs.alipay.com/mini/api/nzf540) | 隐藏加载提示。 | ✓ |
-| [my.hideToast](https://opendocs.alipay.com/mini/api/iygd4e) | 隐藏弱提示。 | ✓ |
-| [my.showLoading](https://opendocs.alipay.com/mini/api/bm69kb) | 显示加载提示。 | ✓ |
-| [my.showActionSheet](https://opendocs.alipay.com/mini/api/hr092g) | 显示操作菜单。 | ✓ |
-
-
-
-### 下拉刷新
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| --------------------------------------------------------------------------- | ------------------------------ | ------------------ |
-| [onPullDownRefresh](https://opendocs.alipay.com/mini/api/wo21qk) | 监听该页面用户的下拉刷新事件。 | ✓ |
-| [my.stopPullDownRefresh](https://opendocs.alipay.com/mini/api/pmhkbb) | 停止当前页面的下拉刷新。 | ✓ |
-| [my.startPullDownRefresh](https://opendocs.alipay.com/mini/api/ui-pulldown) | 开始下拉刷新。 | ✓ |
-
-
-
-### 联系人
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------- | ------------------------------------------------ | ------------------ |
-| [my.choosePhoneContact](https://opendocs.alipay.com/mini/api/blghgl) | 选择本地系统通信录中某个联系人的电话。 | ✗ |
-| [my.chooseAlipayContact](https://opendocs.alipay.com/mini/api/ui-contact) | 唤起支付宝通讯录,选择一个或者多个支付宝联系人。 | ✗ |
-| [my.chooseContact](https://opendocs.alipay.com/mini/api/eqx2u5) | 唤起选择联系人组件。 | ✗ |
-
-
-
-### 选择城市
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------ |
-| [my.chooseCity](https://opendocs.alipay.com/mini/api/ui-city) | 打开城市选择列表。 | ✓ |
-| [my.offLocatedComplete](https://opendocs.alipay.com/mini/api/offLocatedComplete) | 取消监听地理位置定位完成事件。 | ✗ |
-| [my.onLocatedComplete](https://opendocs.alipay.com/mini/api/krzyo1) | 监听地理位置定位完成事件。 | ✗ |
-| [my.setLocatedCity](https://opendocs.alipay.com/mini/api/yw382g) | 修改 [my.chooseCity](https://opendocs.alipay.com/mini/api/ui-city) 中的默认定位城市的名称。 | ✗ |
-| [my.regionPicker](https://opendocs.alipay.com/mini/00nd0d) | 多级省市区选择器,自带省市区数据源。 | ✗ |
-
-
-
-### 选择地区
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------ | ---------------------------- | ------------------ |
-| [my.chooseDistrict](https://opendocs.alipay.com/mini/api/choosedistrict) | 使用支付宝统一样式选择地区。 | ✗ |
-
-
-
-### 选择日期
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------- | ------------------ | ------------------ |
-| [my.datePicker](https://opendocs.alipay.com/mini/api/ui-date) | 打开日期选择列表。 | ✓ |
-
-
-
-### 动画
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------- | -------------- | ------------------ |
-| [my.createAnimation](https://opendocs.alipay.com/mini/api/ui-animation) | 创建动画实例。 | ✓ |
-
-
-
-### 画布
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------ |
-| [my.createOffscreenCanvas](https://opendocs.alipay.com/mini/api/021zn0) | 创建离屏 canvas 实例。 | ✗ |
-| [my.createCanvasContext](https://opendocs.alipay.com/mini/api/ui-canvas) | 创建 canvas 绘图上下文。 | ✓ |
-| [RenderingContext](https://opendocs.alipay.com/mini/01w0it) | Canvas 绘图上下文 | ✗ |
-| [Canvas](https://opendocs.alipay.com/mini/01vzqv) | Canvas 实例。 | ✓ |
-| [Image](https://opendocs.alipay.com/mini/01vyku) | 图片对象,当调用 [Canvas.createImage](https://opendocs.alipay.com/mini/api/createimage) 方法时返回此对象。 | ✓ |
-
-
-
-### 地图
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- | ------------------ |
-| [my.createMapContext](https://opendocs.alipay.com/mini/api/ui-map) | 创建并返回一个 map 上下文对象 [mapContext](https://opendocs.alipay.com/mini/api/mapcontext)。 | ✓ |
-| [my.getMapInfo](https://opendocs.alipay.com/mini/api/getmapinfo) | 获取地图基础信息。 | ✓ |
-
-
-
-### 计算路径
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
-| [my.calculateRoute](https://opendocs.alipay.com/mini/api/calculate-route) | 计算路径 API。根据起点和终点的地理位置,智能规划最佳出行路线,并计算不同出行方式下的行动距离和所需时间,默认规划步行路线,支持规划步行、公交、骑行和驾车四种路线。 | ✗ |
-
-
-
-### 键盘
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------- | ------------ | ------------------ |
-| [my.hideKeyboard](https://opendocs.alipay.com/mini/api/ui-hidekeyboard) | 隐藏键盘。 | ✓ |
-
-
-
-### 滚动
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------- | ---------------------- | ------------------ |
-| [my.pageScrollTo](https://opendocs.alipay.com/mini/api/scroll) | 滚动到页面的目标位置。 | ✓ |
-
-
-
-### 节点查询
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------------------ | ---------------------------------------------- | ------------------ |
-| [my.createIntersectionObserver](https://opendocs.alipay.com/mini/api/intersectionobserver) | 创建并返回一个 IntersectionObserver 对象实例。 | ✓ |
-| [my.createSelectorQuery](https://opendocs.alipay.com/mini/api/selector-query) | 获取一个节点查询对象 SelectorQuery。 | ✓ |
-
-
-
-### 选项选择器
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| [my.optionsSelect](https://opendocs.alipay.com/mini/api/options-select) | 类似于 safari 原生 select 的组件,但是功能更加强大,一般用来替代 select,或者 2 级数据的选择。注意不支持 2 级数据之间的联动。 | ✓ |
-
-
-
-### 级联选择
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------ | -------------------------------------------- | ------------------ |
-| [my.multiLevelSelect](https://opendocs.alipay.com/mini/api/multi-level-select) | 级联选择功能,主要使用在于多级关联数据选择。 | ✓ |
-
-
-
-### 设置窗口背景
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------- | ---------------------------------------- | ------------------ |
-| [my.setBackgroundColor](https://opendocs.alipay.com/mini/api/set-background) | 动态设置窗口的背景色。 | ✗ |
-| [my.setBackgroundTextStyle](https://opendocs.alipay.com/mini/api/aamqae) | 动态设置下拉背景字体、loading 图的样式。 | ✗ |
-
-
-
-### 设置页面是否支持下拉
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| --------------------------------------------------------------------------- | ---------------------- | ------------------ |
-| [my.setCanPullDown](https://opendocs.alipay.com/mini/api/set-can-pull-down) | 设置页面是否支持下拉。 | ✓ |
-
-
-
-### 字体
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------- | ------------------ | ------------------ |
-| [my.loadFontFace](https://opendocs.alipay.com/mini/api/ggawf0) | 动态加载网络字体。 | ✗ |
-
-
-
-# 多媒体
-
-
-
-### 图片
-
-| 名称 | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------ |
-| [my.chooseImage](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage) | 拍照或从手机相册中选择图片。 | ✓ |
-| [my.compressImage](https://opendocs.alipay.com/mini/api/media/image/my.compressimage) | 压缩图片。 | ✗ |
-| [my.getImageInfo](https://opendocs.alipay.com/mini/api/media/image/my.getimageinfo) | 获取图片信息。 | ✓ |
-| [my.generateImageFromCode](https://opendocs.alipay.com/mini/api/media/image/my.generateimagefromcode) | 生成二维码,由客户端生成,速度快且不耗流量。 | ✗ |
-| [my.previewImage](https://opendocs.alipay.com/mini/api/media/image/my.previewimage) | 预览图片。 | ✓ |
-| [my.saveImage](https://opendocs.alipay.com/mini/api/media/image/my.saveimage) | 保存在线图片到手机相册。 | ✗ |
-| [my.saveImageToPhotosAlbum](https://opendocs.alipay.com/mini/api/media/image/my.saveImagetophotosalbum) | 保存图片到系统相册。 | ✗ |
-
-
-
-### 视频
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| [my.createVideoContext](https://opendocs.alipay.com/mini/api/media/video/my.createvideocontext) | 小程序里内嵌入视频组件,即可上传并播放视频。 my.createVideoContext 用于创建并返回一个 videoId 上下文对象 videoContext。 | ✗ |
-| [my.chooseVideo](https://opendocs.alipay.com/mini/api/media/video/my.choosevideo) | 拍摄视频或从手机相册中选视频。 | ✗ |
-| [my.saveVideoToPhotosAlbum](https://opendocs.alipay.com/mini/api/media/video/my.savevideotophotosalbum) | 保存视频到相册。 | ✗ |
-
-
-
-### 音频播放
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------ |
-| [my.createInnerAudioContext](https://opendocs.alipay.com/mini/00bg4q) | 在小程序内创建并返回内部音频(与背景音频相对应) innerAudioContext 对象。又称“前景音频”。 | ✗ |
-| [my.getAvailableAudioSources](https://opendocs.alipay.com/mini/00bg4t) | 获取当前支持的音频输入源。 | ✗ |
-| [my.getBackgroundAudioManager](https://opendocs.alipay.com/mini/00bifu) | 获取后台音频播放器,与前景音频相对应,可以在用户离开当前小程序后继续播放音频。 | ✗ |
-| [my.offAudioInterruptionBegin](https://opendocs.alipay.com/mini/00jim9) | 取消监听音频因为系统占用而被中断的开始事件。 | ✗ |
-| [my.offAudioInterruptionEnd](https://opendocs.alipay.com/mini/00jfja) | 取消监听音频被中断的结束事件。 | ✗ |
-| [my.onAudioInterruptionBegin](https://opendocs.alipay.com/mini/00jim8) | 监听音频因为系统占用而被中断的开始事件。 | ✗ |
-| [my.onAudioInterruptionEnd](https://opendocs.alipay.com/mini/00jgot) | 监听音频被中断的结束事件。 | ✗ |
-
-
-
-### lottie 动画
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
-| [my.createLottieContext](https://opendocs.alipay.com/mini/api/createlottiecontext) | Lottie 是一个用于 Web 和 iOS 的移动库,可使用 Bodymovin 解析以 JSON 格式导出的 Adobe After Effects 动画,并将其本地呈现在移动设备上。
my.createLottieContext 用于创建并返回一个 lottieId 上下文对象 lottieContext。 | ✗ |
-
-
-
-# 缓存
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------- | --------------------------------------------------- | ------------------ |
-| [my.setStorage](https://opendocs.alipay.com/mini/api/eocm6v) | 将数据存储在本地缓存中指定的 key 中的异步接口。 | ✓ |
-| [my.setStorageSync](https://opendocs.alipay.com/mini/api/cog0du) | 同步将数据存储在本地缓存中指定的 key 中的同步接口。 | ✓ |
-| [my.getStorage](https://opendocs.alipay.com/mini/api/azfobl) | 获取缓存数据的异步接口。 | ✓ |
-| [my.getStorageSync](https://opendocs.alipay.com/mini/api/ox0wna) | 获取缓存数据的同步接口。 | ✓ |
-| [my.removeStorage](https://opendocs.alipay.com/mini/api/of9hze) | 删除缓存数据的异步接口。 | ✓ |
-| [my.removeStorageSync](https://opendocs.alipay.com/mini/api/ytfrk4) | 删除缓存数据的同步接口。 | ✓ |
-| [my.clearStorage](https://opendocs.alipay.com/mini/api/storage) | 清除本地数据缓存的异步接口。 | ✓ |
-| [my.clearStorageSync](https://opendocs.alipay.com/mini/api/ulv85u) | 清除本地数据缓存的同步接口。 | ✓ |
-| [my.getStorageInfo](https://opendocs.alipay.com/mini/api/zvmanq) | 获取当前 storage 的相关信息的异步接口。 | ✓ |
-| [my.getStorageInfoSync](https://opendocs.alipay.com/mini/api/uw5rdl) | 获取当前 storage 相关信息的同步接口。 | ✓ |
-
-
-
-# 文件
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------- | --------------------------------------------------- | ------------------ |
-| [my.getFileSystemManager](https://opendocs.alipay.com/mini/api/0226oc) | 获取全局唯一的文件管理器。 | ✗ |
-| [my.getFileInfo](https://opendocs.alipay.com/mini/api/file) | 获取文件信息。 | ✗ |
-| [my.getSavedFileInfo](https://opendocs.alipay.com/mini/api/qrx6ze) | 获取保存的文件信息。 | ✗ |
-| [my.getSavedFileList](https://opendocs.alipay.com/mini/api/cgohg1) | 获取保存的所有文件信息。 | ✗ |
-| [my.openDocument](https://opendocs.alipay.com/mini/api/mwpprc) | 在新页面打开文件预览,暂时只支持预览 PDF 格式文件。 | ✗ |
-| [my.removeSavedFile](https://opendocs.alipay.com/mini/api/dgi1fr) | 删除某个保存的文件。 | ✗ |
-| [my.saveFile](https://opendocs.alipay.com/mini/api/xbll1q) | 保存文件到本地。 | ✗ |
-
-
-
-## 位置
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------ | -------------------------------- | ------------------ |
-| [my.getLocation](https://opendocs.alipay.com/mini/api/mkxuqd) | 获取用户当前的地理位置信息。 | ✓ |
-| [my.openLocation](https://opendocs.alipay.com/mini/api/as9kin) | 使用支付宝内置地图查看位置。 | ✓ |
-| [my.chooseLocation](https://opendocs.alipay.com/mini/api/location) | 使用支付宝内置地图选择地理位置。 | ✓ |
-
-
-
-## 网络
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------ |
-| [my.request](https://opendocs.alipay.com/mini/api/owycmh) | 小程序网络请求。 | ✓ |
-| [my.uploadFile](https://opendocs.alipay.com/mini/api/kmq4hc) | 上传本地资源到开发者服务器。 | ✓ |
-| [my.downloadFile](https://opendocs.alipay.com/mini/api/xr054r) | 下载文件资源到本地。 | ✗ |
-| [my.connectSocket](https://opendocs.alipay.com/mini/api/vx19c3) | 创建一个 [WebSocket](https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket) 的连接。 | ✗ |
-| [my.onSocketOpen](https://opendocs.alipay.com/mini/api/itm5og) | 监听 WebSocket 连接打开事件。 | ✗ |
-| [my.offSocketOpen](https://opendocs.alipay.com/mini/api/dva3t8) | 取消监听 WebSocket 连接打开事件。 | ✗ |
-| [my.onSocketError](https://opendocs.alipay.com/mini/api/giu3c2) | 监听 WebSocket 错误。 | ✗ |
-| [my.offSocketError](https://opendocs.alipay.com/mini/api/kk7vv7) | 取消监听 WebSocket 错误。 | ✗ |
-| [my.sendSocketMessage](https://opendocs.alipay.com/mini/api/mr91d1) | 通过 WebSocket 连接发送数据。 | ✗ |
-| [my.onSocketMessage](https://opendocs.alipay.com/mini/api/gecnap) | 监听 WebSocket 接受到服务器的消息事件。 | ✗ |
-| [my.offSocketMessage](https://opendocs.alipay.com/mini/api/roziyq) | 取消监听 WebSocket 接受到服务器的消息事件。 | ✗ |
-| [my.closeSocket](https://opendocs.alipay.com/mini/api/network) | 关闭 WebSocket 连接。 | ✗ |
-| [my.onSocketClose](https://opendocs.alipay.com/mini/api/foqk6g) | 监听 WebSocket 关闭。 | ✗ |
-| [my.offSocketClose](https://opendocs.alipay.com/mini/api/qc4q3t) | 取消监听 WebSocket 关闭。 | ✗ |
-
-
-
-## 设备
-
-
-
-### 系统信息
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------- | ---------------------------- | ------------------ |
-| [my.getSystemInfo](https://opendocs.alipay.com/mini/api/system-info) | 获取手机系统信息。 | ✓ |
-| [my.getSystemInfoSync](https://opendocs.alipay.com/mini/api/gawhvz) | 获取手机系统信息的同步接口。 | ✓ |
-
-
-
-### 网络状态
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------ | ------------------------ | ------------------ |
-| [my.getNetworkType](https://opendocs.alipay.com/mini/api/network-status) | 获取当前网络状态。 | ✓ |
-| [my.onNetworkStatusChange](https://opendocs.alipay.com/mini/api/ympi0l) | 开始网络状态变化的监听。 | ✓ |
-| [my.offNetworkStatusChange](https://opendocs.alipay.com/mini/api/gxpg1w) | 取消网络状态变化的监听。 | ✓ |
-
-
-
-### 剪切板
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------- | ---------------- | ------------------ |
-| [my.getClipboard](https://opendocs.alipay.com/mini/api/clipboard) | 获取剪贴板数据。 | ✓ |
-| [my.setClipboard](https://opendocs.alipay.com/mini/api/klbkbp) | 设置剪贴板数据。 | ✓ |
-
-
-
-### 摇一摇
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------- | ------------ | ------------------ |
-| [my.watchShake](https://opendocs.alipay.com/mini/api/shake) | 摇一摇功能。 | ✗ |
-
-
-
-### 振动
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------- | ------------------------ | ------------------ |
-| [my.vibrate](https://opendocs.alipay.com/mini/api/vibrate) | 调用振动功能。 | ✗ |
-| [my.vibrateLong](https://opendocs.alipay.com/mini/api/ucm2he) | 较长时间的振动 (400ms)。 | ✗ |
-| [my.vibrateShort](https://opendocs.alipay.com/mini/api/ad6c10) | 较短时间的振动 (40ms)。 | ✗ |
-
-
-
-### 加速度计
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------ | -------------------- | ------------------ |
-| [my.startAccelerometer](https://opendocs.alipay.com/mini/022hgl) | 开始监听加速度数据。 | ✗ |
-| [my.stopAccelerometer](https://opendocs.alipay.com/mini/022hgm) | 停止监听加速度数据。 | ✗ |
-| [my.onAccelerometerChange](https://opendocs.alipay.com/mini/api/accelerometer) | 监听加速度数据。 | ✗ |
-| [my.offAccelerometerChange](https://opendocs.alipay.com/mini/api/kape7p) | 停止监听加速度数据。 | ✗ |
-
-
-
-### 陀螺仪
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------- | ------------------------ | ------------------ |
-| [my.startGyroscope](https://opendocs.alipay.com/mini/022kkm) | 开始监听陀螺仪数据。 | ✗ |
-| [my.stopGyroscope](https://opendocs.alipay.com/mini/022hgn) | 停止监听陀螺仪数据。 | ✗ |
-| [my.onGyroscopeChange](https://opendocs.alipay.com/mini/api/gyroscope) | 监听陀螺仪数据变化事件。 | ✗ |
-| [my.offGyroscopeChange](https://opendocs.alipay.com/mini/api/cpt55i) | 停止监听陀螺仪数据。 | ✗ |
-
-
-
-### 罗盘
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------ | ------------------ | ------------------ |
-| [my.startCompass](https://opendocs.alipay.com/mini/022kkk) | 开始监听罗盘数据。 | ✗ |
-| [my.stopCompass](https://opendocs.alipay.com/mini/022kkl) | 停止监听罗盘数据。 | ✗ |
-| [my.onCompassChange](https://opendocs.alipay.com/mini/api/compass) | 监听罗盘数据。 | ✗ |
-| [my.offCompassChange](https://opendocs.alipay.com/mini/api/xf671t) | 停止监听罗盘数据。 | ✗ |
-
-
-
-### 设备方向
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------------------------- | ---------------------- | ------------------ |
-| [my.onDeviceMotionChange](https://opendocs.alipay.com/mini/api/my.ondevicemotionchange) | 监听设备方向变化。 | ✗ |
-| [my.offDeviceMotionChange](https://opendocs.alipay.com/mini/api/my.offdevicemotionchange) | 停止监听设备方向变化。 | ✗ |
-
-
-
-### 拨打电话
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------- | ------------ | ------------------ |
-| [my.makePhoneCall](https://opendocs.alipay.com/mini/api/macke-call) | 拨打电话。 | ✓ |
-
-
-
-### 获取服务器时间
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------ | ---------------------------- | ------------------ |
-| [my.getServerTime](https://opendocs.alipay.com/mini/api/get-server-time) | 获取当前服务器时间的毫秒数。 | ✗ |
-
-
-
-### 用户截屏事件
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------------- | ---------------------------- | ------------------ |
-| [my.onUserCaptureScreen](https://opendocs.alipay.com/mini/api/user-capture-screen) | 监听用户发起的主动截屏事件。 | ✗ |
-| [my.offUserCaptureScreen](https://opendocs.alipay.com/mini/api/umdxbg) | 取消监听截屏事件。 | ✗ |
-
-
-
-### 屏幕亮度
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------------------- | -------------------------- | ------------------ |
-| [my.setKeepScreenOn](https://opendocs.alipay.com/mini/api/qx0sap) | 设置是否保持屏幕长亮状态。 | ✗ |
-| [my.getScreenBrightness](https://opendocs.alipay.com/mini/api/screen-brightness) | 获取屏幕亮度。 | ✗ |
-| [my.setScreenBrightness](https://opendocs.alipay.com/mini/api/ccf32t) | 设置屏幕亮度。 | ✗ |
-
-
-
-### 设置
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------- | -------------------------------------------- | ------------------ |
-| [my.openSetting](https://opendocs.alipay.com/mini/api/qflu8f) | 打开小程序设置界面,返回用户权限设置的结果。 | ✗ |
-| [my.getSetting](https://opendocs.alipay.com/mini/api/xmk3ml) | 获取用户的当前设置。 | ✗ |
-
-
-
-### 添加手机联系人
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------- | ------------------ |
-| [my.addPhoneContact](https://opendocs.alipay.com/mini/api/contact) | 用户可以选择将该表单以“创建新联系人”或“添加到现有联系人”的方式,写入到手机系统的通讯录。 | ✗ |
-
-
-
-### 无障碍
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| --------------------------------------------------------------------------------------------- | ---------------------------- | ------------------ |
-| [my.isScreenReaderEnabled](https://opendocs.alipay.com/mini/api/device/isscreenreaderenabled) | 获取设备是否开启无障碍模式。 | ✗ |
-
-
-
-### 权限引导
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------ | ----------------------------------------------------------------------- | ------------------ |
-| [my.showAuthGuide](https://opendocs.alipay.com/mini/api/show-auth-guide) | 通过权限引导模块以图文等形式向用户弹出 Dialog,引导用户打开相应的权限。 | ✗ |
-
-
-
-### 扫码
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------- | ---------------- | ------------------ |
-| [my.scan](https://opendocs.alipay.com/mini/api/scan) | 调用扫一扫功能。 | ✗ |
-
-
-
-### 内存不足告警
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------ | ---------------------------- | ------------------ |
-| [my.onMemoryWarning](https://opendocs.alipay.com/mini/api/rb9o8p) | 开始监听内存不足的告警事件。 | ✗ |
-| [my.offMemoryWarning](https://opendocs.alipay.com/mini/api/hszexr) | 停止监听内存不足的告警事件。 | ✗ |
-
-
-
-### 获取设备电量
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------- | -------------------- | ------------------ |
-| [my.getBatteryInfo](https://opendocs.alipay.com/mini/api/nrnziy) | 获取电量的异步接口。 | ✗ |
-| [my.getBatteryInfoSync](https://opendocs.alipay.com/mini/api/vf7vn3) | 获取电量的同步接口。 | ✗ |
-
-
-
-#### 低功耗蓝牙
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| [my.connectBLEDevice](https://opendocs.alipay.com/mini/api/tmew6e) | 连接低功耗蓝牙设备。 | ✗ |
-| [my.setBLEMTU](https://opendocs.alipay.com/mini/api/my.setblemtu) | 设置低功耗蓝牙设备最大传输单元(MTU)。需在 [my.connectBLEDevice](https://opendocs.alipay.com/mini/api/tmew6e) 调用成功后调用,mtu 设置范围(22, 512)。 | ✗ |
-| [my.getBLEMTU](https://opendocs.alipay.com/mini/api/my.getblemtu) | 获取低功耗蓝牙设备的最大传输单元(MTU)。 | ✗ |
-| [my.disconnectBLEDevice](https://opendocs.alipay.com/mini/api/yqrmmk) | 断开与低功耗蓝牙设备的连接。 | ✗ |
-| [my.writeBLECharacteristicValue](https://opendocs.alipay.com/mini/api/vmp2r4) | 向低功耗蓝牙设备特征值中写入数据。 | ✗ |
-| [my.readBLECharacteristicValue](https://opendocs.alipay.com/mini/api/zro0ka) | 读取低功耗蓝牙设备特征值中的数据。 | ✗ |
-| [my.notifyBLECharacteristicValueChange](https://opendocs.alipay.com/mini/api/pdzk44) | 启用低功耗蓝牙设备特征值变化时的 notify 功能。 | ✗ |
-| [my.getBLEDeviceServices](https://opendocs.alipay.com/mini/api/uzsg75) | 获取蓝牙设备所有 service(服务)。 | ✗ |
-| [my.getBLEDeviceRSSI](https://opendocs.alipay.com/mini/api/my.getbledevicerssi) | 获取蓝牙低功耗设备的信号强度(Received Signal Strength Indication, RSSI)。 | ✗ |
-| [my.getBLEDeviceCharacteristics](https://opendocs.alipay.com/mini/api/fmg9gg) | 获取蓝牙设备所有 characteristic(特征值)。 | ✗ |
-| [my.onBLECharacteristicValueChange](https://opendocs.alipay.com/mini/api/cdu501) | 监听低功耗蓝牙设备的特征值变化的事件。 | ✗ |
-| [my.offBLECharacteristicValueChange](https://opendocs.alipay.com/mini/api/dlxobk) | 监听低功耗蓝牙设备的特征值变化的事件。 | ✗ |
-| [my.onBLEConnectionStateChanged](https://opendocs.alipay.com/mini/api/utgyiu) | 监听低功耗蓝牙连接的错误事件,包括设备丢失,连接异常断开等。 | ✗ |
-| [my.offBLEConnectionStateChanged](https://opendocs.alipay.com/mini/api/xfuy7k) | 取消低功耗蓝牙连接状态变化事件的监听。 | ✗ |
-
-
-
-#### 传统蓝牙
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------------------- | ------------------------------------------------------------ | ------------------ |
-| [my.openBluetoothAdapter](https://opendocs.alipay.com/mini/api/kunuy4) | 初始化小程序蓝牙模块。 | ✗ |
-| [my.closeBluetoothAdapter](https://opendocs.alipay.com/mini/api/wvko0w) | 关闭本机蓝牙模块。 | ✗ |
-| [my.getBluetoothAdapterState](https://opendocs.alipay.com/mini/api/eid4o6) | 获取本机蓝牙模块状态。 | ✗ |
-| [my.startBluetoothDevicesDiscovery](https://opendocs.alipay.com/mini/api/ksew43) | 获取本机蓝牙模块状态。 | ✗ |
-| [my.stopBluetoothDevicesDiscovery](https://opendocs.alipay.com/mini/api/syb4mi) | 停止搜寻附近的蓝牙外围设备。 | ✗ |
-| [my.getBluetoothDevices](https://opendocs.alipay.com/mini/api/pelizr) | 获取所有已发现的蓝牙设备,包括已经和本机处于连接状态的设备。 | ✗ |
-| [my.getConnectedBluetoothDevices](https://opendocs.alipay.com/mini/api/ge8nue) | 获取处于已连接状态的设备。 | ✗ |
-| [my.onBluetoothDeviceFound](https://opendocs.alipay.com/mini/api/mhzls9) | 搜索到新的蓝牙设备时触发此事件。 | ✗ |
-| [my.offBluetoothDeviceFound](https://opendocs.alipay.com/mini/api/snw2t7) | 移除寻找到新的蓝牙设备事件的监听。 | ✗ |
-| [my.onBluetoothAdapterStateChange](https://opendocs.alipay.com/mini/api/eegfbk) | 监听本机蓝牙状态变化的事件。 | ✗ |
-| [my.offBluetoothAdapterStateChange](https://opendocs.alipay.com/mini/api/ocgwfe) | 移除本机蓝牙状态变化的事件的监听。 | ✗ |
-| [my.makeBluetoothPair](https://opendocs.alipay.com/mini/api/makebluetoothpair) | 蓝牙配对接口。连接蓝牙之前,部分设备需要先配对。 | ✗ |
-| [my.cancelBluetoothPair](https://opendocs.alipay.com/mini/01zarv) | 取消蓝牙设备配对。 | ✗ |
-| [my.getBluetoothPairs](https://opendocs.alipay.com/mini/01zdnf) | 获取已经配对的蓝牙设备。 | ✗ |
-
-
-
-#### iBeacon
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------------------- | --------------------------------- | ------------------ |
-| [my.startBeaconDiscovery](https://opendocs.alipay.com/mini/api/cy1g7k) | 开始搜索附近的 iBeacon 设备。 | ✗ |
-| [my.stopBeaconDiscovery](https://opendocs.alipay.com/mini/api/yp5owa) | 停止搜索附近的 iBeacon 设备。 | ✗ |
-| [my.getBeacons](https://opendocs.alipay.com/mini/api/yqleyc) | 获取已经搜索到的 iBeacon 设备。 | ✗ |
-| [my.onBeaconUpdate](https://opendocs.alipay.com/mini/api/kvdg9y) | 监听 iBeacon 设备的更新事件。 | ✗ |
-| [my.onBeaconServiceChange](https://opendocs.alipay.com/mini/api/rq1dl7) | 监听 iBeacon 服务的状态变化。 | ✗ |
-| [my.offBeaconServiceChange](https://opendocs.alipay.com/mini/api/offbeaconservicechange) | 取消监听 iBeacon 服务的状态变化。 | ✗ |
-| [my.offBeaconUpdate](https://opendocs.alipay.com/mini/api/offbeaconupdate) | 取消监听 iBeacon 设备的更新事件。 | ✗ |
-
-
-
-### WiFi
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| [my.startWifi](https://opendocs.alipay.com/mini/api/startwifi) | 初始化 Wi-Fi 模块。 | ✗ |
-| [my.stopWifi](https://opendocs.alipay.com/mini/api/stopwifi) | 关闭 Wi-Fi 模块。 | ✗ |
-| [my.connectWifi](https://opendocs.alipay.com/mini/api/connectwifi) | 连接 Wi-Fi。若已知 Wi-Fi 信息,可以直接利用该接口连接。 | ✗ |
-| [my.getWifiList](https://opendocs.alipay.com/mini/api/getwifilist) | 请求获取 Wi-Fi 列表,在 onGetWifiList 注册的回调中返回 wifiList 数据。iOS 将跳转到系统的 Wi-Fi 界面,Android 不会跳转。 | ✗ |
-| [my.setWifiList](https://opendocs.alipay.com/mini/api/setwifilist) | 在 `my.onGetWifiList` 回调触发后,利用接口设置 wifiList 中 AP 的相关信息。 | ✗ |
-| [my.onWifiConnected](https://opendocs.alipay.com/mini/api/onwificonnected) | 监听连接上 Wi-Fi 的事件。 | ✗ |
-| [my.offWifiConnected](https://opendocs.alipay.com/mini/api/offwificonnected) | 取消监听连接上 Wi-Fi 的事件。 | ✗ |
-| [my.onGetWifiList](https://opendocs.alipay.com/mini/api/ongetwifilist) | 监听在获取到 Wi-Fi 列表数据时的事件,在回调中将返回 wifiList。 | ✗ |
-| [my.offGetWifiList](https://opendocs.alipay.com/mini/api/offgetwifilist) | 取消监听在获取到 Wi-Fi 列表数据时的事件。 | ✗ |
-| [my.getConnectedWifi](https://opendocs.alipay.com/mini/api/getconnectedwifi) | 获取已连接中的 Wi-Fi 信息。 | ✗ |
-| [my.registerSSID](https://opendocs.alipay.com/mini/api/register) | 信任该 SSID,对于需要 Portal 认证的 WIFI,不会弹出 portal 认证页面。 | ✗ |
-| [my.unregisterSSID](https://opendocs.alipay.com/mini/api/unregister) | 不再信任该 SSID,对于需要 Portal 认证的 WIFI,继续弹出 portal 认证页面。 | ✗ |
-
-
-
-# worker
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------- | ----------------------- | ------------------ |
-| [my.createWorker](https://opendocs.alipay.com/mini/api/createworker) | 创建一个 Worker 线程。 | ✗ |
-
-
-
-## 数据安全
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------- | ------------ | ------------------ |
-| [my.rsa](https://opendocs.alipay.com/mini/api/data-safe) | 非对称加密。 | ✗ |
-
-
-
-## 分享
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------ |
-| [onShareAppMessage](https://opendocs.alipay.com/mini/framework/page-detail#%E9%A1%B5%E9%9D%A2%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0) | 在 Page 中定义 onShareAppMessage 函数,设置该页面的分享信息。 | ✗ |
-| [my.hideShareMenu](https://opendocs.alipay.com/mini/api/share_app) | 隐藏分享按钮。 | ✗ |
-| [my.showSharePanel](https://opendocs.alipay.com/mini/api/omg2ye) | 唤起分享面板。 | ✗ |
-
-
-
-## 自定义通用菜单
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------ | -------------------------------------------------- | ------------------ |
-| [my.hideAddToDesktopMenu](https://opendocs.alipay.com/mini/api/optionmenuitem) | 隐藏当前页面通用菜单中的 **添加到桌面** 功能。 | ✗ |
-| [my.hideAllAddToDesktopMenu](https://opendocs.alipay.com/mini/api/fdaplu) | 隐藏所有页面的通用菜单中的 **添加到桌面** 功能。 | ✗ |
-
-
-
-## 更新管理
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------ | ------------------------------------------------------------------------------- | ------------------ |
-| [my.getUpdateManager](https://opendocs.alipay.com/mini/api/zdblqg) | 创建一个 UpdateManager 对象,获取全局唯一的版本更新管理器,用于管理小程序更新。 | ✗ |
-| [UpdateManager](https://opendocs.alipay.com/mini/api/ngwgfi) | UpdateManager 对象,用来管理更新,可通过 my.getUpdateManager 接口获取实例。 | ✗ |
-
-
-
-## web-view 组件控制
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------ |
-| [my.createWebViewContext](https://opendocs.alipay.com/mini/api/webview-context) | 通过创建`webviewContext`提供从小程序向`web-view`发送消息的能力。创建并返回 `web-view` 上下文 `webViewContext` 对象。 | ✓ |
-
-
-
-## 跳转支付宝应用或页面
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| --------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------ |
-| [my.ap.navigateToAlipayPage](https://opendocs.alipay.com/mini/api/navigatetoalipaypage) | 小程序中跳转到支付宝官方业务或运营活动页面。 | ✗ |
-
-
-
-## 升级支付宝最新版本
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------------------- | -------------------------- | ------------------ |
-| [my.ap.updateAlipayClient](https://opendocs.alipay.com/mini/api/updatealipayclient) | 打开支付宝客户端升级界面。 | ✗ |
-
-
-
-## 开放能力 API
-
-
-
-### 基础能力
-
-| **能力名称** | **API 名称** | **功能说明** | **MorJS 是否支持** |
-| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------ |
-| [小程序相互跳转](https://opendocs.alipay.com/mini/introduce/open-miniprogram) | [my.navigateBackMiniProgram](https://opendocs.alipay.com/mini/api/open-miniprogram) | 跳转回上一个小程序的 API,只有当另一个小程序跳转到当前小程序时才能调用成功。 | ✗ |
-| | [my.navigateToMiniProgram](https://opendocs.alipay.com/mini/api/yz6gnx) | 跳转到其他小程序。 | ✗ |
-| [用户授权](https://docs.alipay.com/mini/introduce/authcode) | [my.getAuthCode](https://docs.alipay.com/mini/api/openapi-authorize) | 获取用户授权码。 | ✓ |
-
-
-
-### 支付能力
-
-| **能力名称** | **API 名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------ | --------------------------------------------------------------- | ---------------- | ------------------ |
-| [小程序支付](https://opendocs.alipay.com/mini/introduce/pay) | [my.tradePay](https://opendocs.alipay.com/mini/api/openapi-pay) | 小程序唤起支付。 | ✗ |
-
-
-
-### 资金能力
-
-| **能力名称** | **API 名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------ | --------------------------------------------------------------- | ----------------------------------------- | ------------------ |
-| [资金授权](https://opendocs.alipay.com/mini/introduce/pre-authorization) | [my.tradePay](https://opendocs.alipay.com/mini/api/openapi-pay) | 小程序支付接口。 | ✗ |
-| [周期扣款](https://opendocs.alipay.com/mini/006srl) | [my.paySignCenter](https://opendocs.alipay.com/mini/006v6d) | 在支付宝小程序内启动一个代扣 HTML5 服务。 | ✗ |
-
-
-
-### 会员能力
-
-| **能力名称** | **API 名称** | **功能说明** | **MorJS 是否支持** |
-| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------------------ |
-| [获取会员基础信息](https://opendocs.alipay.com/mini/introduce/twn8vq) | [my.getAuthCode](https://opendocs.alipay.com/mini/api/openapi-authorize) | 用户授权获取授权 code。注意在此注册流程中,scopes 参数请传递 “auth_base”。 | ✗ |
-| | [my.getOpenUserInfo](https://opendocs.alipay.com/mini/api/ch8chh) | 获取会员基础信息。 | ✗ |
-| [获取会员手机号](https://opendocs.alipay.com/mini/introduce/getphonenumber) | [my.getPhoneNumber](https://opendocs.alipay.com/mini/api/getphonenumber) | 获取会员手机号码。 | ✗ |
-| [获取会员收货地址](https://opendocs.alipay.com/mini/introduce/getaddress) | [my.getAddress](https://opendocs.alipay.com/mini/api/lymgfk) | 获取会员收货地址。 | ✗ |
-| [商户会员卡](https://opendocs.alipay.com/mini/introduce/card) | [my.addCardAuth](https://opendocs.alipay.com/mini/api/add-card-auth) | 小程序内唤起开卡页面。 | ✗ |
-| | [my.openCardList](https://opendocs.alipay.com/mini/api/qxxpsh) | 打开支付宝卡包中的“卡”列表。 | ✗ |
-| | [my.openMerchantCardList](https://opendocs.alipay.com/mini/api/axfplw) | 打开当前用户领取某个商户的“卡”列表。 | ✗ |
-| | [my.openCardDetail](https://opendocs.alipay.com/mini/api/card-voucher-ticket#myopencarddetail) | 打开当前用户领取某张卡的详情页。 | ✗ |
-
-
-
-### 营销能力
-
-| **能力名称** | **API 名称** | **功能说明** | **MorJS 是否支持** |
-| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------ |
-| [支付宝卡包](https://opendocs.alipay.com/mini/introduce/voucher) | [my.openVoucherList](https://opendocs.alipay.com/mini/api/vq3mgn) | 打开支付宝卡包中的“劵”列表。 | ✗ |
-| | [my.openMerchantVoucherList](https://opendocs.alipay.com/mini/api/sgvgu6) | 打开当前用户领取某个商户的“劵”列表。 | ✗ |
-| | [my.openVoucherDetail](https://opendocs.alipay.com/mini/api/card-voucher-ticket#myopenvoucherdetail) | 打开当前用户领取某张劵的详情页(非口碑劵)。 | ✗ |
-| | [my.openKBVoucherDetail](https://opendocs.alipay.com/mini/api/ga4obi) | 打开当前用户领取某张劵的详情页(口碑劵)。 | ✗ |
-| | [my.openTicketList](https://opendocs.alipay.com/mini/api/ezt6u3) | 打开支付宝卡包中的“票”列表。 | ✗ |
-| | [my.openMerchantTicketList](https://opendocs.alipay.com/mini/api/yee76y) | 打开当前用户领取某个商户的“票”列表。 | ✗ |
-| | [my.openTicketDetail](https://opendocs.alipay.com/mini/api/ry7ftz) | 打开当前用户领取某张票的详情页。 | ✗ |
-| [运动数据](https://opendocs.alipay.com/mini/introduce/rundata) | [my.getRunData](https://opendocs.alipay.com/mini/api/gxuu7v) | 获取步数。 | ✗ |
-| [小程序自定义分享](https://opendocs.alipay.com/mini/introduce/share) | [onShareAppMessage](https://opendocs.alipay.com/mini/framework/page-detail#%E9%A1%B5%E9%9D%A2%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0) | 设置页面的分享信息。 | ✗ |
-
-
-
-### 安全能力
-
-| **能力名称** | **API 名称** | **功能说明** | **MorJS 是否支持** |
-| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------ | ------------------ |
-| [先享后付保障](https://opendocs.alipay.com/mini/introduce/non-sufficient-funds) | [my.ap.nsf](https://opendocs.alipay.com/mini/api/nsf) | 先享后付保障。 | ✗ |
-| [营销反作弊](https://opendocs.alipay.com/mini/introduce/antimarketcheat) | [my.ap.preventCheat](https://opendocs.alipay.com/mini/api/antimarketcheat) | 营销反作弊。 | ✗ |
-| [文本风险识别](https://opendocs.alipay.com/mini/introduce/text-identification) | [my.textRiskIdentification](https://opendocs.alipay.com/mini/api/text-identification) | 文本风险识别(用户端)。 | ✗ |
-| [图片内容安全](https://opendocs.alipay.com/mini/introduce/img_risk) | [my.ap.imgRisk](https://opendocs.alipay.com/mini/api/img_risk) | 图片提交接口。 | ✗ |
-| | [my.ap.imgRiskCallback](https://opendocs.alipay.com/mini/api/ze6675) | 风险结果查询接口。 | ✗ |
-
-
-
-## 模板配置
-
-| **名称** | **功能说明** | **MorJS 是否支持** |
-| ---------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| [my.getExtConfig](https://opendocs.alipay.com/mini/api/getExtConfig) | 获取 [模板小程序](https://opendocs.alipay.com/mini/isv/creatminiapp#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 自定义数据字段的异步接口。 | ✗ |
-| [my.getExtConfigSync](https://opendocs.alipay.com/mini/api/getExtConfigSync) | 获取 [模板小程序](https://opendocs.alipay.com/mini/isv/creatminiapp#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 自定义数据字段的同步接口。 | ✗ |
diff --git a/website/docs/web/blog/event.md b/website/docs/web/blog/event.md
deleted file mode 100644
index 702ab375..00000000
--- a/website/docs/web/blog/event.md
+++ /dev/null
@@ -1,231 +0,0 @@
-# 事件原理
-
-小程序原生组件有些事件是支持路由的,比如:`tap、touchstart、touchmove、touchend` 等,这个其实跟 `HTML` 原生事件是一样的。如果仅仅是支持路由事件的话,直接使用`react` 事件(因为是运行在 `react` 上的)即可。但事实上,`react` 的事件支持是有限的,`react` 仅仅提供了一些常用的事件支持,但是对于自定义( `CustomEvent` )的路由事件是无法支持的。[`react` 事件支持列表](https://reactjs.org/docs/events.html) 。如果想要支持自定义事件,那么还得回到 `HtmlElement.addEventListner` 上来。因此,在 `MorJS` 的事件解决方案中,干脆剔除不再采用 `react` 事件,而是直接由 `runtime` 来提供事件的支持。
-
-这就意味着,`runtime` 需要具备事件的注册、分发能力。首先,我们代码最终是被编译成 `react` 代码,而 `react` 不支持自定义事件,因此解决方案最终还是会回到 `addEventListener` 上来,然而,下一个问题是如何找到事件的绑定对象( `HTMLElement` )。如下例子:
-
-```html
- view
-```
-
-`view` 是一个 `HTMLElement` ,需要绑定事件 `onTap` ,并且事件的回调方法需要绑定到 JS 文件中的 `onTapEvent` 方法。以上的代码如果转换成 `JSX` 代码的话如下:
-
-```js
-render(){
- return view
-}
-```
-
-上面说了,`MorJS` 放弃了 `react` 自带的事件系统,还是回到 `addEventListener` 上来,因此需要在 `react` 组件渲染完( `componentDidMount` ) 以后,动态的找到对应的 `HtmlElement` 并且绑定事件。那么这时候问题就回到如果找到需要绑定事件的 `HtmlElement`。
-
-平常我们在开发 `react` 的时候,会通过 `ref` 或者 `querySelectorAll` 、 `querySelector` 来查询 `HtmlElement` ,然而在 `MorJS` 中显然不会大规模的使用 `ref` 来获取,最简单的方法就是通过 `querySelectorAll` 来查询。`MorJS` 在编译器层面,对所有的元素都会设置一个 `tiga_node_id` 的属性,这个属性的作用就是 `xml` 文档(非 `dom` )中每个元素的 `id` 是唯一的。之所以会分配这个 `id`,主要是考虑了以后可以兼容 `domino` 平台,支持低代码平台的画布。
-
-```js
-render(){
- return
- view
-
-}
-```
-
-那么可以使用
-
-```js
-querySelectorAll(`[tiga_node_id="e539a99b2f584b80a9af3293d1c6bfca"]`)
-```
-
-就能找到对应的 `htmlElement` 。那么剩下还有一个问题,就是如何建立绑定关系,不同的事件需要绑定不同的事件回调函数。这个时候就又得需要编译器来实现了,由编译器将绑定关系转换成对象,在元素被 `react` 解析的时候将绑定关系注册到组件中,具体编译结果如下:
-
-```js
-render(){
- return
- view
- {$rm.registEvents([{
- name: "tap",
- event: "onTapEvent",
- catch: false
- }], "c3c646304e624433a1ea9e0b9a261d29")}
-}
-```
-
-从上面代码可以看到,`AXML` 代码在编译有事件的的元素的时候会添加一个 调用 `$rm.registEvents` 方法的 `jsx` 表达式。`registEvents` 方法是 `runtime` 提供的,而这个方法所做的事情其实很简单,就是把事件绑定信息缓存起来。代码如下:
-
-```js
-registEvents(events, nodeId) {
- this.eventsInfo[nodeId] = events;
-}
-```
-
-> 上面代码中的 `this` 指代的是组件、页面本身。而编译器编译后的代码,仅仅是一个 `render` 函数。
-
-自此,事件绑定信息已经有了,那么就可以进行动态绑定了。
-
-具体代码如下:
-
-```js
-/**
- * 动态绑定事件
- */
-bindEvents() {
- const root = ReactDOM.findDOMNode(this);
- if (!root) return;
- for (const noedId in this.eventsInfo) {
- const events = this.eventsInfo[noedId];
- // 先通过 tiga_node_id 来找到对应的节点元素。
- const elments = root.querySelectorAll(`[tiga_node_id="${noedId}"]`);
- // 然后动态添加绑定。
- for (const el of elments) {
- for (const eventInfo of events) {
- el.addEventListener(eventInfo.name, this.raiseEvent)
- }
- }
- }
-}
-
-raiseEvent(e) {
- const currentTarget = e.currentTarget;
- // 根据nodeId找到对应的事件配置
- const nodeId = currentTarget.getAttribute('tiga_node_id');
- if (nodeId) {
- const events = this.eventsInfo[nodeId];
- if (events) {
- const eventInfo = events.filter(i => i.name == e.type).pop();
- // NOTE:catch 会阻止事件冒泡 https://opendocs.alipay.com/mini/framework/events#%E4%BA%8B%E4%BB%B6%E7%B1%BB%E5%9E%8B
- if (eventInfo.catch) {
- e.stopPropagation();
- }
- // 找到事件回调函数
- const func = this.componentConfig[eventInfo.event];
- func && func.call(this.componentConfig, eventConvert(e));
- }
- }
- }
-```
-
-`bindEvents` 方法在每次组件 `componentDidMount` 、 `componentDidUpdate` 两种生命周期函数中调用。
-
-当事件触发的时候会调用 `raiseEvent` 方法,通过 `currentTarget` 的 `tiga_node_id` 属性找到事件绑定配置,进而找到事件回调函数。
-
-以上就是事件完整的实现原理。
-
-> 为了性能考虑,上面 `runtime` 代码中使用 `querySelectorAll` 的方式可以替换成 `getElementsByClassName` 。这个在下一版本优化中改进。
-
-## dataset 原理
-
-以上介绍了事件的实现原理,然而,实际上整个事件流程还包括 `dataset` 的设置以及读取。在小程序中,`dataset` 是支持 `string、array、object、number` 等数据类型的,但是 `tiga` 是基于 `web-components` 实现的,也可以理解为原生的 `html` 元素,然而 `html` 元素的 `dataset` 只支持 `string` ,这时候如果要支持其他类型,那么就需要进行一定的转换。
-
-首先是编译器,针对 `data-` 开头的属性,进行转码。
-
-例子如下:
-
-```html
-
- view
-
-```
-
-编译后的代码如下:
-
-```js
-render() {
- return
- view
- ;
-}
-```
-
-`toDatasetString` 方法是由 `runtime` 提供的。将数据对象转换成字符串。具体实现方法如下:
-
-```js
-toDatasetString(value) {
- switch (typeof value) {
- case 'string': {
- return `$.value('${value}')`;
- }
- case 'object': {
- if (value === null) {
- return '$.nul()';
- }
- return `$.value(${JSON.stringify(value)})`
- }
- case 'function': {
- return '';
- }
- case 'undefined': {
- return '$.undefined()';
- }
- case 'bigint':
- case 'number':
- case 'boolean': {
- return `$.value(${value})`;
- }
- default: {
- return `$.value(${value})`;
- }
- }
-}
-```
-
-从上面的代码可以看出, `toDatasetString` 方法的主要内容就是根据数据的类型,返回一段 `js` 表达式字符串。
-
-最终渲染出的 `html` 代码如下:
-
-```html
-
- view
-
-```
-
-因为,整个事件的触发是由 `runtime` 实现的,那么当然 `dataset` 也可以由 `runtime` 进行转换。比如当转换 `html` 元素的 `dataset` 时,代码如下:
-
-```js
-convertDataSet(dataset) {
- const ds = {};
- if (dataset) {
- // 这里的转换,主要是为了 dataset 支持对象或者数组
- Object.keys(dataset).forEach(key => {
- const value = dataset[key];
- ds[key] = parseDatasetValue(value);
- });
- }
- return ds;
-}
-```
-
-而 `parseDatasetValue` 方法就是将上面转换后的 `js` 表达式字符串,转换成实际的数据类型。
-
-```js
-const DataSetParser = {
- nul() {
- return null
- },
- undefined() {
- return undefined
- },
- value(v) {
- return v
- }
-}
-
-/**
- * 解析dataset value
- * @param {*} str
- */
-function parseDatasetValue(str) {
- const $ = DataSetParser
- return eval(str)
-}
-```
-
-这里,最核心的就是 `eval` 方法的调用,直接执行上面转换后的 `js` 表达式得到正确的数据类型。
diff --git a/website/docs/web/blog/index.md b/website/docs/web/blog/index.md
deleted file mode 100644
index 20b75200..00000000
--- a/website/docs/web/blog/index.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# 整体架构
-
-关于小程序转 `Web`,`MorJS` 的思路是将已有的小程序工程直接转成 `react` 代码。
-
-借助 `Webpack` ,`MorJS` 提供了一整套的 `loader`,包含 `axml-loader`(负责编译 `axml` 文件)、`acss-loader` (负责编译 `acss` 文件)、`js-loader` (负责编译小程序中的 `js` 文件)。
-
-## 介绍
-
-
-
-上图是小程序转 `Web` 的整体架构。最上面的四个部分属于内核部分,分别由 编译器、`dsl runtime`、`api(my)`、全局公共组件 四个模块组成,每一个模块都是独立可替换的。
-
-### Compiler(编译器)
-
-编译器模块比较特殊,主要负责将 `axml` 、`acss` 、`js` 、`json` 等文件编译成模块化的 `js` 文件,完全是静态编译。至于详细的编译流程下面会细说。
-
-### Runtime(运行时)
-
-`runtime` 提供了小程序在 h5 中的运行时功能,比如:`Page` 、`Component` 、`App` 等全局函数,并且提供完整的生命周期实现,事件的注册、分发(非 `react` 事件),`slot`、`block` 等全局 `DSL` 层面组件实现,等等。
-
-### API (my.\*)
-
-`api` 模块提供了类似支付宝小程序中 `my` 一系列 `api` 的实现,事实上,目前 `api` 的实现其实相对来说比较分散,在 `api` 模块并没有提供全部的支付宝小程序 `api` 的实现,有些 `api` 在全局公共组件来实现(比如:`UI` 相关的 `api`,下拉刷新等),甚至有些 `api` 需要开发者自己来实现(比如:登录态的获取等等)。
-
-### Components(全局公共组件)
-
-全局公共组件指的是 `view`、`button`、`scroll-view` 等支付宝小程序原生提供的组件,在 `MorJS` 中,这些组件是基于 `web-components` 来实现的,之所以使用`web-components` 来实现而不是 `react` ,是基于以下几个原因:
-
-1. `web-components` 组件支持标签选择器。这样就能跟小程序的组件在样式的写法上抹平。
-2. `web-components` 组件天生具备样式隔离的能力,不用担心公共组件的样式会污染全局。
-3. `web-components` 组件支持路由事件,因此小程序中的 `tap、touch` 等事件可以直接自定义抛出。
-4. `web-components` 组件注册以后,可以像原生 `html` 组件一样使用,无需单独引入组件文件。支持原生 `html` 组件的所有方法和功能。
-
-以上几个优势,如果用 `react` 来实现,虽然在技术上是可以有类似的实现,但是成本就比较高了,远不如 `web-components` 来的简单直接。
-
-### 其它
-
-除了以上四个核心模块以外,由于公共组件、`api` 的实现都是模块化的,尤其是 `api` 部分,可以轻易的扩展自己的 `api` 设置重写部分 `api` ,因此对于接入方来说,可以扩展自己的公共组件、`api`。
-
-以上四个模块,除了编译器模块,剩余的三个模块整体才算一个完整的小程序运行时。
-
-## 运行流程
-
-
-
-上图中的运行流程其实跟普通的 `react` 工程运行流程差不多,仅仅是多了一个针对 `axml` 文件、`acss` 文件、`js` 文件进行额外编译转码的流程,最终还是通过 `webpack` 进行打包运行。
-
-进一步可以分析出,这样的流程,不管是整个工程级别的转码,还是组件库级别转码,甚至是已有 `react` 项目直接引入小程序代码,都可以通过上图中的方式直接(`loader` 方式)或者间接(命令行)运行。
-
-## 编译流程
-
-> 不同的文件,编译的方式是不一样的,编译处理的内容也是不一样的。
-
-### AXML
-
-
-
-整个小程序编译器,就数 `axml` 文件编译最复杂。整个编译流程如上图所示。
-
-1. 将 `axml` 文件转换成 `xml` 文档树。
-2. 将 `xml` 文档树,转换成小程序的 `ast`。针对不同的节点类型、属性类型做针对性的转换。
- 3, 将小程序 `ast` 进一步转换成 `jsx` 代码。事实上,有了 `ast` 以后,不仅能转换成 `react` 代码,也可以转换成 `vue` 的代码,甚至也可以转换成基于 `web-component` 的代码,只需要提供不同的 `dsl runtime` 即可。这也是为何上面将 `dsl runtime` 单独作为一个模块的原因。
-
-`axml` 编译复杂的部分,不在 `ast`,而是在 `generate` 中,各种小程序 `dsl` 的特性都需要在这里进行转换。
-
-### ACSS
-
-`acss` 编译,其实很简单,目前只是做了三件事:
-
-1. `rpx` 支持—— 将 `rpx` 编译成 `rem` 。
-2. 标签样式的支持—— 这是这里仅仅是做了一个标签样式的重命名。之所以这样,是因为在实际 `axml` 中用的标签比如 `view` ,但是实际注册的标签名是 `tiga-view` 。因此在`acss` 文件中,对标签样式的重命名也是一个非常重要的功能。
-3. 条件编译。
-
-### JS
-
-最新版本的编译器,极大简化了 `JS` 文件的编译。目前 `JS` 编译器仅仅如如下几个事情。
-
-1. 条件编译的支持。
-2. `import` 路径的转换。主要是将绝对路径转换成相对于工程的根目录的相对路径。
-3. 将 `Page` 或者 `Component` 相关的 `js` 文件,编译成以 `export default` 形式导出的 `js` 文件,之所以这样做,是因为需要将 `Page` 或者 `Component` 全部以组件的形式导出,然后可以被其他 `js` 文件引用。
-
-### 总结
-
-但从编译器来说,最核心的就是 `AXML` 的编译,而 `acss` 和 `js` 文件 的编译相对来说很简单。
diff --git a/website/docs/web/blog/runtime.md b/website/docs/web/blog/runtime.md
deleted file mode 100644
index 10a48872..00000000
--- a/website/docs/web/blog/runtime.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# 运行时原理
-
-> 不管是 Page 还是 Component,在 MorJS 中,都会被视作组件处理。
-
-![image](https://gw.alicdn.com/imgextra/i3/O1CN01X3oAYS1XtnslZt9a3_!!6000000002982-2-tps-1504-888.png)
-
-上图是一个小程序组件不同代码文件最终被合并成一个组件的大概流程。从上图中可以看到,`acss` 文件、`axml` 文件在编译的时候就会被编译成 `react render function` ,而且是最终的渲染函数。这个函数只接受一个参数(`render-data`),根据 `data` 渲染出 `html`,没有任何其他的功能。
-
-而 `Component(options)` -(其实就是 `js` 文件)会被编译器以模块的形式导出,在 `runtime` 中会根据 `options` 动态生成一个 `Component` 的实例(非 `react` 组件),这个实例就是小程序中可以通过 `this` 访问的实例。
-
-而上图中提到的 `React` 基础组件 可以这么理解,每个小程序组件的实例(`Component`)都会对应一个 `React` 基础组件,这个 `React` 组件负责管理生命周期函数的调用,并且负责渲染,同时也负责事件的交互回调。
-
-每当 `setData` 被触发的时候其实是在 `Component` 中触发的,然后 `Component` 会调用 `react` 组件的 `render` 函数,进一步调用到上面提到的 `react render function`。
-
-`Component` 和 `React` 组件 之间是一个循环交互的过程,`Component` 跟 `React` 组件 是通过 `setData` 进行交互进而触发 `render`,而 `React` 组件 和 `Component` 之间是通过直接方法调用的形式来交互。这个双向交互的流程就组成了 `MorJS Web runtime` 的内核部分。
-
-从上图也可以看出,`acss` 、`axml` 两个文件其实跟 `Component` 并没有强关系,仅仅是一个渲染函数,根据给定的 `render-data` 而渲染出结果而已,如果把 `Componet(options)` 去掉,也就是把小程序中的 `js` 文件去掉,那么就是一个模板文件,而事实上 `MorJS` 中也是这么实现 `template` 功能的。
diff --git a/website/docs/web/blog/setdata.md b/website/docs/web/blog/setdata.md
deleted file mode 100644
index 1364443a..00000000
--- a/website/docs/web/blog/setdata.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# setData 实现原理
-
-`setData` 需要做哪些事情?
-
-1. 类似 `react` 的 `setState`,可以修改当前组件 `data` 中的数据。
-2. 数据的修改是同步的,渲染是异步的。
-3. 支持已 `path` 的形式来设置 `data` 中的数据。
-
-在说 `setData` 实现方案之前,有必要提一下 `MorJS` 并没有使用 `react` 中 `setState` 方法,而是自身实现了一套类似 `setState` 的实现,然后通过调用 `forceUpdate` 方法来强制 `react` 组件重新渲染。
-
-本来吧,`react` 的 `setState` 也能实现以上的功能,但是考虑到需要遵循小程序的框架设计原则,渲染和业务逻辑是分离的,可以简单的理解为是渲染和业务逻辑是两个不同的模块,处于不同的 `worker` 上。因此,`runtime` 在实现的过程中不能无脑直接使用 `react` 的所有方法。在实际的小程序中,渲染和业务逻辑是在不同的 `worker` 中,但是在 `MorJS` 中,无需照搬,只需要实现类似的功能即可。另外,在 `MorJS` 中,`Component` 方法传入的 `options` 内容和直接`react` 组件是不一样的,是两个不同的模块。甚至是渲染函数(`axml` 编译出来的 `render` )也是独立的。
-
-在上一篇中提到,`Component` 和 `react` 组件 其实是互相循环交互的,但是 `setData` 只会在 `Component` 中触发。
-
-![image](https://gw.alicdn.com/imgextra/i2/O1CN01O3F9xT1LBa8S1iS5i_!!6000000001261-2-tps-388-103.png)
-
-下面直接上代码。
-
-```js
-const reactComponent; // react组件
-function setData(obj, callback) {
- let hasUpdateData = false; // 是否有更新data中的数据
- Object.keys(obj).forEach(key => {
- // 这里做了简单的 相等 判断。 防止某些生命周期的死循环
- const newValue = get(obj, key);
- if (newValue !== undefined && !isEqual(newValue, get(this.data, key))) {
- hasUpdateData = true;
- set(this.data, key, newValue)
- }
- })
- if (hasUpdateData) { // false 的情况只有发生在,用户只是更新 props中的value
- reactComponent.forceUpdate(); // 触发 render
- }
- callback && setTimeout(callback); // 异步方式触发回调
- }
-```
-
-代码中用到了 `set` 和 `get` 方法,这两个方法都是 `lodash` 中的方法,之所以用这两个方法,是因为需要支持以路径的形式来设置 `data`,比如: `setData({ 'user.name':'name' })`。
-
-另外,上面代码也做了简单的相等判断,这个功能可以简单理解为 `react` 中 `PureComponent` 提供的功能,可以防止在某些生命周期函数中调用 `setData` 从而引发死循环的问题。
-
-当调用 `react` 组件的 `forceUpdate` 方法,就会触发 `react` 的 `render` 调用,这时候再调用上一篇内核篇中介绍的由编译器生成的 `render` 函数,就形成了一次完整的渲染流程。
diff --git a/website/docs/web/blog/slot.md b/website/docs/web/blog/slot.md
deleted file mode 100644
index 8294d0e9..00000000
--- a/website/docs/web/blog/slot.md
+++ /dev/null
@@ -1,215 +0,0 @@
-# Slot 实现原理
-
-## slot
-
-先上代码:(组件定义)
-
-```html
-
-
-
-
-
-
-
-```
-
-编译后的代码:
-
-```js
-function defaultRender($data) {
- const { $children } = $data
- return (
-
- <$rm.Slot slots={$children} />
-
- <$rm.Slot slots={$children} name="footer" />
-
- )
-}
-```
-
-> slot 会被编译成由 runtime 提供的 slot react 组件。并且将当前组件的 children 传过去。
-
-使用组件:
-
-```html
-
- defualt
- footer
-
-```
-
-编译后代码:
-
-```js
-function defaultRender($data) {
- return (
-
- defualt
-
- footer
-
- )
-}
-```
-
-上面编译后的代码可以看出,对于适用方来说,编译器并没有做过多的处理。仅仅是将会 `slot` 属性改成 `_slot`,之所以这样,是因为 `html` 元素本来就有 `slot` 属性,为了确保不冲突,因此重名了属性名。
-
-`slot` 不管是组件定义还是适用方,在编译器中并没有太多的转换。实际上,`MorJS` 中 `slot` 的实现就是通过 `react` 组件实现的。`runtime` 中的 slot 组件代码如下:
-
-```js
-export class Slot extends React.PureComponent {
- render() {
- const { name, slots } = this.props
- if (!slots) {
- return this.props.children || false
- }
- const findSlots = []
- // NOTE:之所以递归降维到一维数组,是因为有可能slots本身就是一个数组。
- flattendeep([slots]).forEach((s) => {
- try {
- if (s.props._slot === name) {
- //具名插槽
- findSlots.push(s)
- }
- } catch (e) {
- // 之所以会出现crash的情况,这里为了简化实现方案。比如string、number这些值类型数据,是没有props属性的。
- if (!name)
- // 只有在默认插槽下面才会显示
- findSlots.push(s)
- }
- })
- if (findSlots.length === 0) return this.props.children || false // 直接将slot组件包含的子组件渲染出来
- if (findSlots.length === 1) return findSlots[0]
- return findSlots
- }
-}
-```
-
-直接读取子组件的 `_slot` 属性,跟当前 `slot` 组件的 `name` 来匹配。
-
-这里分两种情况:
-
-1. 如果当前 `slot` 是匿名 slot,那么如果 `_slot` 没有设置属性,也就是两者都是 `undefined` 那么匹配成功。
-2. 如果当前 `slot` 是具名 `slot` ,那么只有 `_slot` 属性 `value` 跟 `name` 完全一致的情况下才会被匹配。
-
-将匹配到的组件直接由 `slot` 渲染出来。
-
-另外,也可以分析出,如果 `slot` 组件没有匹配到任何的子组件,那么直接将 `slot` 组件包含的子组件渲染出来。
-
-## slot-scope
-
-其实 `slot-scope` 功能才是最复杂的方案。这个功能感觉有点违反了数据单向传输的原则,子元素可以直接访问父组件的数据,打破了 `react` 中由 `setState` 维持的单向数据流的壁垒。如果单靠 `runtime` 的话是无法实现的。
-
-老规矩,直接上示例代码:
-
-组件定义代码:
-
-```html
-
-
- default value
-
-```
-
-编译后的代码:
-
-```js
-function defaultRender($data) {
- const { x, $children } = $data
- return (
-
- <$rm.Slot x={x} slots={$children} name="footer" $scopeKeys={['x']}>
- default value
- $rm.Slot>
-
- )
-}
-```
-
-这里相对于上面的普通 `slot` 实现,仅仅多了一个 `$scopeKeys` 属性,这个属性的作用仅仅是收集当前 `slot` 组件中用户定义的需要向外暴露的 `key`。
-
-使用组件:
-
-```html
-
- component data: {{props.x}}
-
-```
-
-编译后的代码:
-
-```js
-function defaultRender($data) {
- const { props } = $data
- return (
-
- {function footer(props) {
- return {'component data: ' + $rm.getString(props.x)}
- }}
-
- )
-}
-```
-
-这里可以看出:
-
-1. `slot-scope` 直接被编译成一个 `function`。
-2. 这个 `function` 的入参就是 `slot-scope` 属性中定义的参数名称。
-3. 这个 `function` 的名称就是 `slot` 属性中设置的名称。这里就是 `“footer”`。
-4. 这个 `function` 其实也是一个简单的渲染函数。
-
-这里有意思的是,你可以发现,参数名 `props` 也被变量提取了。你会发现,有两个地方定义了 `props` 变量,一个是渲染函数的最开始,另外一个是 `slot-scope` 编译后的`function` 的入参。由于变量优先级的存在,`function` 的入参的变量名大于渲染函数最开始的变量名,因此不会出现变量污染的情况。
-
-除了编译后的代码有不同之外,`runtime` 中的 `slot` 组件也需要更新,需要识别 `function` ,修改的 `slot` 组件代码如下:
-
-```jsx | pure
-export class Slot extends React.PureComponent {
- render() {
- const { name, slots } = this.props
- if (!slots) {
- return this.props.children || false
- }
- const findSlots = []
- // NOTE:之所以递归降维到一维数组,是因为有可能slots本身就是一个数组。
- flattendeep([slots]).forEach((s) => {
- if (typeof s === 'function') {
- // slot是function,那么目前只有一种可能,那就是slot-scope
- if (s.name === name || (!name && !s.name)) {
- // 具名插槽或者是默认插槽
- // 合成数据对象。
- const $scopeKeys = this.props.$scopeKeys
- const args = {}
- if ($scopeKeys && $scopeKeys.length > 0) {
- $scopeKeys.forEach((key) => (args[key] = this.props[key]))
- }
- // slot-scope
- // 直接调用函数,并且将数据传入。
- findSlots.push(s(args))
- }
- } else {
- try {
- if (s.props._slot === name) {
- //具名插槽
- findSlots.push(s)
- }
- } catch (e) {
- // 之所以会出现crash的情况,这里为了简化实现方案。比如string、number这些值类型数据,是没有props属性的。
- if (!name)
- // 只有在默认插槽下面才会显示
- findSlots.push(s)
- }
- }
- })
- if (findSlots.length === 0) return this.props.children || false
- if (findSlots.length === 1) return findSlots[0]
- return findSlots
- }
-}
-```
-
-1. 判断传入的子组件是否是 `function`
-2. 判断是否匹配 `slot` 中的 `name`
-3. 通过 `$scopeKeys` 动态创建一个 `data`,用来传给 `function`
-4. 调用 `function` 获取 `react` 组件
diff --git a/website/docs/web/blog/template.md b/website/docs/web/blog/template.md
deleted file mode 100644
index f4ffafcf..00000000
--- a/website/docs/web/blog/template.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# 模版编译原理
-
-在 `runtime` 中已经介绍过,`axml` 文件最终会被编译成 `render` 函数,如果除开 `js` 文件,那么 `axml` 文件其实可以直接当做模板文件使用。但是在小程序中, `template` 有自己的规范,模板内容的定义必须要被包含在 `template` 标签内,并且设置 `name` 属性,作为模板名称。
-
-在 `runtime` 中有介绍,组件被编译成渲染函数,那么对于模板,一个模板编译成一个渲染函数不就可以了吗,只不过接受的数据域不同而已。
-
-在介绍实现方案之前,先看下模板的功能。
-
-1. 在 `template` 标签中定义模板内容,并且使用 `name` 属性来确定模板名称。
-2. 通过 `template` 的 `is` 属性来使用模板,并且可以通过 `data` 属性传入数据。
-3. 模板文件可以被引入到其他的 `axml` 文件中。事实上,任何 `axml` 文件中定义的 模板都可以被其他 `axml` 文件引入。
-4. 模板支持嵌套,也就是说在定义的模板内容中,也可以使用其他的模板。
-
-通过以上对模板功能的大概描述,可以基本确定,每个模板对应一个渲染函数,使用模板,其实就是调用渲染函数,并且使用 `data` 作为模板的渲染数据域。
-
-而在 `MorJS` 的实现方案中,由 `runtime` 提供了一个专门的模板管理器,每个 `axml` 文件都会有一个模板管理器,当前 `axml` 文件中定义、引入的模板都会被注册到模板管理器中。下面通过实际的代码作为例子。
-
-axml 代码:
-
-```html
-
-
- {{ text }}
-
-
-
-
-
-
-
-```
-
-编译后的代码如下:
-
-```js
-import React from 'react'
-import $rm from '@morjs/runtime-web/lib/runtime'
-
-export const $templates = {}
-
-//创建模板管理器
-const $tm = $rm.createTemplateManager()
-
-//创建模板:templatet1
-function templatet1($data) {
- const { text } = $data
- return (
- {$rm.getString(text)}
- )
-}
-
-$templates['templatet1'] = templatet1
-//将当前文件定义的模板加入模板管理器
-$tm.addAll($templates)
-//引入其他文件的模板:./template.axml
-$tm.addAll(require('./template.axml').$templates)
-
-//添加渲染函数
-export function defaultRender($data) {
- return $tm.renderTemplate(
- 't1',
- {
- text: 'hello world'
- },
- $data.$reactComp
- )
-}
-```
-
-从上面的代码中可以看到:
-
-1. 定义了一个变量 `$templates` 用来缓存模板,并且这个变量会被导出。
-2. 通过 `runtime` 提供的 `createTemplateManager` 方法创建了一个模板管理器。
-3. 每个模板都会被编译成一个渲染函数,并且渲染函数的名字以一定的规则命名。
-4. 模板渲染函数会被缓存到 变量 `$templates` 中。
-5. 所有缓存到 `$templates` 中的模板渲染函数,同时也会被添加到模板管理器中。
-6. 将其他文件中定义的模板添加到当前 `axml` 文件的模板管理器中。--注意引用的是 `$templates` 变量。
-7. 在使用模板的地方,使用 `runtime` 提供的 `renderTemplate` 函数调用模板渲染函数。
-
-对于第七点,之所以没有直接调用模板渲染函数,而是通过 `runtime` 的 `renderTemplate` 函数来调用,是因为,模板并不一定定义在当前文件中,而是可能会被定义在不同的文件中,以引入的方式引入到当前文件。就像第六点提到的,其他文件定义的模板只会添加到当前文件的模板管理器中,但不会被导出。也就是说明了,当前文件引用的其他文件的模板,不会被导出,会被隔离。
-
-> `defaultRender` 是当前组件、页面的渲染函数。
-
-在说说 `runtime` 提供的模板相关的方法到底做了什么,也就是模板管理器做了什么。
-
-```js
-// 对模板名称进行编码
-// NOTE: 这里的代码必须跟 runtime 中的代码是一致的
-function hashTemplateName(name) {
- return name
- .split('')
- .map((c) => (HashChars.indexOf(c) >= 0 ? c : '$'))
- .join('')
-}
-
-export default class TemplateManager {
- constructor() {
- this.templates = {}
- }
- addAll(obj) {
- Object.keys(obj).forEach((key) => {
- if (key.startsWith('template')) {
- this.templates[key] = obj[key]
- }
- })
- }
-
- renderTemplate(name, data, superComponent) {
- if (!name) {
- throw new Error('name 不能为空')
- }
- if (typeof name !== 'string') {
- throw new Error('name 必须是字符串')
- }
- if (data && typeof data !== 'object') {
- throw new Error('data 必须是对象. template name=' + name)
- }
- const t = this.templates[`template${hashTemplateName(name)}`]
- if (t) {
- const d = data || {}
- // 合并父级组件。以便后续递归传递数据
- if (!d['$reactComp'] && superComponent) {
- d['$reactComp'] = superComponent
- d['$root'] = superComponent.componentConfig // Component
- d['$compId'] = superComponent.$id
- }
- return t.call(d['$root'], d)
- } else {
- console.warn('模板不存在:' + name)
- }
- return null
- }
-}
-```
-
-从上面的代码分析,最核心的还是 `renderTemplate` 方法,这个方法其实最重要的工作就是动态创建渲染函数需要的 `data`,也就是上面代码中的变量 `d` 。
-
-在小程序中,模板是支持嵌套的,但是对于一个组件、页面来说,不管当前组件、页面用到了多少个模板,容器组件只有一个,就是当前的组件、页面。因此上面代码中的 `superComponent` 参数,其实就是当前组件、页面的引用,而且也会作为参数传递给模板,以便模板在嵌套的情况下传递给其他的模板。
-
-综上:严格来说,模板和组件、页面的唯一不同点就是数据域的不一样,其他的其实都差不多。
diff --git a/website/docs/web/introduction/basic.md b/website/docs/web/introduction/basic.md
deleted file mode 100644
index fde20572..00000000
--- a/website/docs/web/introduction/basic.md
+++ /dev/null
@@ -1,178 +0,0 @@
-# 基础配置
-
-## 配置介绍
-
-本篇幅的文章会对 `Web` 端的每一项配置做详细的介绍,如果你想查看 `MorJS` 全部配置,可以到点击 [MorJS 配置](/guides/basic/config) 。
-
-通过 [快速上手](/web/basic/quickstart) 你已经完成了 `Web` 端的编译配置,此时打开项目的 `mor.config.ts`,你会看到如下配置 👁:
-
-```ts
-import { defineConfig } from '@morjs/cli'
-
-export default defineConfig([
- {
- name: 'ali',
- sourceType: 'alipay',
- target: 'alipay',
- compileType: 'miniprogram',
- compileMode: 'bundle'
- },
- {
- name: 'wechat',
- sourceType: 'alipay',
- target: 'wechat',
- compileType: 'miniprogram',
- compileMode: 'bundle'
- },
- {
- name: 'web',
- sourceType: 'alipay',
- target: 'web',
- compileType: 'miniprogram',
- compileMode: 'bundle',
-
- // web 端配置项,下方介绍的配置项都将在这里进行配置
- web: {}
- }
-])
-```
-
-好了,准备工作已经完成,接下来我们开始介绍配置 🚀
-
-### globalComponentsConfig
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :--------------------------------------------------------------------------------------------------: | :------------------------------------: |
-| 否 | object | [点击查看](https://github.com/eleme/morjs/tree/master/packages/runtime-web/src/components/config.ts) | 用于配置 小程序组件=>web 组件 的映射表 |
-
-背景补充说明:将小程序的代码转换成 `Web` 端的一个前提是,我们需要在 `Web` 端 1:1 实现小程序支持的组件。在编译过程中维护了一张映射表,在编译的过程中将小程序的组件进行替换,比如 `view` 组件,我们将其替换成了 `tiga-view`,那么 `tiga-view` 从哪里来呢?实际上,我们在 1:1 实现小程序的时候使用了 `Web Components`(选用 `Google` 开源的 [lit](https://lit.dev/)),所以我们只需要在项目运行时,在顶部将 `tiga-view` 这个自定义组件注册就可以正常使用了。
-
-如果我们遇到了以下场景我们可能会考虑使用 `globalComponentsConfig` 配置:
-
-1. 在 `Web`端 需要通过条件编译渲染一些小程序不支持的组件,这个组件直接使用 `web-components` 实现;
-2. `MorJS` 提供的组件实现和支付宝小程序是一致的,无法定制,需要使用 `web-components` 实现一些定制组件。
-
-> 需要注意的是,如果要配置此项,你需要将自定义的 web-components 提前注册,一般要么自定义 entry,要么在 htmlOptions 配置中自定义 templateContent,然后在顶部引入。以上两个配置接下来我们都会介绍
-
-配置示例 🌰:
-
-```ts
-...
-web: {
- globalComponentsConfig: {
- 'view': 'custom-view', // 将 view 映射到自定义的 custom-view 组件
- }
-}
-...
-```
-
-### styleScope
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :----: | :------------------: |
-| 否 | boolean | false | 配置是否开启样式隔离 |
-
-为了避免各页面或者各个组件之间的样式相互影响,可以打开此开关。打开此开关后,MorJS 在编译时会自动给 `class` 打上 `hash` 值。如果项目中存在 `page` 中样式共享给 `component` 的场景,请不要打开此开关。除了此开关之外,我们还提供了其它方式启用样式隔离:
-
-1. 在 `app.json` 中增加 `styleScope: true`,此功能也是全局开启样式隔离。
-2. 在 `page or components` 的 `.json` 文件中配置 `styleScope: true`,此配置可以开启页面级/组件级样式隔离。
-
-### rpxRootValue
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :----: | :---------------------------: |
-| 否 | number | 32 | rpx 转换成 rem 单位时的基准值 |
-
-默认情况下,MorJS 在编译的时候会将 `rpx` 样式单位转换成 `rem`,而 `rem` 的计算公式为 `toFixed(pixel/rpxRootValue, 5)`。
-
-> 转换成 rem 单位后,业务可通过 `responsiveRootFontSize` 配置达到响应式的目的。1rem = html font-size,现在各主流浏览器默认 html font-size 的大小为 16px。
-
-### responsiveRootFontSize
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :----: | :------------------------------------------------------------------------------------------------------: |
-| 否 | number | - | 设置 html 的 font-size 值大小,且该值设定之后会监听窗口 resize 事件,以 375 屏幕为基准动态调整 font-size |
-
-该配置开启后,`html font-size` 的计算公式为 `((rootFontSize * window.document.documentElement.clientWidth) / 375 + 'px')`。一般我们建议将该值手动设定为 `16`。(`rpxRootValue` 默认值为 32, 这意味着 `32rpx` 将为转换成 `1rem`,`responsiveRootFontSize` 设定为 `16` 之后, 会使 `32rpx = 1rem = 16px` 等式成立,和小程序逻辑是一致的)
-
-### needRpx
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :----: | :----------------------------------------------------: |
-| 否 | boolean | true | 设置为 true 会自动开启 rpx 转 rem,设置为 false 则关闭 |
-
-有些业务场景可能需要自定义响应式方案,比如使用 [postcss-rpx2vw](https://www.npmjs.com/package/postcss-px2vw), 所以提供此配置关闭 MorJS 的默认转换功能。
-
-> 可使用 mor 暴露出来的 [webpackChain](/guides/basic/config#webpackchain) 功能对样式处理做自定义处理。
-
-### usePx
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :----: | :--------------------------------------------------------------------------------------------------: |
-| 否 | object | - | 接受一个对象,对象内有一个参数 ratio,用于指定 rpx 转 px 的比例,实际计算的 px 值 = (rpx 值 / ratio) |
-
-使用此配置的场景一般是使用 MorJS 提供的功能将 `rpx` 单位转换成 `px` 单位,然后使用 `postcss` 的插件做自定义的功能(`postcss` 生态中的大部分插件都是针对 `px` 单位做处理的)。
-
-### showHeader
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------: |
-| 否 | boolean,array | true | 控制是否展示默认的导航栏(数组类型可以指定 `app.json` 中的 `pages` 路径,用于设置需要开启的页面) |
-
-在内嵌在容器的场景下,为了避免双导航栏情况,可以使用该配置将 MorJS 提供的导航栏关闭。
-
-有以下两种场景可能需要动态隐藏导航栏的功能:
-
-1. `MorJS` 转 `Web` 页面通过 `webview` 组件内嵌另一个 通过 `MorJS` 转出来的 `Web` 页面(这时候会有两个 MorJS 提供的头部)
-2. `MorJS` 转 `Web` 页面内嵌在小程序的 `webview` 组件内
-
-基于以上两种场景,我们提供了动态隐藏头部的能力,在 `url` 上增加 `hide-header=1` 即可将当前页面的头部隐藏掉。
-
-### showBack
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------: |
-| 否 | boolean,array | false | 控制是否在导航栏上展示返回箭头(数组类型下可以指定 `app.json` 中的 `pages` 路径,用于设置需要开启的页面) |
-
-点击返回箭头会调用 `my.navigateBack()` 尝试返回,如果你的页面内嵌在 `app` 内,使用该方法无法返回,可以选择使用 `window.addEventListener('tiga-back', () => { // 返回逻辑 } )`。
-
-### appConfig
-
-| 是否必填 | 参数类型 | 默认值 | 参数含义 |
-| :------: | :------: | :----: | :--------------------: |
-| 否 | object | null | 用于设置一些全局的配置 |
-
-目前支持的配置如下:
-
-| 参数名 | 参数类型 | 默认值 | 参数含义 |
-| :----------------------: | :------: | :------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
-| apiNoConflict | boolean | true | 设置为 `true` 说明不覆盖已存在 `my.*` 上存在的方法,设置为 `false` 代表要覆盖已有的方法。
在支付宝小程序 `webview` 内嵌网页的时候,会在 `my` 对象上设置 [方法](https://opendocs.alipay.com/mini/component/web-view#%E5%8F%AF%E7%94%A8%20API),这个时候容器内置的方法名称会和 MorJS 提供的有冲突,设置为 `true` 代表有冲突的时候,优先使用容器内置的方法,设置为 `false` 代表使用 `MorJS`提供的方法覆盖掉容器提供的默认方法 |
-| components.map | object | null | 给地图组件传递配置(`key,version,sdk` 等) |
-| components.video.cdnUrl | string | https://cdn.plyr.io/3.7.3/plyr.js | `video` 组件是基于 [Plyr](https://plyr.io/) 实现的,此配置用于自定义该库的 `cdn` 地址 |
-| components.swiper.cdnUrl | string | https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.2/js/swiper.min.js | `swiper` 组件是基于 [Swiper](https://swiperjs.com/) 实现的, 此配置用于自定义该库的 `cdn` 地址 |
-
-参考用例如下 👇🏻:
-
-```
-web: {
- appConfig: {
- apiNoConflict: false,
- components: {
- // sdk 和 version 的指定参考 https://lbs.amap.com/api/jsapi-v2/guide/abc/load
- map: {
- sdk: '', // 地图 sdk 地址
- version: '', // 地图 sdk 版本
- key: '', // 地图 key,申请请参考 https://lbs.amap.com/api/webservice/gettingstarted
- },
- video: {
- cdnUrl: '', // 自定义的 plyr sdk cdn 地址
- },
-
- }
- }
-}
-```
-
-### 其它
-
-其它工程纬度的配置可以直接参考 [此处](/guides/basic/config#web)
diff --git a/website/docs/web/introduction/route.md b/website/docs/web/introduction/route.md
deleted file mode 100644
index 21c02e52..00000000
--- a/website/docs/web/introduction/route.md
+++ /dev/null
@@ -1,96 +0,0 @@
-# 路由设置
-
-`MorJS` 将小程序 `page/component` 转化成 `react component`,需要一套 `SPA` 路由解决方案,管理页面切换,页面的切换其实就是不同组件的切换。
-
-## 配置路由
-
-> 在按照`MorJS`快速上手 接入项目后,可以在 `app.json` 中配置 `router` 字段。
-
-例如:
-
-```json
-"router": {
- "mode": "browser",
- "baseName": "/mor",
- "customRoutes": {
- "/pages/index/index": "/index"
- }
- }
-```
-
-## 参数介绍
-
-### mode
-
-- 可选值:`hash | browser`
-- 默认值: `browser`
-- 介绍: 路由模式切换
-
-示例:
-
-```json
-// app.json
-"router": {
- "mode": "browser",
- ....
- }
-```
-
-地址栏分别展示为:
-
-- `https://{{domain}}/#/pages/index/index`(`hash` 模式)
-- `https://{{domain}}/pages/index/index`(`browser` 模式)
-
-### baseName
-
-- 默认值:''
-- 介绍:路由基础路径
-
-示例:
-
-```json
-// app.json
-"router": {
- "baseName": "/mor",
- ....
- }
-```
-
-地址栏分别展示为:
-
-- `https://{{domain}}/#/mor/pages/index/index`(`hash` 模式)
-- `https://{{domain}}/mor/pages/index/index`(`browser` 模式)
-
-### customRoutes
-
-- 默认值:`{}`
-- 介绍:自定义路由
-
-示例:
-
-```javascript
-// app.json
-"router": {
- "customRoutes": {
- "/pages/index/index": "/index"
- }
- }
-```
-
-根据配置,调用 `my.navigateTo({ url: '/pages/index.index'})` 后,
-
-地址栏分别展示为:
-
-- `https://{{domain}}/#/index`(`hash` 模式)
-- `https://{{domain}}/index`(`browser` 模式)
-
-## 路由 API
-
-目前支付宝小程序页面路由相关方法均已实现,包括:
-
-- `navigateTo`
-- `redirectTo`
-- `relaunch`
-- `switchTab`
-- `navigateBack`
-- `getCurrentPages`
diff --git a/website/docs/web/support/custom-my.md b/website/docs/web/support/custom-my.md
deleted file mode 100644
index 92909288..00000000
--- a/website/docs/web/support/custom-my.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# 自定义 Api 全局变量名称
-
-## 背景
-
-默认情况下,`MorJS` 会将提供的 `api` 挂载到 `window.my` 上,这样做的话,业务 `js` 文件里写的 `my.*` 就可以直接使用。
-
-在某些场景下,业务希望能够自定义挂载 `api` 的名称,比如有些业务中使用的工具库,直接通过 `typeof my === 'object'` 判断是否在小程序,如果是就直接走小程序相关的逻辑,导致业务出现异常。
-
-## 使用方式
-
-在 `mor.config` 中对 `web` 配置项进行修改,如 👇🏻:
-
-```js
-// ... 省略
- {
- name: 'web',
- sourceType: 'alipay',
- target: 'web',
- compileType: 'miniprogram',
- compileMode: 'bundle',
- web: {},
- globalObject: 'customMy', // 通过这个配置项自定义 api 的挂载名称
- }
-```
-
-按照上述配置完成之后,在页面控制台打印 `window.customMy` 就可以看到挂载的 `api` 详情了。
-
-## 原理
-
-在编译时读取业务配置的 `globalObject` 的值,如果接收到页面自定义的值,在编译层做两件事(以 `globalObject` 设置为 `customMy` 为例):
-
-1. 将 `.js` 文件中的 `my.*` 调用更改成 `customMy.*`
-2. 给 `window.$MOR_GLOBAL_OBJECT` 赋值为 `customMy`,以供 `runtime` 模块消费。
-
-运行时只需要做一件事:读取 `window.$MOR_GLOBAL_OBJECT` 的值,拿到值后将所有 `api` 挂载到 `window.[window.$MOR_GLOBAL_OBJECT]`。(如果 `window.$MOR_GLOBAL_OBJECT` 没有值,默认会挂在 `my` 上 )
diff --git a/website/docs/web/support/tabbar-support.md b/website/docs/web/support/tabbar-support.md
deleted file mode 100644
index 168f6828..00000000
--- a/website/docs/web/support/tabbar-support.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Tabbar IOS 小黑条适配开关
-
-## 简介
-
-`MorJS` 默认提供的 `tabbar` 已经存在了 `iphone` 小黑条的兼容,不需要做特殊的关注。通过浏览器控制台调试可以看到,`MorJS` 给 `tiga-tabbar-item` 设置了如下样式:
-
-```css
-:host {
- padding-bottom: calc(8px + constant(safe-area-inset-bottom));
- padding-bottom: calc(8px + env(safe-area-inset-bottom));
-}
-```
-
-## 背景
-
-某些容器内嵌时默认提供了小黑条适配逻辑,例如钉钉。这个时候会导致整个页面会被向上推 `2 * safe-area-inset-bottom` 的距离,所以业务侧希望存在一个开关控制 `MorJS` 提供的小黑条适配功能。
-
-## 如何使用
-
-在 `app.json` 配置 `tabbar` 的地方增加 `disableSafeAreaPaddingUARegex` 字段,支持 `Array 和 String` 类型传值。这里传入需要屏蔽的容器的 `UserAgent` 关键字即可。
-
-比如钉钉浏览器内,我们指定 `DingTalk` 即可,因为其完整 `UA` 如下,通过该值就可以判定为钉钉内嵌场景:
-
-```
-Mozilla/5.0 (Linux; U; Android 12; zh-CN; M2102J2SC Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 UWS/3.22.1.210 Mobile Safari/537.36 AliApp(DingTalk/6.5.20) com.alibaba.android.rimet/24646881 Channel/700159 language/zh-CN abi/64 UT4Aplus/0.2.25 colorScheme/light
-```
-
-完整的配置参考如下 👇🏻:
-
-```
- "tabBar": {
- "textColor": "#dddddd",
- "selectedColor": "#49a9ee",
- "backgroundColor": "#ffffff",
- // "disableSafeAreaPaddingUARegex": ["DingTalk", "Alipay"], // Array 传值
- "disableSafeAreaPaddingUARegex": "DingTalk, // String 传值
- "items": [
- {
- "pagePath": "pages/index/index",
- "name": "首页"
- },
- {
- "pagePath": "pages/map/index",
- "name": "日志"
- }
- ]
- },
-```
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
deleted file mode 100644
index 38f11c9b..00000000
--- a/website/docusaurus.config.js
+++ /dev/null
@@ -1,84 +0,0 @@
-const navbar = require('./config/navbar')
-const footer = require('./config/footer')
-
-/** @type {import('@docusaurus/types').Config} */
-const config = {
- title: 'MorJS',
- tagline: 'MorJS 小程序多端研发框架',
- favicon: 'img/mor-icon.svg',
- url: 'https://mor.eleme.io',
- baseUrl: '/',
- organizationName: 'eleme',
- projectName: 'morjs',
- onBrokenLinks: 'warn',
- onBrokenMarkdownLinks: 'throw',
- i18n: {
- defaultLocale: 'zh-Hans',
- locales: ['zh-Hans']
- },
- themeConfig: {
- navbar,
- footer,
- // 告示条配置
- // announcementBar: {
- // id: 'announcement-bar-20230202',
- // content: 'MorJS 开箱即用的小程序多端研发框架 更多',
- // isCloseable: true,
- // backgroundColor: '#FFFADA',
- // textColor: '#091E42',
- // },
- // algolia 搜索配置
- algolia: {
- appId: '5QPTLJ7YVR',
- apiKey: 'aa95c48f32ccd4dd1788b1d279a98397',
- indexName: 'morjs'
- }
- },
- presets: [
- [
- 'classic',
- /** @type {import('@docusaurus/preset-classic').Options} */
- ({
- docs: {
- routeBasePath: '/',
- sidebarPath: require.resolve('./config/sidebars.js'),
- // 分版配置参考: https://docusaurus.io/docs/versioning#configuring-versioning-behavior
- includeCurrentVersion: true, // 发布的版本包含当前版本
- lastVersion: 'current', // 最新版本
- onlyIncludeVersions: ['current'], // 哪些版本应该被部署
- versions: {
- // 版本元数据的字典
- current: {
- label: '1.0.0',
- path: '/', // 此版本的路径前缀
- badge: true // 文档开头显示一个版本名标记
- }
- }
- },
- // blog: {},
- theme: {
- customCss: require.resolve('./src/css/custom.css')
- }
- // 将事件数据发送到 Google Analytics 让谷歌搜索到该网站
- // gtag: {
- // trackingID: 'G-',
- // },
- })
- ]
- ],
- plugins: []
-}
-
-// algolia 是在线搜索服务,内网环境下不可用,替换为搜索插件
-// delete config.themeConfig.algolia;
-// config.plugins.push([
-// require.resolve('@easyops-cn/docusaurus-search-local'),
-// {
-// hashed: true,
-// language: ['zh', 'en'],
-// highlightSearchTermsOnTargetPage: true,
-// explicitSearchResultPath: true,
-// },
-// ]);
-
-module.exports = config
diff --git a/website/package.json b/website/package.json
deleted file mode 100644
index 794b2cda..00000000
--- a/website/package.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "name": "morjs-site",
- "version": "0.0.0",
- "private": true,
- "scripts": {
- "docusaurus": "docusaurus",
- "start": "docusaurus start",
- "build": "docusaurus build",
- "swizzle": "docusaurus swizzle",
- "deploy": "docusaurus deploy",
- "clear": "docusaurus clear",
- "serve": "docusaurus serve",
- "write-translations": "docusaurus write-translations",
- "write-heading-ids": "docusaurus write-heading-ids",
- "typecheck": "tsc"
- },
- "dependencies": {
- "@docusaurus/core": "2.3.1",
- "@docusaurus/preset-classic": "2.3.1",
- "@easyops-cn/docusaurus-search-local": "^0.33.6",
- "@mdx-js/react": "^1.6.22",
- "@popperjs/core": "2",
- "clsx": "^1.2.1",
- "prism-react-renderer": "^1.3.5",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
- "react-popper": "2"
- },
- "devDependencies": {
- "@docusaurus/module-type-aliases": "2.3.0",
- "@tsconfig/docusaurus": "^1.0.5",
- "typescript": "^4.7.4"
- },
- "browserslist": {
- "production": [
- ">0.5%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- },
- "engines": {
- "node": ">=16.14"
- }
-}
diff --git a/website/src/components/Feature/feature.module.css b/website/src/components/Feature/feature.module.css
deleted file mode 100644
index 2e349147..00000000
--- a/website/src/components/Feature/feature.module.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.feature {
- display: grid;
- overflow: hidden;
- /* grid-template-areas: 'b a'; */
- grid-template-columns: 1fr 1fr 1fr;
- max-width: 1200px;
- margin: 3rem auto 0;
-}
-
-.feature-item {
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: center;
- margin-bottom: 3rem;
-}
-
-.feature-item .item-icon {
- height: 3rem;
- object-fit: cover;
- margin-bottom: 1rem;
-}
-.feature-item .item-title {
- font-size: 1.3rem;
- text-align: center;
-}
-.feature-item .item-desc {
- font-size: 0.8rem;
- text-align: center;
- max-width: 15rem;
-}
-
-@media (max-width: 900px) {
- .feature {
- grid-template-columns: 1fr 1fr;
- }
-}
-
-@media (max-width: 550px) {
- .feature {
- grid-template-columns: 1fr;
- }
-}
diff --git a/website/src/components/Feature/index.tsx b/website/src/components/Feature/index.tsx
deleted file mode 100644
index 10c02272..00000000
--- a/website/src/components/Feature/index.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import React from 'react'
-import styles from './feature.module.css'
-
-type FeatureItem = {
- title: string
- icon: string
- description: string
-}
-
-const FeatureList: FeatureItem[] = [
- {
- title: '可扩展',
- icon: 'https://img.alicdn.com/imgextra/i2/O1CN01BbQlkV1hTNBKxf8DO_!!6000000004278-0-tps-256-256.jpg',
- description:
- 'MorJS 实现了完备的生命周期,并使其插件化,MorJS 内部功能也全由插件完成。此外还支持插件和插件集,以满足功能和垂直域的分层需求。'
- },
- {
- title: '开箱即用',
- icon: 'https://img.alicdn.com/imgextra/i1/O1CN015mdGXl1S7e9yUmvbJ_!!6000000002200-0-tps-260-256.jpg',
- description:
- 'MorJS 内置了脚手架、构建、分析、多端编译等,仅需一个依赖即可上手开发。'
- },
- {
- title: '企业级',
- icon: 'https://img.alicdn.com/imgextra/i3/O1CN01bVt5A71wU1zRDRnbK_!!6000000006310-0-tps-260-256.jpg',
- description: '经饿了么内部 100+ 公司项目的验证,值得信赖。'
- },
- {
- title: '大量自研',
- icon: 'https://img.alicdn.com/imgextra/i2/O1CN019mjFBS1yTgvfC80sW_!!6000000006580-0-tps-256-256.jpg',
- description:
- '多端组件打包、文档工具、请求库、数据流、复杂小程序集成、小程序形态转换等,满足日常项目的周边需求。'
- },
- {
- title: '多端支持',
- icon: 'https://img.alicdn.com/imgextra/i2/O1CN01PWl26a24Ib1pE3Pzn_!!6000000007368-0-tps-260-256.jpg',
- description: '支持一键转换为各类小程序平台及 Web 应用, 节省双倍人力。'
- },
- {
- title: '面向未来',
- icon: 'https://img.alicdn.com/imgextra/i4/O1CN012gfk5g1RdQ1CddDfN_!!6000000002134-0-tps-260-256.jpg',
- description:
- '在满足需求的同时,我们也不会停止对新技术的探索。比如 多端扩充、高性能渲染方案 等。'
- }
-]
-
-function Feature(): JSX.Element {
- return (
-
- {FeatureList.map((item, index) => (
-
-
-
{item.title}
-
{item.description}
-
- ))}
-
- )
-}
-
-export default Feature
diff --git a/website/src/components/Splash/index.tsx b/website/src/components/Splash/index.tsx
deleted file mode 100644
index d4ba7a86..00000000
--- a/website/src/components/Splash/index.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import React from 'react'
-// eslint-disable-next-line node/no-missing-import
-import Link from '@docusaurus/Link'
-import styles from './splash.module.css'
-
-function Splash(): JSX.Element {
- const splash =
- 'https://img.alicdn.com/imgextra/i4/O1CN01S3jBZO23ZFoVGXZHp_!!6000000007269-2-tps-1300-1052.png'
-
- return (
-
-
-
-
MorJS 小程序多端研发框架
-
- 以多端编译为基础,配以面向全生命周期的插件体系,覆盖从源码到产物的每个阶段,支持各类功能扩展和业务需求。
-
-
- 快速上手
-
-
-
-
-
-
-
- )
-}
-
-export default Splash
diff --git a/website/src/components/Splash/splash.module.css b/website/src/components/Splash/splash.module.css
deleted file mode 100644
index 76d3f2c3..00000000
--- a/website/src/components/Splash/splash.module.css
+++ /dev/null
@@ -1,92 +0,0 @@
-.splashBg {
- background: #3983f6
- url('https://img.alicdn.com/imgextra/i3/O1CN01wtwVyt1sSQ841CYfZ_!!6000000005765-2-tps-5120-1120.png')
- no-repeat center;
- background-size: cover;
-}
-
-.splash {
- display: grid;
- overflow: hidden;
- align-items: center;
- min-height: 35rem;
- grid-template-areas: 'b a';
- grid-template-columns: 1fr 1fr;
- margin: 0 auto;
- max-width: 1200px;
- color: #fff;
-}
-
-.title-container {
- display: flex;
- flex: 1;
- flex-direction: column;
- margin: 0 auto;
- max-width: 31rem;
- padding: 0 2rem;
- box-sizing: content-box;
-}
-
-.splash-title {
- font-size: 2.5rem;
- font-weight: bold;
- margin-bottom: 1rem;
-}
-
-.splash-subtitle {
- font-size: 1rem;
- font-weight: bold;
- margin-bottom: 3rem;
-}
-
-.splash-btn {
- width: 8rem;
- height: 3rem;
- font-size: 1.2rem;
- font-weight: bold;
- color: #3983f6;
- background-color: #fff;
- border-radius: 4px;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.image-container {
- display: flex;
- flex: 1;
-}
-
-.splash-img {
- height: 30rem;
- object-fit: cover;
-}
-
-@media (max-width: 900px) {
- .splash {
- grid-template-areas: 'a' 'b';
- grid-template-columns: 1fr;
- }
-
- .title-container {
- margin-top: 7rem;
- justify-content: center;
- align-items: center;
- }
-
- .splash-title,
- .splash-subtitle {
- text-align: center;
- }
-
- .image-container {
- justify-content: center;
- align-items: center;
- }
-}
-
-@media (max-width: 550px) {
- .splash-img {
- height: 20rem;
- }
-}
diff --git a/website/src/css/custom.css b/website/src/css/custom.css
deleted file mode 100644
index 8868a7cb..00000000
--- a/website/src/css/custom.css
+++ /dev/null
@@ -1,69 +0,0 @@
-:root {
- --ifm-color-primary: #02b6fd;
- --ifm-code-font-size: 95%;
- --ifm-container-width-xl: 1600px;
- --site-color-favorite-background: #f6fdfd;
- --site-color-svg-icon-favorite: #e9669e;
- /* --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); */
- /* --ifm-color-title: #111; */
-}
-
-:root[data-theme='dark'] {
- /* --ifm-color-title: #fff; */
-}
-
-html[data-theme='dark'] {
- --site-color-favorite-background: #1d1e1e;
-}
-
-.navbar__title {
- font-size: 22px;
- margin-left: 4px;
-}
-
-.navbar__logo {
- height: 1.7rem;
-}
-
-.header-github-link:hover {
- opacity: 0.6;
-}
-
-.header-github-link::before {
- content: '';
- width: 24px;
- height: 24px;
- display: flex;
- background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
- no-repeat;
-}
-
-[data-theme='dark'] .header-github-link::before {
- background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
- no-repeat;
-}
-
-.navbar__search-input:focus {
- outline: none;
-}
-
-.screen-reader-only {
- border: 0;
- clip: rect(0 0 0 0);
- clip-path: polygon(0 0, 0 0, 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
- white-space: nowrap;
-}
-
-/* 修改滚动条样式 */
-.thin-scrollbar::-webkit-scrollbar {
- width: 2px;
-}
-.thin-scrollbar::-webkit-scrollbar-thumb {
- background-color: #ddd;
-}
diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css
deleted file mode 100644
index f331949d..00000000
--- a/website/src/pages/index.module.css
+++ /dev/null
@@ -1,18 +0,0 @@
-.heroBanner {
- padding: 4rem 0;
- text-align: center;
- position: relative;
- overflow: hidden;
-}
-
-@media screen and (max-width: 996px) {
- .heroBanner {
- padding: 2rem;
- }
-}
-
-.buttons {
- display: flex;
- align-items: center;
- justify-content: center;
-}
diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx
deleted file mode 100644
index c1f4d9a7..00000000
--- a/website/src/pages/index.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import React from 'react'
-// eslint-disable-next-line node/no-missing-import
-import Layout from '@theme/Layout'
-// eslint-disable-next-line node/no-missing-import
-import useDocusaurusContext from '@docusaurus/useDocusaurusContext'
-import Feature from '../components/Feature'
-import Splash from '../components/Splash'
-
-export default function Home(): JSX.Element {
- const { siteConfig } = useDocusaurusContext()
- return (
-
-
-
-
-
-
- )
-}
diff --git a/website/src/theme/Root.js b/website/src/theme/Root.js
deleted file mode 100644
index 2bbe15b5..00000000
--- a/website/src/theme/Root.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import clsx from 'clsx'
-import React, { useEffect, useState } from 'react'
-import { isIntranet } from '../utils/internal'
-import storage from '../utils/storage'
-import styles from './Root.module.css'
-
-const NO_REDIRECT_KEY = 'no-redirect-internal'
-const STORAGE_VALID_TIME = 7 * (24 * 60 * 60 * 1000)
-
-// Default implementation, that you can customize
-function Root({ children }) {
- const [noticeVisible, setNoticeVisible] = useState(false)
-
- useEffect(() => {
- if (
- // In case of redirect for internal site.
- !/alibaba-inc\.com/.test(window.location.href) &&
- // If ignored by user, then skip.
- storage.get(NO_REDIRECT_KEY) !== 'TRUE'
- ) {
- isIntranet().then(() => {
- setNoticeVisible(true)
- })
- }
- }, [])
-
- return (
- <>
- {children}
- {noticeVisible && (
-
-
-
- 检测到您是内网用户,建议前往内部官网{' '}
-
- https://mor.alibaba-inc.com
- {' '}
- 以获取更多信息。
-
-
-
{
- location.href = 'https://mor.alibaba-inc.com'
- }}
- >
- 去内部官网(推荐)
-
-
{
- setNoticeVisible(false)
- storage.set(
- NO_REDIRECT_KEY,
- 'TRUE',
- String(STORAGE_VALID_TIME)
- )
- }}
- >
- 七天内不再提示
-
-
-
-
- )}
- >
- )
-}
-
-export default Root
diff --git a/website/src/theme/Root.module.css b/website/src/theme/Root.module.css
deleted file mode 100644
index 1355c794..00000000
--- a/website/src/theme/Root.module.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.wrapper {
- position: fixed;
- z-index: 1000;
- bottom: 0;
- left: 0;
- width: 100%;
- min-height: 300px;
- background-color: #303846;
- color: #fff;
-}
-
-.container {
- margin: 0px auto;
- max-width: 1200px;
- padding: 54px 24px;
-}
-
-.content {
- font-size: 18px;
-}
-
-.action {
- display: flex;
- margin-top: 20px;
- /* justify-content: flex-end; */
-}
-
-.btn {
- display: inline-block;
- cursor: pointer;
- background-color: #222;
- color: #ccc;
- padding: 8px 12px;
- margin-right: 20px;
-}
-.btn:hover {
- opacity: 0.8;
-}
-
-.primaryBtn {
- background-color: #fff;
- color: #000;
-}
diff --git a/website/src/utils/internal.js b/website/src/utils/internal.js
deleted file mode 100644
index 8a4ac53a..00000000
--- a/website/src/utils/internal.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const EVENT_NAME = 'check:internal'
-let pending = false
-
-export async function isIntranet() {
- if (pending === false) {
- pending = true
- _checkIntranet().then((validAuthorization) => {
- if (validAuthorization) {
- window.dispatchEvent(new CustomEvent(EVENT_NAME))
- pending = false
- }
- })
- }
-
- return new Promise((resolve) => {
- const fullfilled = () => {
- window.removeEventListener(EVENT_NAME, fullfilled)
- resolve()
- }
- window.addEventListener(EVENT_NAME, fullfilled)
- })
-}
-
-// 检查是否是内网环境
-async function _checkIntranet() {
- try {
- const checkResult = await fetch(
- 'https://alilang-intranet.alibaba-inc.com/is_white_list.json',
- { headers: { 'need-json': '1' } }
- ).then((res) => res.json())
- return (
- checkResult &&
- checkResult.content === true &&
- checkResult.hasError === false
- )
- } catch (error) {
- return false
- }
-}
diff --git a/website/src/utils/storage.js b/website/src/utils/storage.js
deleted file mode 100644
index 873756ea..00000000
--- a/website/src/utils/storage.js
+++ /dev/null
@@ -1,42 +0,0 @@
-export default {
- get: (key) => {
- const result = window.localStorage.getItem(key)
-
- if (result === null) {
- return null
- }
-
- try {
- const { value, validTime, writeTime } = JSON.parse(result)
- if (Date.now() - writeTime > validTime) {
- // 已过期
- window.localStorage.removeItem(key)
- return null
- }
-
- return value
- } catch (err) {
- console.error('storage.get error', err)
- // 清除掉不合法数据,防止持续报错
- window.localStorage.removeItem(key)
- return null
- }
- },
-
- /**
- * 写入
- * @param {String} key
- * @param {String} value
- * @param {String} validTime 有效时间,单位 ms
- */
- set: (key, value, validTime) => {
- window.localStorage.setItem(
- key,
- JSON.stringify({
- value,
- validTime,
- writeTime: Date.now()
- })
- )
- }
-}
diff --git a/website/static/.nojekyll b/website/static/.nojekyll
deleted file mode 100644
index e69de29b..00000000
diff --git a/website/static/img/mor-icon.svg b/website/static/img/mor-icon.svg
deleted file mode 100644
index 4c3ccb5d..00000000
--- a/website/static/img/mor-icon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/website/tsconfig.json b/website/tsconfig.json
deleted file mode 100644
index 6f475698..00000000
--- a/website/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- // This file is not used in compilation. It is here just for a nice editor experience.
- "extends": "@tsconfig/docusaurus/tsconfig.json",
- "compilerOptions": {
- "baseUrl": "."
- }
-}