Skip to content

Commit 92ecfa3

Browse files
committed
feat(server): 默认改为按请求资源打包,整体打包改为可选参数
1 parent 7f5378f commit 92ecfa3

File tree

4 files changed

+233
-105
lines changed

4 files changed

+233
-105
lines changed

lib/commands/server.js

Lines changed: 114 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
3+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
44

55
var connect = require('connect'),
66
fs = require('fs'),
@@ -28,6 +28,8 @@ exports.setOptions = function (optimist) {
2828
optimist.describe('m', '加载项目中间件');
2929
optimist.alias('l', 'livereload');
3030
optimist.describe('l', '自动刷新');
31+
optimist.alias('a', 'all');
32+
optimist.describe('a', '整体编译');
3133
optimist.alias('s', 'https');
3234
optimist.describe('s', '使用https协议');
3335
};
@@ -39,6 +41,7 @@ exports.run = function (options) {
3941
proxy = options.x || options.proxy,
4042
middlewares = options.m || options.middlewares,
4143
isHttps = options.s || options.https,
44+
isCompilingAll = options.a || options.all,
4245
enableLivereload = options.l || options.livereload,
4346
port = options.p || options.port || 80;
4447

@@ -105,6 +108,18 @@ exports.run = function (options) {
105108

106109
if (isGoingToStartServer) {
107110
(function () {
111+
112+
// 监测配置文件变化
113+
var watchConfig = function watchConfig(project, middleware, caches, cacheName) {
114+
var projectConfigFilePath = sysPath.resolve(project.config._config.cwd, project.configFile);
115+
fs.watch(projectConfigFilePath, function (eventType, filename) {
116+
if (eventType === 'change') {
117+
caches[cacheName] = null;
118+
UtilFs.deleteFolderRecursive(project.cachePath);
119+
}
120+
});
121+
};
122+
108123
var middlewareCache = {},
109124
promiseCache = {};
110125

@@ -167,80 +182,122 @@ exports.run = function (options) {
167182
return next();
168183
});
169184

185+
// compiler
170186
var creatingCompiler = false;
171187
app.use(function (req, res, next) {
172188
var url = req.url,
173-
keys = url.split('/');
174-
175-
if (keys[2] == 'prd') {
176-
var _ret2 = function () {
177-
var compiler = void 0,
178-
projectName = keys[1],
179-
projectCwd = sysPath.join(cwd, projectName),
180-
middleware = middlewareCache[projectName],
181-
compilerPromise = promiseCache[projectName];
182-
183-
req.url = '/' + keys.slice(3).join('/').replace(/(\@[\d\w]+)?\.(js|css)/, '.$2');
184-
if (!middleware && !creatingCompiler) {
185-
var _ret3 = function () {
186-
var project = Manager.getProject(projectCwd, { cache: false }),
187-
resolve = void 0,
188-
reject = void 0;
189-
190-
creatingCompiler = true;
191-
compilerPromise = promiseCache[projectName] = new Promise(function (res, rej) {
192-
resolve = res;reject = rej;
193-
});
189+
keys = url.split('/'),
190+
compiler = null,
191+
projectName = keys[1],
192+
projectCwd = sysPath.join(cwd, projectName);
194193

195-
if (project.check()) {
196-
compiler = project.getServerCompiler();
194+
// 处理prd资源
195+
if (keys[2] === 'prd') {
196+
req.url = '/' + keys.slice(3).join('/').replace(/(\@[\d\w]+)?\.(js|css)/, '.$2');
197197

198-
compiler.watch({}, function (err, stats) {
199-
// compiler complete
200-
middleware = middlewareCache[projectName] = webpackDevMiddleware(compiler, {
201-
quiet: true
202-
});
198+
// 只编译所请求的资源
199+
if (!isCompilingAll) {
200+
(function () {
201+
// 去掉版本号和打头的"/"
202+
var urlNoVer = req.url.replace(/@[\d\w]+(?=\.\w+$)/, '');
203+
urlNoVer = urlNoVer[0] === '/' ? urlNoVer.slice(1) : urlNoVer;
203204

204-
// 输出server运行中 error/warning 信息
205-
middleware(req, res, next);
205+
// 从编译cache中取,map文件不必生成重复middleware
206+
var middleware = middlewareCache[urlNoVer.replace('.map', '')];
206207

207-
creatingCompiler = false;
208+
if (!middleware) {
209+
var project = Manager.getProject(projectCwd, { cache: false });
208210

209-
resolve(middleware);
211+
if (project.check()) {
212+
compiler = project.getServerCompiler(function (config) {
213+
var nextConfig = Object.assign({}, config);
214+
Object.keys(config.entry).map(function (entryKey) {
215+
var entryItem = config.entry[entryKey];
216+
217+
var isRequestingEntry = false,
218+
entryPath = '';
219+
220+
if (Array.isArray(entryItem)) {
221+
entryPath = entryItem[entryItem.length - 1];
222+
} else {
223+
entryPath = entryItem;
224+
}
225+
226+
var cssReg = new RegExp(config.entryExtNames.css.join('|'));
227+
entryPath = entryPath.replace(cssReg, '.css'); // 将入口的.scss/.less后缀替换为.css
228+
isRequestingEntry = entryPath.indexOf(urlNoVer) > -1;
229+
230+
if (isRequestingEntry) {
231+
nextConfig.entry = _defineProperty({}, entryKey, entryItem);
232+
}
233+
});
234+
return nextConfig;
210235
});
211236

212-
// 检测config文件变化
213-
var projectConfigFilePath = sysPath.resolve(project.config._config.cwd, project.configFile);
214-
fs.watch(projectConfigFilePath, function (eventType, filename) {
215-
if (eventType === 'change') {
216-
middlewareCache[projectName] = null;
217-
UtilFs.deleteFolderRecursive(project.cachePath);
218-
}
237+
compiler.watch({}, function (err, stats) {
238+
// compiler complete
239+
middleware = middlewareCache[urlNoVer] = webpackDevMiddleware(compiler, { quiet: true });
240+
middleware(req, res, next);
219241
});
242+
// 检测config文件变化
243+
watchConfig(project, middleware, middlewareCache, urlNoVer);
220244
} else {
221245
next();
222-
return {
223-
v: {
224-
v: void 0
225-
}
226-
};
227246
}
228-
}();
229-
230-
if ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === "object") return _ret3.v;
231-
} else {
232-
if (compilerPromise) {
233-
compilerPromise.then(function (middleware) {
234-
middleware(req, res, next);
235-
});
236247
} else {
237-
next();
248+
middleware(req, res, next);
238249
}
239-
}
240-
}();
250+
})();
251+
} else {
252+
(function () {
253+
// 一次编译全部资源
254+
var middleware = middlewareCache[projectName],
255+
compilerPromise = promiseCache[projectName];
256+
257+
if (!middleware && !creatingCompiler) {
258+
(function () {
259+
var project = Manager.getProject(projectCwd, { cache: false }),
260+
resolve = void 0,
261+
reject = void 0;
262+
263+
creatingCompiler = true;
264+
compilerPromise = promiseCache[projectName] = new Promise(function (res, rej) {
265+
resolve = res;reject = rej;
266+
});
267+
268+
if (project.check()) {
269+
compiler = project.getServerCompiler(function (config) {
270+
return config;
271+
});
272+
273+
compiler.watch({}, function (err, stats) {
274+
// compiler complete
275+
middleware = middlewareCache[projectName] = webpackDevMiddleware(compiler, { quiet: true });
241276

242-
if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v;
277+
// 输出server运行中 error/warning 信息
278+
creatingCompiler = false;
279+
middleware(req, res, next);
280+
resolve(middleware);
281+
});
282+
// 检测config文件变化
283+
watchConfig(project, middleware, middlewareCache, projectName);
284+
} else {
285+
next();
286+
}
287+
})();
288+
} else {
289+
if (compilerPromise) {
290+
compilerPromise.then(function (middleware) {
291+
middleware(req, res, next);
292+
});
293+
} else {
294+
next();
295+
}
296+
}
297+
})();
298+
}
243299
} else {
300+
// 非prd资源不做处理
244301
next();
245302
}
246303
});

lib/models/Project.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,13 +347,18 @@ var Project = function () {
347347
}
348348
}, {
349349
key: 'getServerCompiler',
350-
value: function getServerCompiler() {
350+
value: function getServerCompiler(handler) {
351351
var config = this.config.getConfig();
352352
config.output = {
353353
path: '/cache',
354354
filename: '[name][ext]'
355355
};
356356
this.fixCss();
357+
358+
if (handler && typeof handler === 'function') {
359+
config = handler(config);
360+
}
361+
357362
return webpack(config);
358363
}
359364
}, {

0 commit comments

Comments
 (0)