Webpack Angular 代码拆分
Webpack Angular Code Splitting
我目前有一个这样设置的项目: 因为 angular material 对我的项目来说是一个很大的下载,所以白屏会持续加载大约 45 秒。我正在尝试进行一些代码拆分以使我的应用程序加载速度更快,但出现错误。代码拆分似乎对我不起作用。
core/app.module.js
'use strict';
require.ensure([], function (require) {
require('angular/angular.min');
require('angular-aria/angular-aria.min');
require('angular-animate/angular-animate.min');
require('angular-ui-router/release/angular-ui-router.min');
}, 'common');
var page1Module = require('./../page1/page1.module');
var page2Module = require('./../page2/page2.module');
var appRunBlock = require('./app.run');
var appConfig = require('./app.config');
var moduleName = 'app';
var app = angular.module(moduleName, [
'ui.router',
page1Module,
page2Module
])
.config(appConfig)
.run(appRunBlock);
module.exports = moduleName;
page1/page1.module.js
'use strict';
require.ensure([], function (require) {
require('angular-material/modules/js/core/core.min.js');
require('angular-material/modules/js/core/core.min.css');
require('angular-material/modules/js/core/default-theme.js');
require('angular-material/modules/js/button/button.min.js');
require('angular-material/modules/js/button/button.min.css');
}, 'page1');
var page1Route = require('./page1.route');
var page1Controller = require('./page1.controller');
var moduleName = 'app.page1';
angular.module(moduleName, [
'material.components.button'
])
.config(page1Route)
.controller('Page1Controller', page1Controller);
module.exports = moduleName;
page2/page2.module.js
'use strict';
require.ensure([], function (require) {
require('angular-material/modules/js/core/core.min.js');
require.include('angular-material/modules/js/core/core.min.css');
require.include('angular-material/modules/js/core/default-theme.js');
require('angular-material/modules/js/toolbar/toolbar.min.js');
require('angular-material/modules/js/toolbar/toolbar.min.css');
require('angular-material/modules/js/content/content.min.js');
require('angular-material/modules/js/content/content.min.css');
require('angular-material/modules/js/input/input.min.js');
require('angular-material/modules/js/input/input.min.css');
}, 'page2');
var page2Route = require('./page2.route');
var page2Controller = require('./page2.controller');
var moduleName = 'app.page2';
angular.module(moduleName, [
'material.components.toolbar',
'material.components.content',
'material.components.input'
])
.config(page2Route)
.controller('Page2Controller', page2Controller);
module.exports = moduleName;
我有这个webpack.config.js
var webpack = require('webpack');
var CopyWebpackPlugin = require('copy-webpack-plugin');
var path = require('path');
var webpack_config = {
context: path.join(__dirname + '/app'),
entry: {
app: './core/app.module.js'
},
output: {
path: path.join(__dirname + '/release'),
publicPath: 'http://localhost:8080/',
filename: '/js/[name].js',
chunkFilename: '/js/[name].js'
},
module: {
loaders: [
{
test: /\.css$/,
exclude: 'node_modules',
loader: 'style!css'
},
{
test: /\.scss$/,
exclude: 'node_modules',
loader: 'style!css!sass'
},
{
test: /\.html$/,
exclude: 'node_modules',
loader: 'ngtemplate?relativeTo=' + (path.join(__dirname, './app')) + '/!html?' +
JSON.stringify({attrs: ['img:src', 'img:ng-src', 'md-icon:md-svg-src']})
}
]
},
plugins: [
new CopyWebpackPlugin([
{from: './index.html', to: './index.html'}
])
],
devServer: {
contentBase: path.resolve('./release')
},
watch: true
};
module.exports = webpack_config;
我曾尝试在 require.ensure 中使用 require.include 来加载我需要的文件,但它不起作用。我已将我的库路径放在 require.ensure([]) 数组中,但它不起作用。
如果我在 webpack.config.js 中放入第二个条目并将我的所有库放在一个名为 'vendor' 的公共块中,或者如果我使用 require() 而不是 require.ensure ().
加载我的 angular material 库大约需要 1.5 MB,大约需要 30 秒或 1 米。当应用程序加载时,它会出现白屏,直到所有库都加载完毕。这就是我需要代码拆分的原因。我正在使用 webpack-dev-server 并抛出以下错误
请帮忙。
看来我需要使用 ocLazyLoading 来动态加载模块。我还了解到,当您想要加载模块、模板或库时,您需要知道位置和触发器。在我的例子中,我需要在路径上使用 ocLazyLoading 加载我的模块。
我目前有一个这样设置的项目:
core/app.module.js
'use strict';
require.ensure([], function (require) {
require('angular/angular.min');
require('angular-aria/angular-aria.min');
require('angular-animate/angular-animate.min');
require('angular-ui-router/release/angular-ui-router.min');
}, 'common');
var page1Module = require('./../page1/page1.module');
var page2Module = require('./../page2/page2.module');
var appRunBlock = require('./app.run');
var appConfig = require('./app.config');
var moduleName = 'app';
var app = angular.module(moduleName, [
'ui.router',
page1Module,
page2Module
])
.config(appConfig)
.run(appRunBlock);
module.exports = moduleName;
page1/page1.module.js
'use strict';
require.ensure([], function (require) {
require('angular-material/modules/js/core/core.min.js');
require('angular-material/modules/js/core/core.min.css');
require('angular-material/modules/js/core/default-theme.js');
require('angular-material/modules/js/button/button.min.js');
require('angular-material/modules/js/button/button.min.css');
}, 'page1');
var page1Route = require('./page1.route');
var page1Controller = require('./page1.controller');
var moduleName = 'app.page1';
angular.module(moduleName, [
'material.components.button'
])
.config(page1Route)
.controller('Page1Controller', page1Controller);
module.exports = moduleName;
page2/page2.module.js
'use strict';
require.ensure([], function (require) {
require('angular-material/modules/js/core/core.min.js');
require.include('angular-material/modules/js/core/core.min.css');
require.include('angular-material/modules/js/core/default-theme.js');
require('angular-material/modules/js/toolbar/toolbar.min.js');
require('angular-material/modules/js/toolbar/toolbar.min.css');
require('angular-material/modules/js/content/content.min.js');
require('angular-material/modules/js/content/content.min.css');
require('angular-material/modules/js/input/input.min.js');
require('angular-material/modules/js/input/input.min.css');
}, 'page2');
var page2Route = require('./page2.route');
var page2Controller = require('./page2.controller');
var moduleName = 'app.page2';
angular.module(moduleName, [
'material.components.toolbar',
'material.components.content',
'material.components.input'
])
.config(page2Route)
.controller('Page2Controller', page2Controller);
module.exports = moduleName;
我有这个webpack.config.js
var webpack = require('webpack');
var CopyWebpackPlugin = require('copy-webpack-plugin');
var path = require('path');
var webpack_config = {
context: path.join(__dirname + '/app'),
entry: {
app: './core/app.module.js'
},
output: {
path: path.join(__dirname + '/release'),
publicPath: 'http://localhost:8080/',
filename: '/js/[name].js',
chunkFilename: '/js/[name].js'
},
module: {
loaders: [
{
test: /\.css$/,
exclude: 'node_modules',
loader: 'style!css'
},
{
test: /\.scss$/,
exclude: 'node_modules',
loader: 'style!css!sass'
},
{
test: /\.html$/,
exclude: 'node_modules',
loader: 'ngtemplate?relativeTo=' + (path.join(__dirname, './app')) + '/!html?' +
JSON.stringify({attrs: ['img:src', 'img:ng-src', 'md-icon:md-svg-src']})
}
]
},
plugins: [
new CopyWebpackPlugin([
{from: './index.html', to: './index.html'}
])
],
devServer: {
contentBase: path.resolve('./release')
},
watch: true
};
module.exports = webpack_config;
我曾尝试在 require.ensure 中使用 require.include 来加载我需要的文件,但它不起作用。我已将我的库路径放在 require.ensure([]) 数组中,但它不起作用。
如果我在 webpack.config.js 中放入第二个条目并将我的所有库放在一个名为 'vendor' 的公共块中,或者如果我使用 require() 而不是 require.ensure ().
加载我的 angular material 库大约需要 1.5 MB,大约需要 30 秒或 1 米。当应用程序加载时,它会出现白屏,直到所有库都加载完毕。这就是我需要代码拆分的原因。我正在使用 webpack-dev-server 并抛出以下错误
请帮忙。
看来我需要使用 ocLazyLoading 来动态加载模块。我还了解到,当您想要加载模块、模板或库时,您需要知道位置和触发器。在我的例子中,我需要在路径上使用 ocLazyLoading 加载我的模块。