Tôi xây dựng ứng dụng Angular 2 và gói nó với webpack. Hiện tại, ứng dụng của tôi vẫn còn nhỏ nhưng tác vụ webpack đã mất khoảng 10 giây. Có thể tối ưu hóa cấu hình webpack của tôi hoặc các tùy chọn biên dịch TypeSript để cải thiện thời gian biên dịch và đóng gói không?Tối ưu hóa thời gian xây dựng ứng dụng Angular 2 với webpack
Đây là cấu hình webpack tôi sử dụng:
var webpack = require('webpack');
var LiveReloadPlugin = require('webpack-livereload-plugin');
module.exports = {
entry: __dirname + '/assets/app/app.ts',
output: {
filename: 'myApp.bundle.js',
path: __dirname + '/build/'
},
// Turn on sourcemaps
devtool: 'source-map',
resolve: {
extensions: ['.ts', '.js']
},
plugins: [
new LiveReloadPlugin({
appendScriptTag: true
}),
// Fixes angular 2 warning
new webpack.ContextReplacementPlugin(
/angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
__dirname
)
],
module: {
rules: [{
enforce: 'pre',
test: /\.js$/,
loader: "source-map-loader"
},
{
enforce: 'pre',
test: /\.tsx?$/,
use: "ts-loader"
}
]
}
}
Và tsconfig:
{
"compilerOptions": {
"target": "ES5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"pretty": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noUnusedLocals": false,
"removeComments": true,
"skipLibCheck": true,
"strictNullChecks": false,
"baseUrl": "./src",
"typeRoots": ["node_modules/@types"],
"types": [
"core-js",
"systemjs"
],
"outDir": "./build"
},
"exclude": [
"node_modules"
]
}
CẬP NHẬT(xem câu trả lời của tôi cho webpack.config cố định)
Tôi cung cấp cho một thử plugin plugin webpack DLL được đề xuất bởi @ jpwiddy bằng cách biên dịch góc trong một buil riêng biệt d, để chỉ phải xây dựng lại mã ứng dụng trong quá trình phát triển và đạt được thời gian biên dịch đáng kể.
Tuy nhiên, sau khi kiểm tra JS đầu ra, kích thước tệp là hoàn toàn giống nhau và vẫn còn mã góc bên trong.
Đây là mới tập webpack cấu hình cho các nguồn góc:
var webpack = require('webpack');
module.exports = {
entry: {
angular:[
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/core',
'@angular/common',
'@angular/compiler',
'@angular/http',
'@angular/router',
'@angular/forms'
]
},
output: {
filename: 'ng2.dll.js',
path: __dirname + '/build/',
library: 'ng2'
},
plugins: [
// Fixes angular 2 warning
new webpack.ContextReplacementPlugin(
/angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
__dirname
),
new webpack.DllPlugin({
name: 'ng2',
path: __dirname + '/build/ng2.json'
})
]
}
Và cấu hình webpack cập nhật cho ứng dụng:
var webpack = require('webpack');
var LiveReloadPlugin = require('webpack-livereload-plugin');
module.exports = {
entry: __dirname + '/assets/app/app.ts',
output: {
filename: 'myApp.bundle.js',
path: __dirname + '/build/'
},
// Turn on sourcemaps
devtool: 'source-map',
resolve: {
extensions: ['.ts', '.js']
},
plugins: [
new LiveReloadPlugin({
appendScriptTag: true
}),
// Fixes angular 2 warning
new webpack.ContextReplacementPlugin(
/angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/,
__dirname
),
new webpack.DllReferencePlugin({
context: __dirname + '/build/',
manifest: require(__dirname + '/build/ng2.json')
})
],
module: {
rules: [{
enforce: 'pre',
test: /\.js$/,
loader: "source-map-loader"
},
{
enforce: 'pre',
test: /\.tsx?$/,
use: "ts-loader"
}
]
}
}
Đây là một trong những mã góc tôi tìm thấy trong ứng dụng của tôi JS đầu ra:
_TsEmitterVisitor.prototype.visitBuiltintType = function (type, ctx) {
var typeStr;
switch (type.name) {
case __WEBPACK_IMPORTED_MODULE_2__output_ast__["R" /* BuiltinTypeName */].Bool:
typeStr = 'boolean';
break;
case __WEBPACK_IMPORTED_MODULE_2__output_ast__["R" /* BuiltinTypeName */].Dynamic:
typeStr = 'any';
break;
case __WEBPACK_IMPORTED_MODULE_2__output_ast__["R" /* BuiltinTypeName */].Function:
typeStr = 'Function';
break;
case __WEBPACK_IMPORTED_MODULE_2__output_ast__["R" /* BuiltinTypeName */].Number:
typeStr = 'number';
break;
case __WEBPACK_IMPORTED_MODULE_2__output_ast__["R" /* BuiltinTypeName */].Int:
typeStr = 'number';
break;
case __WEBPACK_IMPORTED_MODULE_2__output_ast__["R" /* BuiltinTypeName */].String:
typeStr = 'string';
break;
default:
throw new Error("Unsupported builtin type " + type.name);
}
ctx.print(typeStr);
return null;
};
Tôi đã bỏ lỡ điều gì đó trong cấu hình mới để ngăn chặn w ebpack bao gồm các nguồn góc trong đầu ra?
Cảm ơn bạn
[commons-đoạn-plugin] (https://webpack.js.org/plugins/commons-chunk-plugin/) cũng có thể giúp đỡ. Kiểm tra cấu hình của [angular2-webpack-brief-starter] (https://github.com/dominik791/angular2-webpack-brief-starter/blob/master/webpack.dev.js) để xem cách bạn có thể sử dụng nó cho tất cả các tệp của nhà cung cấp (bao gồm cả góc). – dominik791