@modern-js/module-tools-docs 2.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +144 -0
- package/docs/.island/config.ts +245 -0
- package/docs/.island/dist/404.html +41 -0
- package/docs/.island/dist/assets/before-getting-started.1b82b538.js +87 -0
- package/docs/.island/dist/assets/before-getting-started.582a31cc.js +87 -0
- package/docs/.island/dist/assets/build-config.72eb0918.js +804 -0
- package/docs/.island/dist/assets/build-config.d8bb1658.js +809 -0
- package/docs/.island/dist/assets/build-preset.96805d7d.js +256 -0
- package/docs/.island/dist/assets/build-preset.c20dcd40.js +256 -0
- package/docs/.island/dist/assets/build-your-ui.7f349247.js +2 -0
- package/docs/.island/dist/assets/build-your-ui.a8361604.js +2 -0
- package/docs/.island/dist/assets/command-preview.2d45fc82.js +264 -0
- package/docs/.island/dist/assets/command-preview.dc51b953.js +264 -0
- package/docs/.island/dist/assets/components.esm.03560353.js +9 -0
- package/docs/.island/dist/assets/design-system.86694ff5.js +1254 -0
- package/docs/.island/dist/assets/design-system.c4745cce.js +639 -0
- package/docs/.island/dist/assets/dev.1d326a37.js +37 -0
- package/docs/.island/dist/assets/dev.1fd06000.js +37 -0
- package/docs/.island/dist/assets/down.f35427d3.svg +1 -0
- package/docs/.island/dist/assets/extension.12299fd6.js +2 -0
- package/docs/.island/dist/assets/extension.96dc63a4.js +2 -0
- package/docs/.island/dist/assets/getting-started.40e9218d.js +117 -0
- package/docs/.island/dist/assets/getting-started.b1ed3f10.js +114 -0
- package/docs/.island/dist/assets/github.3bf8ccee.svg +1 -0
- package/docs/.island/dist/assets/index.2b2347ea.js +33 -0
- package/docs/.island/dist/assets/index.6cef6f5f.js +4 -0
- package/docs/.island/dist/assets/index.cb118238.js +36 -0
- package/docs/.island/dist/assets/index.ccb6ce27.js +4 -0
- package/docs/.island/dist/assets/island_inject.11a12ecc.js +1 -0
- package/docs/.island/dist/assets/island_inject.b13deaee.js +1 -0
- package/docs/.island/dist/assets/loading.8c9bb911.svg +1 -0
- package/docs/.island/dist/assets/modify-output-product.7f6bff35.js +100 -0
- package/docs/.island/dist/assets/modify-output-product.b91eff1f.js +100 -0
- package/docs/.island/dist/assets/moon.6b705924.svg +3 -0
- package/docs/.island/dist/assets/plugin.895932d8.js +42 -0
- package/docs/.island/dist/assets/plugin.d2fbc531.js +42 -0
- package/docs/.island/dist/assets/publish-your-project.21b8309f.js +164 -0
- package/docs/.island/dist/assets/publish-your-project.8d398b17.js +166 -0
- package/docs/.island/dist/assets/right.89674cd7.svg +1 -0
- package/docs/.island/dist/assets/search.0aea6901.svg +1 -0
- package/docs/.island/dist/assets/search.1c85d17c.js +3 -0
- package/docs/.island/dist/assets/search.484eca11.js +222 -0
- package/docs/.island/dist/assets/search.54fca8d0.js +3 -0
- package/docs/.island/dist/assets/style.09015a4b.css +1 -0
- package/docs/.island/dist/assets/style.2e5f7bc2.css +1970 -0
- package/docs/.island/dist/assets/sun.841dac10.svg +11 -0
- package/docs/.island/dist/assets/test-your-project.18bd4582.js +190 -0
- package/docs/.island/dist/assets/test-your-project.f53bebf7.js +190 -0
- package/docs/.island/dist/assets/test.0da1f99f.js +67 -0
- package/docs/.island/dist/assets/test.0e81f002.js +66 -0
- package/docs/.island/dist/assets/translator.b1077c44.svg +1 -0
- package/docs/.island/dist/assets/use-micro-generator.7d9e4016.js +60 -0
- package/docs/.island/dist/assets/use-micro-generator.db5520c1.js +60 -0
- package/docs/.island/dist/assets/using-storybook.57ea6b77.js +260 -0
- package/docs/.island/dist/assets/using-storybook.a2212f2e.js +260 -0
- package/docs/.island/dist/assets/welcome.0449a9c8.js +13 -0
- package/docs/.island/dist/assets/welcome.a8448931.js +13 -0
- package/docs/.island/dist/assets/why-module-engineering-solution.6ae8c0e3.js +26 -0
- package/docs/.island/dist/assets/why-module-engineering-solution.c9a45cbd.js +26 -0
- package/docs/.island/dist/chunk-COLCRJ2V.js +1 -0
- package/docs/.island/dist/chunk-K5FMOYDC.js +10 -0
- package/docs/.island/dist/chunk-WE42KMYS.js +26 -0
- package/docs/.island/dist/client-entry.js +3 -0
- package/docs/.island/dist/en/api/build-config.html +344 -0
- package/docs/.island/dist/en/api/build-preset.html +82 -0
- package/docs/.island/dist/en/api/design-system.html +155 -0
- package/docs/.island/dist/en/api/dev.html +45 -0
- package/docs/.island/dist/en/api/index.html +41 -0
- package/docs/.island/dist/en/api/plugin.html +48 -0
- package/docs/.island/dist/en/api/test.html +58 -0
- package/docs/.island/dist/en/guide/before-getting-started.html +127 -0
- package/docs/.island/dist/en/guide/build-your-ui.html +41 -0
- package/docs/.island/dist/en/guide/command-preview.html +100 -0
- package/docs/.island/dist/en/guide/extension.html +41 -0
- package/docs/.island/dist/en/guide/getting-started.html +76 -0
- package/docs/.island/dist/en/guide/modify-output-product.html +140 -0
- package/docs/.island/dist/en/guide/publish-your-project.html +91 -0
- package/docs/.island/dist/en/guide/test-your-project.html +72 -0
- package/docs/.island/dist/en/guide/use-micro-generator.html +65 -0
- package/docs/.island/dist/en/guide/using-storybook.html +113 -0
- package/docs/.island/dist/en/guide/welcome.html +53 -0
- package/docs/.island/dist/en/guide/why-module-engineering-solution.html +49 -0
- package/docs/.island/dist/en/index.html +42 -0
- package/docs/.island/dist/react-dom.js +1 -0
- package/docs/.island/dist/react-dom_client.js +1 -0
- package/docs/.island/dist/react.js +1 -0
- package/docs/.island/dist/react_jsx-runtime.js +10 -0
- package/docs/.island/dist/ssr-manifest.json +57 -0
- package/docs/.island/dist/test-result.png +0 -0
- package/docs/.island/dist/why-module-solution.png +0 -0
- package/docs/.island/dist/zh/api/build-config.html +347 -0
- package/docs/.island/dist/zh/api/build-preset.html +82 -0
- package/docs/.island/dist/zh/api/design-system.html +149 -0
- package/docs/.island/dist/zh/api/dev.html +46 -0
- package/docs/.island/dist/zh/api/index.html +41 -0
- package/docs/.island/dist/zh/api/plugin.html +48 -0
- package/docs/.island/dist/zh/api/test.html +59 -0
- package/docs/.island/dist/zh/guide/before-getting-started.html +127 -0
- package/docs/.island/dist/zh/guide/build-your-ui.html +41 -0
- package/docs/.island/dist/zh/guide/command-preview.html +100 -0
- package/docs/.island/dist/zh/guide/extension.html +41 -0
- package/docs/.island/dist/zh/guide/getting-started.html +79 -0
- package/docs/.island/dist/zh/guide/modify-output-product.html +140 -0
- package/docs/.island/dist/zh/guide/publish-your-project.html +92 -0
- package/docs/.island/dist/zh/guide/test-your-project.html +72 -0
- package/docs/.island/dist/zh/guide/use-micro-generator.html +65 -0
- package/docs/.island/dist/zh/guide/using-storybook.html +114 -0
- package/docs/.island/dist/zh/guide/welcome.html +53 -0
- package/docs/.island/dist/zh/guide/why-module-engineering-solution.html +49 -0
- package/docs/.island/dist/zh/index.html +42 -0
- package/docs/.island/index.html +39 -0
- package/docs/.island/styles/index.css +10 -0
- package/docs/en/api/build-config.md +501 -0
- package/docs/en/api/build-preset.md +214 -0
- package/docs/en/api/design-system.md +524 -0
- package/docs/en/api/dev.md +32 -0
- package/docs/en/api/index.md +3 -0
- package/docs/en/api/plugin.md +34 -0
- package/docs/en/api/test.md +48 -0
- package/docs/en/guide/advance/asset.mdx +132 -0
- package/docs/en/guide/advance/build-umd.mdx +241 -0
- package/docs/en/guide/advance/copy.md +235 -0
- package/docs/en/guide/advance/external-dependency.mdx +125 -0
- package/docs/en/guide/advance/in-depth-about-build.md +266 -0
- package/docs/en/guide/advance/in-depth-about-dev-command.md +22 -0
- package/docs/en/guide/basic/before-getting-started.md +187 -0
- package/docs/en/guide/basic/command-preview.md +204 -0
- package/docs/en/guide/basic/modify-output-product.md +145 -0
- package/docs/en/guide/basic/publish-your-project.md +115 -0
- package/docs/en/guide/basic/test-your-project.mdx +158 -0
- package/docs/en/guide/basic/use-micro-generator.md +35 -0
- package/docs/en/guide/basic/using-storybook.mdx +187 -0
- package/docs/en/guide/intro/getting-started.md +78 -0
- package/docs/en/guide/intro/welcome.md +14 -0
- package/docs/en/guide/intro/why-module-engineering-solution.md +17 -0
- package/docs/en/index.md +35 -0
- package/docs/public/test-result.png +0 -0
- package/docs/public/why-module-solution.png +0 -0
- package/docs/zh/api/build-config.md +570 -0
- package/docs/zh/api/build-preset.md +220 -0
- package/docs/zh/api/design-system.md +1147 -0
- package/docs/zh/api/dev.md +33 -0
- package/docs/zh/api/index.md +3 -0
- package/docs/zh/api/plugins.md +108 -0
- package/docs/zh/api/testing.md +52 -0
- package/docs/zh/guide/advance/asset.mdx +132 -0
- package/docs/zh/guide/advance/build-umd.mdx +232 -0
- package/docs/zh/guide/advance/copy.md +235 -0
- package/docs/zh/guide/advance/external-dependency.mdx +125 -0
- package/docs/zh/guide/advance/in-depth-about-build.md +267 -0
- package/docs/zh/guide/advance/in-depth-about-dev-command.md +26 -0
- package/docs/zh/guide/basic/before-getting-started.md +187 -0
- package/docs/zh/guide/basic/command-preview.md +204 -0
- package/docs/zh/guide/basic/modify-output-product.md +144 -0
- package/docs/zh/guide/basic/publish-your-project.md +112 -0
- package/docs/zh/guide/basic/test-your-project.mdx +158 -0
- package/docs/zh/guide/basic/use-micro-generator.md +35 -0
- package/docs/zh/guide/basic/using-storybook.mdx +186 -0
- package/docs/zh/guide/intro/getting-started.md +78 -0
- package/docs/zh/guide/intro/welcome.md +14 -0
- package/docs/zh/guide/intro/why-module-engineering-solution.md +17 -0
- package/docs/zh/index.md +29 -0
- package/package.json +19 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# 开始之前
|
|
2
|
+
|
|
3
|
+
## 环境准备
|
|
4
|
+
|
|
5
|
+
为了使用 Modern.js 模块工程解决方案,首先需要 [NodeJS](https://nodejs.org/zh/),我们推荐最新的[长期维护版本](https://github.com/nodejs/Release),并确保 Node 版本大于等于 **14.17.6**。因为非稳定的 NodeJS 时常有一些 Bug,你可以使用 [nvm-windows](https://github.com/coreybutler/nvm-windows) 和 [nvm](https://github.com/nvm-sh/nvm)(Mac/linux)安装,这样你就可以方便地切换到不同的 NodeJS 版本,这些版本可能会用于不同的项目。
|
|
6
|
+
## 初识 npm
|
|
7
|
+
|
|
8
|
+
当 NodeJS 被安装后,你不仅可以在命令行中访问 `node` 可执行程序,同时你也可以执行 `npm` 命令。
|
|
9
|
+
|
|
10
|
+
npm 是 NodeJS 的标准软件包管理器。它一开始的用途是用于下载和管理 NodeJS 包的依赖关系,但后来它逐渐变成为一个用于前端 JavaScript 的工具。
|
|
11
|
+
|
|
12
|
+
**如果你已经对 npm 和 npm 包的使用方式有所了解,那么可以直接跳到[【npm 包管理器】](/zh/guide/before-getting-started#npm-包管理器)部分。**
|
|
13
|
+
|
|
14
|
+
## npm 包类型项目
|
|
15
|
+
|
|
16
|
+
那么什么是 npm 包类型的项目呢?当我们在一个空的项目目录下执行 `npm init` 命令的时候,它会在当前目录下面创建一个文件名为 `package.json` 的 JSON 文件。在创建过程中,我们需要填写包括但不限于 npm 包的名称、版本号、描述等等内容,这些填写的内容都会在生成的 `package.json` 文件中找到:
|
|
17
|
+
|
|
18
|
+
``` json
|
|
19
|
+
{
|
|
20
|
+
"name": "npm-demo",
|
|
21
|
+
"version": "1.0.0",
|
|
22
|
+
"description": "",
|
|
23
|
+
"main": "index.js",
|
|
24
|
+
"scripts": {
|
|
25
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
26
|
+
},
|
|
27
|
+
"author": "",
|
|
28
|
+
"license": "ISC"
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
此时这个包含了初始化后的 `package.json` 文件的项目就是一个 npm 包类型的项目,你可以执行 `npm publish` 命令将这个项目发布到 [npm Registry](https://www.npmjs.com/)。
|
|
33
|
+
|
|
34
|
+
npm Registry 是一个 [npm 包存储的地方](https://docs.npmjs.com/about-the-public-npm-registry),开发者们不仅可以将他们自己的 npm 包发布到 npm Registry,还可以通过 npm Registry 使用其他开发者发布的 npm 包。
|
|
35
|
+
|
|
36
|
+
优质的 npm 包会有更多的人去使用,因为它不仅节省了很多代码实现的工作,同时也不容易让项目出现问题。
|
|
37
|
+
|
|
38
|
+
## 使用第三方 npm 包
|
|
39
|
+
|
|
40
|
+
当要为初始化的项目增加第三方的 npm 包的时候,我们可以把这一过程叫做“为项目安装依赖”或是“为项目增加依赖”。在增加依赖之前,首先我们要特别了解一件事情 —— **npm 依赖的软件包类型**:
|
|
41
|
+
|
|
42
|
+
- `"dependencies"`:一种是你的应用程序在生产环境中需要的软件包。
|
|
43
|
+
- `"devDependencies"`:另一种是仅在本地开发和测试中需要的软件包。
|
|
44
|
+
> 软件包可以理解为是第三方的 npm 包。
|
|
45
|
+
|
|
46
|
+
你可以通过执行 `npm install npm-package-name` 或者 `npm add npm-package-name` 的方式来安装在**生产环境中需要的软件包**,或者也可以在 `package.json` 文件中手动的将需要安装的包和对应的[语义化版本](https://docs.npmjs.com/about-semantic-versioning)写在 `"dependencies"` 里,并执行 `npm install` 命令:
|
|
47
|
+
|
|
48
|
+
``` json
|
|
49
|
+
{
|
|
50
|
+
"name": "your-npm-project",
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"npm-package-name": "0.1.0"
|
|
53
|
+
},
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
同理,你也可以执行 `npm install npm-package-name --save-dev` 或 `npm add npm-package-name --save-dev` 的方式来安装**仅在本地开发和测试中需要的软件包**,或者也可以在 `package.json` 文件中手动的将需要安装的包和对应的[语义化版本](https://docs.npmjs.com/about-semantic-versioning)写在 `"devDependencies"` 里,并执行 `npm install` 命令:
|
|
58
|
+
|
|
59
|
+
``` json
|
|
60
|
+
{
|
|
61
|
+
"name": "your-npm-project",
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"npm-package-name": "0.1.0"
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**在安装或者使用第三方 npm 包的时候一定要确定它们的用途,以及通过区分它们的类型确定好它们应该放在 `"dependencies"` 还是 `"devDependencies"` 中。**
|
|
69
|
+
:::tip
|
|
70
|
+
一般来说,需要在源代码中使用到的包都属于 `dependencies` 依赖。除非你通过打包的方式将依赖的代码输出到本地,那么这种情况可以将它作为 `devDependencies` 依赖。
|
|
71
|
+
:::
|
|
72
|
+
|
|
73
|
+
## 还需要了解的 npm 零碎知识
|
|
74
|
+
|
|
75
|
+
### npm 包的程序入口
|
|
76
|
+
|
|
77
|
+
在 `package.json` 中存在一个 `"main"` 属性,它对应的值是一个模块 ID,或者更直观的说是一个 NodeJS 文件路径,它是你程序的主要入口。
|
|
78
|
+
|
|
79
|
+
例如你的包名为 `foo`,并且用户安装了它,然后执行 `require("foo")` 代码,那么 `foo` 这个 npm 包的 `"main"` 字段对应的文件将会被导出。
|
|
80
|
+
|
|
81
|
+
**推荐在你的 npm 包里一定要设置 `"main"` 字段**。如果没有设置 `"main"`,则默认入口为包的根目录下的 `index.js` 文件。
|
|
82
|
+
|
|
83
|
+
除了需要设置 `"main"` 属性以外,一般还会设置 `"module"` 属性。它与 `"main"` 属性的用途类似,它主要是用于在 webpack 场景下使用。webpack 在大多数情况下,会以 **"module" -> "main"** 这个顺序读取 npm 包的入口(文件)。
|
|
84
|
+
|
|
85
|
+
> 想要了解关于 webpack 如何做这件事,可以查看这个[链接](https://webpack.js.org/configuration/resolve/#resolvemainfields)。
|
|
86
|
+
|
|
87
|
+
### `"scripts"`
|
|
88
|
+
|
|
89
|
+
`package.json` 文件的 `"scripts"` 属性支持一些内置的脚本和 npm 预设的生命周期事件,以及任意的脚本。
|
|
90
|
+
|
|
91
|
+
这些都可以通过运行 `npm run-script <stage>` 或简称 `npm run <stage>` 来执行。
|
|
92
|
+
|
|
93
|
+
名称匹配的[前置命令和后置命令](https://docs.npmjs.com/cli/v9/using-npm/scripts#pre--post-scripts)也会被运行(例如 `premyscript`、`myscript`、`postmyscript`)。
|
|
94
|
+
|
|
95
|
+
``` json
|
|
96
|
+
{
|
|
97
|
+
"scripts": {
|
|
98
|
+
"premyscript": "",
|
|
99
|
+
"myscript": "",
|
|
100
|
+
"postmyscript": "",
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
当执行 `npm run myscripts` 的时候,`premyscripts` 对应的脚本会在它之前执行,`postmyscripts` 对应的脚本会在它之后执行。
|
|
106
|
+
|
|
107
|
+
来自依赖的脚本命令可以用 `npm explore <pkg> -- npm run <stage>` 运行。
|
|
108
|
+
|
|
109
|
+
还有一些特殊的生命周期脚本(Life Scripts),只在某些情况下发生。这里介绍几个通常需要了解的情况。
|
|
110
|
+
|
|
111
|
+
#### `npm install`
|
|
112
|
+
|
|
113
|
+
当你运行 `npm install -g <pkg-name>` 时,以下脚本会运行。
|
|
114
|
+
|
|
115
|
+
- `preinstall`
|
|
116
|
+
- `install`
|
|
117
|
+
- `postinstall`
|
|
118
|
+
- `prepublish`
|
|
119
|
+
- `preprepare`
|
|
120
|
+
- `prepare`
|
|
121
|
+
- `postprepare`
|
|
122
|
+
|
|
123
|
+
如果你的软件包根目录有一个 `binding.gyp` 文件,而你没有定义 `install` 或 `preinstall` 脚本,那么 npm 将以 `node-gyp rebuild` 作为默认的 install 命令,使用 [node-gyp](https://github.com/nodejs/node-gyp) 进行编译。
|
|
124
|
+
|
|
125
|
+
#### `npm publish`
|
|
126
|
+
|
|
127
|
+
当发布项目的时候,执行该命令会触发以下脚本:
|
|
128
|
+
|
|
129
|
+
- `prepublishOnly`
|
|
130
|
+
- `prepack`
|
|
131
|
+
- `prepare`
|
|
132
|
+
- `postpack`
|
|
133
|
+
- `publish`
|
|
134
|
+
- `postpublish`
|
|
135
|
+
|
|
136
|
+
当以 [`--dry-run`](https://docs.npmjs.com/cli/v7/commands/npm-publish#dry-run) 模式运行的时候,`prepare` 对应的脚本将不会执行。
|
|
137
|
+
|
|
138
|
+
### peerDependencies
|
|
139
|
+
|
|
140
|
+
在某些情况下,你的 npm 项目与它的宿主工具或者库之间存在某种兼容关系(例如一个 webpack 插件项目和 webpack),同时你的 npm 项目不想将宿主作为必要的依赖,这个时候通常说明你的项目可能是这个宿主工具或者库的插件。你的 npm 项目会对宿主包的版本有一定的要求,因为只有在特定的版本下才会暴露出 npm 项目所需要的 API。
|
|
141
|
+
|
|
142
|
+
关于更多 `peerDependencies` 的解释,可以通过下面的链接了解 npm、pnpm、Yarn 对于它的不同处理方式:
|
|
143
|
+
|
|
144
|
+
- [npm 对 peerDependencies 的解释](https://docs.npmjs.com/cli/v9/configuring-npm/package-json#peerdependencies)
|
|
145
|
+
- [pnpm vs npm VS Yarn](https://pnpm.io/feature-comparison)
|
|
146
|
+
|
|
147
|
+
## npm 包管理器
|
|
148
|
+
|
|
149
|
+
除了 npm 这种标准的包管理器以外,目前主流的还有 **pnpm** 和 **Yarn**,它们都是不错的 npm cli 替代品。
|
|
150
|
+
|
|
151
|
+
推荐使用 [pnpm](https://pnpm.io/installation) 来管理项目依赖,可以通过下面的方式安装它:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
npm install -g pnpm
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Module Tools 配置文件
|
|
158
|
+
|
|
159
|
+
初始化的模块工程项目目录下提供了 Module Tools 的配置文件 —— `modern.config.(j|t)s`。默认情况下,不需要做任何配置,因此 `modern.config` 配置文件不是必须存在的。
|
|
160
|
+
|
|
161
|
+
初始化的配置文件的内容如下:
|
|
162
|
+
|
|
163
|
+
``` typescript
|
|
164
|
+
// modern.config.ts
|
|
165
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
166
|
+
|
|
167
|
+
export default defineConfig({});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
``` js
|
|
171
|
+
// modern.config.js
|
|
172
|
+
const { defineConfig } = require('@modern-js/module-tools');
|
|
173
|
+
|
|
174
|
+
module.exports = defineConfig({});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**我们推荐使用 `defineConfig` 函数**,不过并不强制使用它。因此你也可以在配置文件中直接返回一个对象:
|
|
178
|
+
|
|
179
|
+
``` typescript
|
|
180
|
+
// modern.config.ts
|
|
181
|
+
export default {};
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
``` js
|
|
185
|
+
// modern.config.js
|
|
186
|
+
module.exports = {};
|
|
187
|
+
```
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# 命令预览
|
|
2
|
+
|
|
3
|
+
模块工程项目可以使用的命令:
|
|
4
|
+
|
|
5
|
+
## `modern build`
|
|
6
|
+
|
|
7
|
+
``` bash
|
|
8
|
+
Usage: modern build [options]
|
|
9
|
+
|
|
10
|
+
构建模块命令
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
-w, --watch 使用监听模式构建代码
|
|
14
|
+
--tsconfig [tsconfig] 指定 tsconfig.json 文件的路径 (default:
|
|
15
|
+
"./tsconfig.json")
|
|
16
|
+
--platform [platform] 构建所有或者指定平台的产物
|
|
17
|
+
--no-dts 关闭 DTS 类型文件生成和类型检查
|
|
18
|
+
--no-clear 关闭自动清除产物输出目录的行为
|
|
19
|
+
-h, --help 展示当前命令的信息
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
当想要启动项目构建的时候,可以执行 `modern build` 命令。在使用这个命令的时候,我们可以:
|
|
23
|
+
|
|
24
|
+
- 当想要以观察模式启动构建时,使用 `--watch` 选项。
|
|
25
|
+
- 当想要指定项目编译读取的 TypeScript 配置文件的路径时,使用 `build --tsconfig ./path/config.json` 选项。使用该选项后,会覆盖所有 [`buildConfig`](/zh/api/build-config) 里 [`dts.tsconfigPath`](/zh/api/build-config) 配置。
|
|
26
|
+
- 当需要关闭项目的 DTS 类型文件生成和类型检查行为时,可以使用 `--no-dts` 选项。**注意:类型文件的生成依赖类型检查的结果。如果关闭了类型检查,那么类型文件也不会生成**。
|
|
27
|
+
- 当需要关闭自动清除产物输出目录的行为时,可以使用 `--no-clear` 选项。
|
|
28
|
+
|
|
29
|
+
除了以上,模块工程还支持 `platform` 构建模式,可以用于执行其他工具的构建任务。例如,目前官方支持在安装了 `@modern-js/plugin-storybook` 插件后,可以通过执行 `modern build --platform` 或者 `modern build --platform storybook` 命令启动 Storybook 构建任务生成 Storybook 产物。
|
|
30
|
+
|
|
31
|
+
:::tip{title=注意}
|
|
32
|
+
在执行 Storybook 构建的时候,它需要读取项目的构建产物。因此**在执行 `modern build --platform` 命令启动 Storybook 构建的时候,要先执行一次 `modern build` 确保源码构建产物的存在**。
|
|
33
|
+
:::
|
|
34
|
+
|
|
35
|
+
## `modern new`
|
|
36
|
+
|
|
37
|
+
``` bash
|
|
38
|
+
Usage: modern new [options]
|
|
39
|
+
|
|
40
|
+
模块化工程方案中执行生成器
|
|
41
|
+
|
|
42
|
+
Options:
|
|
43
|
+
-d, --debug 开启 Debug 模式,打印调试日志信息 (default: false)
|
|
44
|
+
-c, --config <config> 生成器运行默认配置(JSON 字符串)
|
|
45
|
+
--dist-tag <tag> 生成器使用特殊的 npm Tag 版本
|
|
46
|
+
--registry 生成器运行过程中定制 npm Registry
|
|
47
|
+
-h, --help display help for command
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`modern new` 命令用于启动微生成器功能,它可以为项目启用默认没有提供的功能。
|
|
51
|
+
|
|
52
|
+
目前可以开启的功能有:
|
|
53
|
+
|
|
54
|
+
- Storybook 调试
|
|
55
|
+
- Tailwind CSS 支持
|
|
56
|
+
- Modern.js Runtime API
|
|
57
|
+
|
|
58
|
+
关于这些功能,可以通过[【使用微生成器】](/zh/guide/use-micro-generator) 章节了解更多。
|
|
59
|
+
|
|
60
|
+
## `modern dev`
|
|
61
|
+
|
|
62
|
+
``` bash
|
|
63
|
+
Usage: modern dev [options]
|
|
64
|
+
|
|
65
|
+
本地开发命令
|
|
66
|
+
|
|
67
|
+
Options:
|
|
68
|
+
-h, --help display help for command
|
|
69
|
+
|
|
70
|
+
Commands:
|
|
71
|
+
[dev-tools-subCommand]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
模块工程解决方案提供了使用调试工具的能力,可以通过 `modern dev` 命令来启动。不过要注意的是,默认情况下是没有提供调试相关的插件,因此此时执行 `modern dev` 会提示: *"No dev tools found available"*。
|
|
75
|
+
|
|
76
|
+
目前官方支持的调试工具有 [Storybook](https://storybook.js.org/),因此在你执行 `modern new` 命令开启它后,就可以执行 `modern dev` 或者 `modern dev storybook` 执行它。
|
|
77
|
+
|
|
78
|
+
## `modern test`
|
|
79
|
+
|
|
80
|
+
``` bash
|
|
81
|
+
Usage: modern test [options]
|
|
82
|
+
|
|
83
|
+
Options:
|
|
84
|
+
-h, --help display help for command
|
|
85
|
+
```
|
|
86
|
+
`modern test` 命令会自动将 `src/tests/*.test.(js|ts|jsx|tsx)` 文件当做测试用例运行。
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
## `modern lint`
|
|
90
|
+
|
|
91
|
+
``` bash
|
|
92
|
+
Usage: modern lint [options] [...files]
|
|
93
|
+
|
|
94
|
+
lint and fix source files
|
|
95
|
+
|
|
96
|
+
Options:
|
|
97
|
+
--no-fix disable auto fix source file
|
|
98
|
+
-h, --help display help for command
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
运行 [ESLint](https://eslint.org/) 检查代码语法情况。通常情况下,我们只需要在 `git commit` 阶段通过 [lint-staged](https://github.com/okonet/lint-staged) 检查本次提交修改的部分代码。
|
|
102
|
+
|
|
103
|
+
- `--no-fix` 参数设置后可以关闭自动修复 lint 错误代码的能力。
|
|
104
|
+
|
|
105
|
+
## `modern change`
|
|
106
|
+
|
|
107
|
+
``` bash
|
|
108
|
+
Usage: modern change [options]
|
|
109
|
+
|
|
110
|
+
创建变更集
|
|
111
|
+
|
|
112
|
+
Options:
|
|
113
|
+
--empty 创建空变更集 (default: false)
|
|
114
|
+
--open 使用编辑器中打开创建的变更集 (default: false)
|
|
115
|
+
-h, --help display help for command
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`modern change` 命令用于生成 [changesets](https://github.com/changesets/changesets) 需要的 Markdown 文件。
|
|
119
|
+
|
|
120
|
+
## `modern pre`
|
|
121
|
+
|
|
122
|
+
``` bash
|
|
123
|
+
Usage: modern pre [options] <enter|exit> [tag]
|
|
124
|
+
|
|
125
|
+
进入和退出预发布模式
|
|
126
|
+
|
|
127
|
+
Options:
|
|
128
|
+
-h, --help display help for command
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
可以使用 `modern pre` 命令在正式发布前[预发布](https://github.com/atlassian/changesets/blob/main/docs/prereleases.md)一个版本。
|
|
132
|
+
|
|
133
|
+
## `modern bump`
|
|
134
|
+
|
|
135
|
+
``` bash
|
|
136
|
+
Usage: modern bump [options]
|
|
137
|
+
|
|
138
|
+
使用变更集自动更新发布版本和变更日志
|
|
139
|
+
|
|
140
|
+
Options:
|
|
141
|
+
--canary 创建一个预发布版本进行测试 (default: false)
|
|
142
|
+
--preid <tag> 在对预发布版本进行版本控制时指定标识符 (default: "next")
|
|
143
|
+
--snapshot 创建一个特殊版本进行测试 (default: false)
|
|
144
|
+
-h, --help display help for command
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
按照 [changesets](https://github.com/changesets/changesets) 生成的变更记录的 Markdown 文件修改 `package.json` 中的版本号, 同时生成 `CHANGELOG.md` 文件。
|
|
148
|
+
|
|
149
|
+
## `modern release`
|
|
150
|
+
|
|
151
|
+
``` bash
|
|
152
|
+
Usage: modern release [options]
|
|
153
|
+
|
|
154
|
+
发布 npm 包
|
|
155
|
+
|
|
156
|
+
Options:
|
|
157
|
+
--tag <tag> 发布 npm 包使用特定的 tag (default: "")
|
|
158
|
+
--ignore-scripts 发布时忽略 package.json 中的 scripts 命令,仅支持在 pnpm monorepo
|
|
159
|
+
中使用 (default: "")
|
|
160
|
+
-h, --help display help for command
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`modern release` 命令可以将模块发布到 [npm Registry](https://www.npmjs.com/) 上。
|
|
164
|
+
|
|
165
|
+
- `--tag` 参数可以指定发布时具体的 [dist tags](https://docs.npmjs.com/adding-dist-tags-to-packages)。
|
|
166
|
+
|
|
167
|
+
## `modern gen-release-note`
|
|
168
|
+
|
|
169
|
+
``` bash
|
|
170
|
+
Usage: modern gen-release-note [options]
|
|
171
|
+
|
|
172
|
+
根据当前仓库 changeset 信息生成 Release Note
|
|
173
|
+
|
|
174
|
+
Options:
|
|
175
|
+
--repo <repo> 仓库名称,用于生成 Pull Request 链接, 例如: modern-js-dev/modern.js
|
|
176
|
+
--custom <cumtom> 自定义 Release Note 生成函数
|
|
177
|
+
-h, --help display help for command
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
根据当前仓库的 changeset 信息自动生成 [Release Note](https://en.wikipedia.org/wiki/Release_notes)。
|
|
181
|
+
|
|
182
|
+
:::tip{title=注意}
|
|
183
|
+
需要在 `bump` 命令之前执行。
|
|
184
|
+
:::
|
|
185
|
+
|
|
186
|
+
## `modern upgrade`
|
|
187
|
+
|
|
188
|
+
``` bash
|
|
189
|
+
Usage: modern upgrade [options]
|
|
190
|
+
|
|
191
|
+
升级 Modern.js 到最新版本
|
|
192
|
+
|
|
193
|
+
Options:
|
|
194
|
+
--registry <registry> 定制 npm registry (default: "")
|
|
195
|
+
-d,--debug 开启 Debug 模式,打印调试日志信息 (default: false)
|
|
196
|
+
--cwd <cwd> 项目路径 (default: "")
|
|
197
|
+
-h, --help display help for command
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`modern upgrade` 命令,用于升级项目 Modern.js 相关依赖至最新版本。
|
|
201
|
+
|
|
202
|
+
在项目根目录下执行命令 `npx modern upgrade`,会默认将当前执行命令项目的 `package.json` 中的 Modern.js 相关依赖更新至最新版本。
|
|
203
|
+
|
|
204
|
+
命令在 `@modern-js/module-tools` 版本 **>= 1.17.0** 提供,之前版本可使用 `npx @modern-js/upgrade` 进行升级。
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# 修改输出产物
|
|
2
|
+
|
|
3
|
+
## 默认输出产物
|
|
4
|
+
|
|
5
|
+
当在初始化的项目里使用 `modern build` 命令的时候,会根据 Module Tools 默认支持的配置生成相应的产物。默认支持的配置具体如下:
|
|
6
|
+
|
|
7
|
+
``` typescript
|
|
8
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
buildPreset: 'base-config',
|
|
12
|
+
});
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**默认生成产物具有以下特点**:
|
|
16
|
+
|
|
17
|
+
- 代码格式为 [CommonJS](https://nodejs.org/api/modules.html#modules-commonjs-modules),或者简称为 `cjs`。
|
|
18
|
+
- 代码语法支持到 `ES6`。
|
|
19
|
+
- 所有的代码经过打包变成了一个文件,即进行了 **bundle** 处理。
|
|
20
|
+
- 产物输出根目录为项目下的 `dist` 目录,类型文件输出的目录为 `dist/types`。
|
|
21
|
+
|
|
22
|
+
:::tip
|
|
23
|
+
1. 所谓“代码语法支持到 ES6”的意思是指:产物代码所支持的语法不会超过 `ES6`。如果源码中使用语法是 `ES6` 以上的语法(例如 `ES2017`),则会被进行转换。
|
|
24
|
+
:::
|
|
25
|
+
|
|
26
|
+
看到这里你可能会有以下疑问:
|
|
27
|
+
|
|
28
|
+
1. `buildPreset` 是什么?
|
|
29
|
+
2. 产物的这些特点是由什么决定的?
|
|
30
|
+
|
|
31
|
+
那么接下来首先解释一下 `buildPreset`。
|
|
32
|
+
|
|
33
|
+
## 构建预设
|
|
34
|
+
|
|
35
|
+
`buildPreset` 代表着提前准备好的一组或者多组构建相关的配置,只需要使用 `buildPreset` 对应的预设值,就可以省去麻烦且复杂的配置工作,得到符合预期的产物。
|
|
36
|
+
|
|
37
|
+
### 构建预设的字符串形式
|
|
38
|
+
|
|
39
|
+
**构建预设的值可以是字符串形式**,因此这样形式的构建预设叫做预设字符串。
|
|
40
|
+
|
|
41
|
+
模块工程解决方案根据 npm 包使用的通用场景,提供了通用的构建预设字符串以及相应的变体。目前支持的所有预设字符串可以通过 [BuildPreset API](/zh/api/build-config) 查看。这里讲解一下关于**通用的预设字符串与变体之间的关系**。
|
|
42
|
+
|
|
43
|
+
在通用的预设字符串中,`"npm-library"` 可以用于在开发库类型的 npm 包的场景下使用,它适合大多数普通的模块类型项目。当设置 `"npm-library"` 的时候,项目的输出产物会有以下特点:
|
|
44
|
+
|
|
45
|
+
- 在 `dist/lib` 目录下会得到代码格式为 `cjs`、语法支持到 `es6` 且经过打包处理后的产物。
|
|
46
|
+
- 在 `dist/es` 目录下会得到代码格式为 `esm`、语法支持为 `es6` 且经过打包处理后的产物。
|
|
47
|
+
- 在 `dist/types` 目录下会得到类型文件。如果不是 TypeScript 项目,则没有该目录。
|
|
48
|
+
|
|
49
|
+
而预设字符串 `"npm-library"` 对应的变体则是在原本产物的基础上修改了**代码语法支持**这一特点,同时在字符串命名上也变为了 `"npm-library-[es5 | es2016...es2020 | esnext]"` 这样的形式。
|
|
50
|
+
|
|
51
|
+
例如,如果在预设字符串 `"npm-library"` 对应的输出产物基础上,让产物代码支持的语法变为 `es2017` 的话,那么只需要将 `"npm-library"` 改变为 `"npm-library-es2017"` 就可以了。
|
|
52
|
+
|
|
53
|
+
### 构建预设的函数形式
|
|
54
|
+
|
|
55
|
+
**除了字符串形式以外,构建预设的值也可以是函数形式,在函数中可以打印或者修改某个预设值对应的具体配置**。
|
|
56
|
+
|
|
57
|
+
例如,如果使用预设函数的形式达到预设字符串 `"npm-library-es2017"` 同样的效果,可以按照如下的方式:
|
|
58
|
+
|
|
59
|
+
``` typescript
|
|
60
|
+
import { defineConfig } from "@modern-js/module-tools";
|
|
61
|
+
|
|
62
|
+
export default defineConfig({
|
|
63
|
+
buildPreset({ preset }) {
|
|
64
|
+
return preset.NPM_LIBRARY.map(config => {
|
|
65
|
+
return { ...config, target: 'es2017' };
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
在上面的代码实现中,`preset.NPM_LIBRARY` 与预设字符串 `"npm-library"` 是相对应的,它代表着 `"npm-library"` 等价的多组构建相关的配置。我们通过 `map` 方法遍历了 `NPM_LIBRARY` 这个数组,在这个数组中包含了多个 `buildConfig` 对象。我们将原本的 `buildConfig` 对象进行了浅拷贝并修改了浅拷贝后得到 `buildConfig.target`,将它指定为 `es2017`。
|
|
72
|
+
> 关于 `preset.NPM_LIBRARY` 具体对应的值,可以通过 [BuildPreset API](/zh/api/build-config) 查看。在 `preset` 对象下不仅包含了 `NPM_LIBRARY`,还包含了其他类似的常量。
|
|
73
|
+
|
|
74
|
+
那么这里的 `buildConfig` 对象是什么呢?之前提到的构建产物特点又是根据什么呢?
|
|
75
|
+
|
|
76
|
+
接下来我们解释一下。
|
|
77
|
+
|
|
78
|
+
## 构建配置(对象)
|
|
79
|
+
|
|
80
|
+
**`buildConfig` 是一个用来描述如何编译、生成构建产物的配置对象**。在最开始提到的关于“*构建产物的特点*”,其实都是 `buildConfig` 所支持的属性。目前所支持的属性覆盖了大部分模块类型项目在构建产物时的需求,`buildConfig` 不仅包含一些产物所具备的属性,也包含了构建产物所需要的一些特性功能。接下来从分类的角度简单罗列一下:
|
|
81
|
+
|
|
82
|
+
**构建产物的基本属性包括:**
|
|
83
|
+
|
|
84
|
+
- 产物是否被打包:对应的 API 是 [`buildConfig.buildType`](/zh/api/build-config#buildtype)。
|
|
85
|
+
- 产物对于语法的支持:对应的 API 是 [`buildConfig.target`](/zh/api/build-config#target)。
|
|
86
|
+
- 产物格式:对应的 API 是 [`buildConfig.format`](/zh/api/build-config#format)。
|
|
87
|
+
- 产物类型文件如何处理,对应的 API 是 [`buildConfig.dts`](/zh/api/build-config#dts)。
|
|
88
|
+
- 产物的 sourceMap 如何处理:对应的 API 是 [`buildConfig.sourceMap`](/zh/api/build-config#sourcemap)。
|
|
89
|
+
- 产物对应的输入(或者是源文件):对应的 API 是 [`buildConfig.input`](/zh/api/build-config#input)。
|
|
90
|
+
- 产物输出的目录:对应的 API 是 [`buildConfig.outdir`](/zh/api/build-config#outdir)。
|
|
91
|
+
- 构建的源码目录:对应的 API 是 [`buildConfig.sourceDir`](/zh/api/build-config#sourcedir)。
|
|
92
|
+
|
|
93
|
+
**构建产物所需的常用功能包括:**
|
|
94
|
+
|
|
95
|
+
- 别名:对应的 API 是 [`buildConfig.alias`](/zh/api/build-config#alias)。
|
|
96
|
+
- 静态资源处理:对应的 API 是 [`buildConfig.asset`](/zh/api/build-config#asset)。
|
|
97
|
+
- 第三方依赖处理:对应的 API 有:
|
|
98
|
+
* [`buildConfig.autoExternal`](/zh/api/build-config#autoexternal)。
|
|
99
|
+
* [`buildConfig.externals`](/zh/api/build-config#externals)。
|
|
100
|
+
- 拷贝:对应的 API 是 [`buildConfig.copy`](/zh/api/build-config#copy)。
|
|
101
|
+
- 全局变量替换:对应的 API 是 [`buildConfig.define`](/zh/api/build-config#define)。
|
|
102
|
+
- 指定 [JSX](https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html) 编译方式,对应的 API 是 [`buildConfig.jsx`](/zh/api/build-config#jsx)。
|
|
103
|
+
|
|
104
|
+
**一些高级属性或者使用频率不高的功能:**
|
|
105
|
+
|
|
106
|
+
- 产物代码压缩:对应的 API 是 [`buildConfig.minify`](/zh/api/build-config#minify)。
|
|
107
|
+
- 代码分割:[`buildConfig.spitting`](/zh/api/build-config#splitting)
|
|
108
|
+
- 指定构建产物用于 NodeJS 环境还是浏览器环境:对应的 API 是 [`buildConfig.platform`](/zh/api/build-config#platform)。
|
|
109
|
+
- umd 产物相关:
|
|
110
|
+
* 指定 umd 产物外部导入的全局变量:对应的 API 是 [`buildConfig.umdGlobals`](/zh/api/build-config#umdglobals)。
|
|
111
|
+
* 指定 umd 产物的模块名:对应的 API 是 [`buildConfig.umdModuleName`](/zh/api/build-config#umdmodulename)。
|
|
112
|
+
|
|
113
|
+
除了以上分类以外,关于这些 API 的常见问题和最佳实践可以通过下面的链接来了解,敬请期待。
|
|
114
|
+
* [什么是 `bundle` 和 `bundleless`?](/zh/guide/advance/in-depth-about-build#bundle-和-bundleless)
|
|
115
|
+
* [`input` 与 `sourceDir` 的关系](/zh/guide/advance/in-depth-about-build#input-与-sourcedir-的关系)。
|
|
116
|
+
* [产物中类型文件的多种生成方式](/zh/guide/advance/in-depth-about-build#类型文件)。
|
|
117
|
+
* [`buildConfig.define` 不同场景的使用方式。](/zh/guide/advance/in-depth-about-build#buildconfigdefine-不同场景的使用方式)
|
|
118
|
+
* [如何处理第三方依赖?](/zh/guide/advance/external-dependency)
|
|
119
|
+
* [如何使用拷贝?](/zh/guide/advance/copy)
|
|
120
|
+
* [如何构建 umd 产物?](/zh/guide/advance/build-umd#设置项目的全局变量名称)
|
|
121
|
+
* [静态资源目前所支持的能力。](/zh/guide/advance/asset)
|
|
122
|
+
|
|
123
|
+
## 什么时候使用 `buildConfig`
|
|
124
|
+
|
|
125
|
+
`buildConfig` 是用于修改产物的方式之一,**当与 `buildPreset` 配置同时存在的时候,只有 `buildConfig` 才会生效**。因此如果按照如下方式配置:
|
|
126
|
+
|
|
127
|
+
``` typescript
|
|
128
|
+
import { defineConfig } from '@modern-js/module-tools';
|
|
129
|
+
|
|
130
|
+
export default defineConfig({
|
|
131
|
+
buildConfig: [{}],
|
|
132
|
+
buildPreset: 'base-config',
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
那么此时就会看到如下提示:
|
|
137
|
+
|
|
138
|
+
``` bash
|
|
139
|
+
因为同时出现 'buildConfig' 和 'buildPreset' 配置,因此仅 'buildConfig' 配置生效
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`buildPreset` 代表的一组或者多组构建相关的配置都是由 `buildConfig` 组成,**当使用 `buildPreset` 无法满足当前项目需求的时候,就可以使用 `buildConfig` 来自定义输出产物**。
|
|
143
|
+
|
|
144
|
+
在使用 `buildConfig` 的过程,就是对“*获得怎样的构建产物*”的思考过程。
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# 版本管理与发布
|
|
2
|
+
|
|
3
|
+
一个 npm 类型的模块项目发布流程包含了两个阶段:
|
|
4
|
+
|
|
5
|
+
* 第一阶段是在开发期间,开发者需要提供一个变更文件来记录需要发布的变动;
|
|
6
|
+
* 第二阶段是在发布期间,Module Tools 可以收集所有的变更文件来更新版本、更新发布日志,并发布新的包到 [npm Registry](https://www.npmjs.com/) 上。
|
|
7
|
+
|
|
8
|
+
## 跟踪变更
|
|
9
|
+
|
|
10
|
+
**当项目发生变化的时候需要将变化的内容记录下来**。项目发生的变化一般是指:
|
|
11
|
+
|
|
12
|
+
* 新功能
|
|
13
|
+
* 修复问题
|
|
14
|
+
* 配置文件修改
|
|
15
|
+
* ...
|
|
16
|
+
|
|
17
|
+
当这些变化一旦完成后,需要通过以下命令来对当前的变化进行记录:
|
|
18
|
+
|
|
19
|
+
* [`modern change`](/zh/guide/command-preview#modern-change)
|
|
20
|
+
|
|
21
|
+
执行 `modern change` 命令后会向开发者提出几个问题,并根据开发者的回答生成变更记录。变更记录文件包含了版本变化的类型和其描述,该文件会被提交到 git 仓库中。
|
|
22
|
+
|
|
23
|
+
``` bash
|
|
24
|
+
$ npx modern change
|
|
25
|
+
🦋 What kind of change is this for module-example? (current version is 0.1.0) · patch
|
|
26
|
+
🦋 Please enter a summary for this change (this will be in the changelogs). Submit empty line to open external editor
|
|
27
|
+
🦋 Summary · publish test
|
|
28
|
+
🦋 === Releasing the following packages ===
|
|
29
|
+
🦋 [Patch]
|
|
30
|
+
🦋 module
|
|
31
|
+
🦋 Is this your desired changeset? (Y/n) · true
|
|
32
|
+
🦋 Changeset added! - you can now commit it
|
|
33
|
+
🦋
|
|
34
|
+
🦋 If you want to modify or expand on the changeset summary, you can find it here
|
|
35
|
+
🦋 info /xxxxxx/module/.changeset/brave-dryers-agree.md
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
当执行成功后,生成的包含变更记录的 Markdown 文件会保存在项目的 `.changeset` 目录下面。其内容类似下面这样:
|
|
39
|
+
|
|
40
|
+
``` markdown .changeset/brave-dryers-agree.md
|
|
41
|
+
---
|
|
42
|
+
"module-example": patch
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
publish test
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 版本更新
|
|
49
|
+
|
|
50
|
+
当需要更新项目版本的时候,执行以下命令:
|
|
51
|
+
|
|
52
|
+
* [`modern bump`](/zh/guide/command-preview#modern-bump)
|
|
53
|
+
|
|
54
|
+
执行 `modern bump` 将会基于 `.changeset/` 目录下记录了变更的 Markdown 文件内容来修改 `package.json` 中的版本号,同时生成 `CHANGELOG.md` 文件。**而当版本更新完成后,这些记录变更的 Markdown 文件也会被删除,也可说这些 Markdown 文件被“消耗”掉了**。
|
|
55
|
+
|
|
56
|
+
``` markdown CHANGELOG.md
|
|
57
|
+
# module
|
|
58
|
+
|
|
59
|
+
## 0.1.1
|
|
60
|
+
### Patch Changes
|
|
61
|
+
|
|
62
|
+
- publish test
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 发布
|
|
66
|
+
|
|
67
|
+
发布项目可以执行以下命令:
|
|
68
|
+
|
|
69
|
+
* [`modern publish`](/zh/guide/command-preview#modern-release)
|
|
70
|
+
|
|
71
|
+
`modern release` 命令可以将项目发布到 npm Registry。
|
|
72
|
+
|
|
73
|
+
此时发布的是 `latest` 版本,也可以说是正式版本。如果想要修改 `dist-tag`,可以通过 `modern release --tag` 命令来指定。例如:
|
|
74
|
+
|
|
75
|
+
``` bash
|
|
76
|
+
modern release --tag beta
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
但是如果希望将当前项目的版本号也修改为预发布的版本号,则需要使用 `modern pre` 命令。
|
|
80
|
+
|
|
81
|
+
> 所谓 `dist-tag`,可以理解:为当前发布的版本打标签。一般来说,默认发布的版本对应的 `dist-tag` 为 `latest`,因此可以把 `latest` 认为是正式版本的 `dist-tag`。
|
|
82
|
+
|
|
83
|
+
## 预发布
|
|
84
|
+
|
|
85
|
+
当需要在正式发布之前进行预发布,则需要执行以下命令:
|
|
86
|
+
|
|
87
|
+
* [`modern pre`](/zh/guide/command-preview#modern-pre)
|
|
88
|
+
|
|
89
|
+
首先 `modern pre enter <tag>` 进入预发布模式,`<tag>` 可以与发布项目的时候使用 `modern release --tag` 命令指定的 `tag` 一致。
|
|
90
|
+
|
|
91
|
+
``` bash
|
|
92
|
+
$ npx modern pre enter next
|
|
93
|
+
🦋 success Entered pre mode with tag next
|
|
94
|
+
🦋 info Run `changeset version` to version packages with prerelease versions
|
|
95
|
+
✨ Done in 5.30s.
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
接着可以使用 `modern bump` 命令更新具体的版本号,**此时不会真正的“消耗”记录变更的 Markdown 文件**:
|
|
99
|
+
|
|
100
|
+
``` bash
|
|
101
|
+
$ npx modern bump
|
|
102
|
+
🦋 warn ===============================IMPORTANT!===============================
|
|
103
|
+
🦋 warn You are in prerelease mode
|
|
104
|
+
🦋 warn If you meant to do a normal release you should revert these changes and run `changeset pre exit`
|
|
105
|
+
🦋 warn You can then run `changeset version` again to do a normal release
|
|
106
|
+
🦋 warn ----------------------------------------------------------------------
|
|
107
|
+
🦋 All files have been updated. Review them and commit at your leisure
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
然后可以看到 `package.json` 中更新的版本号会类似这样:`0.1.2-next.0`。
|
|
111
|
+
|
|
112
|
+
最后,**如果不需要再进行预发布,则一定要执行 `modern pre exit` 命令**,这样可以退出预发布状态,并且当再次执行 `modern bump` 命令的时候,就可以发布正式的版本。
|