1 | # marax
|
2 |
|
3 | [![npm](https://img.shields.io/npm/v/@mara/x.svg)](https://www.npmjs.com/package/@mara/x)
|
4 |
|
5 | 支持 React / Vue + Ts 的多页应用打包工具。
|
6 |
|
7 | **灵感**
|
8 | 站在巨人的肩膀上。`marax` 受众多开源项目启发,持续跟进并融合了 [create-react-app](https://github.com/facebook/create-react-app) 及 [vue-cli](https://github.com/vuejs/vue-cli) 的核心配置,旨在为 React/Vue/Js/Ts 等不同技术栈项目提供**一致性**的构建流程与**开箱即用**的开发体验。
|
9 |
|
10 | ## 安装
|
11 |
|
12 | > 依赖 Node.js 8.10.0+
|
13 |
|
14 | 推荐使用 marax 配套的项目生成工具 [@mara/create](https://www.npmjs.com/package/@mara/create) 创建项目
|
15 |
|
16 | ```bash
|
17 | npx @mara/create my-app
|
18 | ```
|
19 |
|
20 | ### 手动安装
|
21 |
|
22 | 也可以在现有项目中手动安装 @mara/x
|
23 |
|
24 | ```bash
|
25 | yarn add @mara/x -D
|
26 | ```
|
27 |
|
28 | ### 配置 npm script
|
29 |
|
30 | `package.json` 中配置 npm-script
|
31 |
|
32 | ```bash
|
33 | "scripts": {
|
34 | "dev": "marax dev",
|
35 | "build": "marax build"
|
36 | },
|
37 | ...
|
38 | ```
|
39 |
|
40 | ## 命令
|
41 |
|
42 | marax 提供开箱即用的多页应用打包服务,在 marax 中**页面**又称为**视图(view)**,存放于 `src/views` 目录下。
|
43 |
|
44 | 我们约定,一个典型的**页面**应至少包含一个 `index.html` 文件和一个 `index.js` 文件。
|
45 |
|
46 | 一个项目应至少含有一个页面。
|
47 |
|
48 | ### 启动开发环境
|
49 |
|
50 | 运行开发命令在本地启动一个开发服务器,默认端口号 `3022`。
|
51 |
|
52 | ```bash
|
53 | npm run dev [view_name]
|
54 | ```
|
55 |
|
56 | 当 views 下存在多个页面时,dev 命令需指定页面名(view_name),缺省情况下将进入交互模式进行选择。
|
57 | 当只有一个页面时页面名可省略。
|
58 |
|
59 | 示例:
|
60 |
|
61 | ```bash
|
62 | # 在 index 页面下开发
|
63 | npm run dev index
|
64 | ```
|
65 |
|
66 | ### 打包项目
|
67 |
|
68 | 打包页面,将在 `dist/<view_name>` 目录下输出构建结果
|
69 |
|
70 | ```bash
|
71 | npm run build [view_name]
|
72 | ```
|
73 |
|
74 | 当 views 下存在多个页面时,需显式指定或交互式选择页面名。单页时页面名可省略。
|
75 |
|
76 | 示例:
|
77 |
|
78 | ```bash
|
79 | # 打包 index 页面
|
80 | npm run build index
|
81 | ```
|
82 |
|
83 | #### FTP 上传
|
84 |
|
85 | 在 build 模式下可配置使用 ftp 上传功能,需在项目根目录创建 `marauder.config.js` 文件,并注册 ftp 账号信息。
|
86 |
|
87 | 通过 `--ftp` 参数指定将打包结果上传 ftp。为方便多分支测试,当传递 `branch_name` 值时,将创建 branch 文件夹作路径隔离。
|
88 |
|
89 | ```bash
|
90 | npm run build [view_name] --ftp [branch_name]
|
91 | ```
|
92 |
|
93 | 示例:
|
94 |
|
95 | ```bash
|
96 | # 打包 index 页面,并上传至测试地址
|
97 | npm run build index --ftp
|
98 |
|
99 | # 打包 index 页面,并通过上传至测试地址下的 feed_feature 文件夹中
|
100 | npm run build index --ftp feed_feature
|
101 | ```
|
102 |
|
103 | #### Test 发布\*
|
104 |
|
105 | 使用 Test 发布功能,需在 `marauder.config.js` 中注册 gitlab privateToken 信息。
|
106 |
|
107 | 在 `build` 命令基础上,可通过添加 `--test` 参数发布到测试环境。
|
108 |
|
109 | ```bash
|
110 | npm run build [view_name] --test [tag_message]
|
111 | ```
|
112 |
|
113 | ### 打包 dll 文件
|
114 |
|
115 | `marauder.config.js` 中配置 `vendor` 信息
|
116 |
|
117 | ```
|
118 | vendor: ['react', 'react-router']
|
119 | ```
|
120 |
|
121 | 运行 `dll` 命令生成公共资源包,执行结果将会输出到 `dist/vendor` 文件夹下
|
122 |
|
123 | ```bash
|
124 | npm run dll
|
125 |
|
126 | # 打包 dll 文件,并上传至文件服务器
|
127 | npm run dll --ftp
|
128 | ```
|
129 |
|
130 | ### 打包组件
|
131 |
|
132 | `marax` 除了支持项目打包外,也可作为组件打包工具。
|
133 |
|
134 | 在工程 `src` 文件夹中创建 `index.js` 文件作为组件入口
|
135 |
|
136 | npm-script 中配置
|
137 |
|
138 | ```json
|
139 | "build": "marax lib"
|
140 | ```
|
141 |
|
142 | 打包
|
143 |
|
144 | ```bash
|
145 | npm run build
|
146 | ```
|
147 |
|
148 | 打包后文件将在 `lib` 目录中输出构建结果
|
149 |
|
150 | 此外还可指定 `--all` 参数来打包 demo
|
151 |
|
152 | ```bash
|
153 | npm run build -- --all
|
154 | ```
|
155 |
|
156 | ## 教程
|
157 |
|
158 | ### 代码分割
|
159 |
|
160 | #### 动态代码分割
|
161 |
|
162 | 使用动态 import 方法生成动态 chunk 包
|
163 |
|
164 | ```javascript
|
165 | import('./my-module.js').then(module => {
|
166 | // Do something with the module.
|
167 | })
|
168 | ```
|
169 |
|
170 | 这种使用方式也支持 await 关键字。
|
171 |
|
172 | ```javascript
|
173 | let module = await import('/modules/my-module.js')
|
174 | ```
|
175 |
|
176 | #### 静态代码分割
|
177 |
|
178 | 此功能可零配置启用,凡是在 `views/<view_name>/` 下符合命名约定 `index.<chunk_name>.js` 的文件均会被视为 `chunk` 包拆分,拆分后的 bundle 文件以 `<chunk_name>.servant.js` 命名,这里称之为 `servant` 包。
|
179 |
|
180 | 其中 `chunk_name` 为拆分入口的名称,例如 `index.foo.js` 构建后将生成 `foo.servant.js`
|
181 |
|
182 | `<chunk_name>.servant.js` 文件将只会在生产环境(build)生成,在开发环境(dev)中,所有的 servant 将合并到 entry 中引入。对于使用者来说一切都是无感知的。
|
183 |
|
184 | **注意**
|
185 | 由于 entry bundle 中已经包含 `polyfill`(Promise,Object.assign),为了避免打包不必要冗余,通过此方式拆分出的 servant 包将不包含 polyfill 内容。为安全起见,建议将 servant 包置于 entry 之后引入(除非您清楚 servant 中不会触发兼容性问题),这也是取名为 `servant` 的本意。`webpack-marauder` 已为您默认配置好一切。
|
186 |
|
187 | #### 打包 vendor
|
188 |
|
189 | 默认的,marax 会自动拆分 vendor 包。
|