1 | Object.defineProperty(exports, "__esModule", { value: true });exports.config = exports.validate = exports.defaultOptions = void 0;
; |
2 | var _joi = _interopRequireDefault(require("@hapi/joi"));
|
3 | var _fs = _interopRequireDefault(require("fs"));
|
4 | var _path = _interopRequireDefault(require("path"));
|
5 | var _extend = _interopRequireDefault(require("./utils/extend"));
|
6 | var _core = require("./core");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
|
7 | const cwd = process.cwd();
|
8 |
|
9 | let { pluginScheme, pluginDefaultOptions } = (0, _core.initOptions)();
|
10 |
|
11 | const 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 |
|
143 | const 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 |
|
234 | let tuarcPath = _path.default.resolve(cwd, './.tuarc');
|
235 | let config = {};exports.config = config;
|
236 | let tuarcConf = {};
|
237 |
|
238 | if (_fs.default.existsSync(tuarcPath)) {
|
239 | tuarcConf = require(tuarcPath);
|
240 | }
|
241 |
|
242 | exports.config = config = (0, _extend.default)(true, defaultOptions, tuarcConf);
|
243 |
|
244 | const 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 |