UNPKG

12 kBJavaScriptView Raw
1"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.config = exports.validate = exports.defaultOptions = void 0;
2var _joi = _interopRequireDefault(require("@hapi/joi"));
3var _fs = _interopRequireDefault(require("fs"));
4var _path = _interopRequireDefault(require("path"));
5var _extend = _interopRequireDefault(require("./utils/extend"));
6var _core = require("./core");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
7const cwd = process.cwd();
8
9let { pluginScheme, pluginDefaultOptions } = (0, _core.initOptions)();
10
11const scheme = {
12 env: _joi.default.object({
13 /**
14 * 定义浏览器环境,babel-preset-env 插件使用的环境
15 * browsers {Array<string> | string} 浏览器支持
16 * 或者 {
17 * debug: {Array<string> | string}, 浏览器支持
18 * publish: {Array<string> | string} 浏览器支持
19 * }
20 * https://github.com/ai/browserslist http://browserl.ist/
21 */
22 browsers: _joi.default.alternatives().try(
23 _joi.default.string(),
24 _joi.default.array(),
25 _joi.default.object({
26 debug: _joi.default.alternatives().try(
27 _joi.default.string(),
28 _joi.default.array()),
29
30 publish: _joi.default.alternatives().try(
31 _joi.default.string(),
32 _joi.default.array()) })) }),
33
34
35
36
37 /**
38 * 所有页面入口等配置
39 * 当 pages 是函数时,表示生成所有页面入口的函数
40 * @param {String} 用于过滤的字符串
41 * @return Object {
42 * index: {
43 * // page 的入口
44 * entry: './src/index',
45 * entryCode: '', // 标准js模块代码,没有配置entry时,配置此项可代替入口文件
46 * serverEntry: './src/index.server', //ssr 不能独立于终端的 entry 存在,因此,每一个终端入口 +.server 的方式命名的 js 文件都是此页面的ssr方式的入口
47 * · serverEntryCode: '', // 标准js模块代码,符合server端入口要求,没有配置serverEntry时,配置此项可代替入口文件
48 * // 模板来源
49 * template: 'src/index.html',
50 * inlineSource: '.css|js$', // embed all javascript and css inline
51 * // 在 dist/index.html 的输出
52 * filename: './hindex.html',
53 * // 当使用 title 选项时,
54 * // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
55 * title: 'Index Page',
56 * // 在这个页面中包含的块,默认情况下会包含
57 * // 提取出来的通用 common, manifest
58 * chunks: ['common', 'manifest', 'index']
59 * },
60 * // 当使用只有入口的字符串 ${pagename}: ${entry} 格式时,
61 * // serverEntry: ${entry}.server 如果 ${entry} 以 .js 结尾,去掉 .js, 如果没有,为非同构页面
62 * // template 查找规则:
63 * // 用户配置存在,无论对错,直接返回
64 * // 用户配置不存在,先查找入口文件同级路径下的 index.html
65 * // 然后,逐级查找父文件夹中的 index-default.html
66 * // 直到入口文件配置的根文件夹
67 * // 例如: 入口是 src/pages/pagegroup/item2
68 * // 会依次查找
69 * // src/pages/pagegroup/item2/index.html
70 * // src/pages/pagegroup/index-default.html
71 * // src/pages/index-default.html
72 * // src/index-default.html
73 * // 如果都不存在,使用tua自带模板 filename: ${pagename}.html
74 * sports: './src/sports'
75 * }
76 *
77 * 当pages是字符串时,代表 pages 的根文件夹,这时,遍历文件夹,含有 index.js 的文件夹就是页面,模板查找方式同上
78 */
79 pages: _joi.default.alternatives().try(
80 _joi.default.string(),
81 _joi.default.func()),
82 //TODO:return
83 dll: _joi.default.object({
84 chunks: _joi.default.object() }),
85
86 /**
87 * 打包输出文件夹
88 * TODO:配置打包输出的路径
89 */
90 dist: _joi.default.string().default('./dist'),
91 assertLimit: _joi.default.number(),
92 serverUrl: _joi.default.string(),
93 /**
94 * 启动服务器成功后浏览器打开地址
95 * 以http和https开头的会被直接打开,否则,路径会被拼接在默认启动的服务后
96 * 如下,拼接后的路径为 http://localhost:[端口号]/pathname
97 * {
98 * pathname: {pathname}
99 * app: {browser|[browserList]}
100 * }
101 */
102 open: _joi.default.alternatives().try(
103 _joi.default.boolean(),
104 _joi.default.object({
105 pathname: _joi.default.string(),
106 app: _joi.default.alternatives(
107 _joi.default.string(),
108 _joi.default.array()) })),
109
110
111
112 devServer: _joi.default.object({
113 //如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用。
114 proxy: _joi.default.object(),
115 port: _joi.default.number(),
116 serverPort: _joi.default.number(),
117 localhost: _joi.default.string(),
118 defaultParams: _joi.default.array().items(_joi.default.array().length(2)) }),
119
120 resolve: _joi.default.object({
121 /**
122 * 别名配置,可以配置短路径和文件
123 * eg. "jquery" : require("./lib/jquery")
124 */
125 alias: _joi.default.object() }),
126
127 /**
128 * loader 和 plugin 的耗时统计,使用 webpackbar 的统计
129 */
130 compileProfile: _joi.default.boolean(),
131 /**
132 * 为某些模块配置全局变量
133 * eg: $: 'jquery'
134 */
135 globalVar: _joi.default.object(),
136 chainClientConf: _joi.default.func(),
137 chainServerConf: _joi.default.func(),
138 plugins: _joi.default.array(),
139 disableMd5: _joi.default.boolean(),
140 ...(pluginScheme || {}) };
141
142
143const defaultOptions = {
144 /**
145 * 配置最终程序要运行的环境,会根据环境打包文件。
146 */
147 env: {
148 /**
149 * 定义浏览器环境,babel-preset-env 插件使用的环境
150 * browsers {Array<string> | string} 浏览器支持
151 * 或者 {
152 * debug: {Array<string> | string}, 浏览器支持
153 * publish: {Array<string> | string} 浏览器支持
154 * }
155 * https://github.com/ai/browserslist http://browserl.ist/
156 * 默认在 debug 阶段只兼容 chrome 的最新两个版本,加快编译速度
157 * 发布阶段兼容情况,
158 * 1. 浏览器最近两个版本
159 * 2. ie9及以上
160 * 3. android 4以上
161 * 4. iOS 7以上
162 *
163 */
164
165 browsers: {
166 debug: 'last 2 Chrome versions',
167 publish: ['last 2 versions', 'not ie <= 8', 'Android > 4', 'iOS > 7'] } },
168
169
170 /**
171 * 打包输出文件夹
172 * TODO:配置打包输出的路径
173 */
174 dist: './dist',
175 /**
176 * 资源阀值,小于这个值的都会被base64到代码中
177 */
178 assertLimit: 10000,
179 /**
180 * 执行打包到 toserver 时,静态资源会上传至cdn,此为静态资源文件夹地址
181 */
182 serverUrl: "https://tua.oa.com",
183 /**
184 * 启动服务器成功后浏览器打开地址
185 * 以http和https开头的会被直接打开,否则,路径会被拼接在默认启动的服务后
186 * 如下,拼接后的路径为 http://localhost:[端口号]/pathname
187 * {
188 * pathname: {pathname}
189 * app: {browser|[browserList]}
190 * }
191 */
192 open: false,
193 /**
194 * 如果你有单独的后端开发服务器 API,并且希望在同域名下发送 API 请求 ,那么代理某些 URL 会很有用。
195 */
196 devServer: {
197 port: 9527,
198 serverPort: 9528 },
199
200 resolve: {
201 /**
202 * 别名配置,可以配置短路径和文件
203 * eg. "jquery" : require("./lib/jquery")
204 */
205 alias: {
206 // "jquery" : require("./lib/jquery")
207 } },
208
209 compileProfile: false,
210 /**
211 * 为某些模块配置全局变量
212 * eg: $: 'jquery'
213 */
214 globalVar: {},
215 dll: {
216 chunks: {} },
217
218 chainClientConf: function (clientConf) {
219 // console.log(clientConf.toString())
220 },
221 chainServerConf: function (serverConf) {
222 // console.log(serverConf.toString())
223 },
224 plugins: [],
225 /**
226 * 默认使用文件的content md5hash 作为文件名的 chunkhash
227 * 但会增加输出阶段的处理时间
228 * 如果没有使用的必要,可以通过此选项关闭 md5hash
229 */
230 disableMd5: false,
231 ...(pluginDefaultOptions || {}) };exports.defaultOptions = defaultOptions;
232
233
234let tuarcPath = _path.default.resolve(cwd, './.tuarc');
235let config = {};exports.config = config;
236let tuarcConf = {};
237
238if (_fs.default.existsSync(tuarcPath)) {
239 tuarcConf = require(tuarcPath);
240}
241
242exports.config = config = (0, _extend.default)(true, defaultOptions, tuarcConf);
243
244const validate = () => {
245 _joi.default.validate(config, scheme, (err, value) => {
246 if (err !== null) {
247 console.error(err);
248 process.exit();
249 }
250 });
251};exports.validate = validate;
\No newline at end of file