我正在尝试编写一个可以在运行时使用 webpack 动态加载的模块化组件系统。例如,当用户切换选项卡时,显示新选项卡内容的代码应该仅在用户单击该选项卡时加载。
这是完成此操作的一些代码(非常好,我可能会添加):
onrender(){
this.observe("route", (route) => {
if(route.length>0){
this.set("loading", true);
this.get("pages."+route).loadComponent((component) => {
this.components.Page = component.Component;
this.set("loading", false);
});
}
});
},
data: {
pages: {
"#hello": {
name: "Hello",
loadComponent: (callback) => {
require.ensure([], () => {
callback(require("./page_component/hello/hello.js"));
});
}
},
"#world": {
name: "World",
loadComponent: (callback) => {
require.ensure([], () => {
callback(require("./page_component/world/world.js"));
});
}
},
"#activity": {
name: "Individual Activity",
loadComponent: (callback) => {
require.ensure([], () => {
callback(require("./page_component/individual_activity/assets/js/src/main.js"));
});
}
}
}
}
我已经完成了这项工作,但有一个警告。我正在使用 ES6 和 babel-loader 来加载它。包含选项卡的功能、模板、样式等的模块都必须直接包含在应用程序的目录结构中,如下所示(参见:page_components 目录):
├── assets
│ ├── css
│ ├── js
│ │ ├── main.js
│ │ └── page_components
│ │ ├── hello
│ │ ├── individual_activity
│ │ └── world
│ └── templates
│ └── index.html
├── package.json
└── webpack.config.js
我希望每个页面组件都是它自己的包,带有 package.json,并通过例如: 包含在内require("individial_activity")
,用于代码组织。
问题是,webpack 似乎没有node_modules
通过任何加载器运行外部模块(例如通过 包含的模块),因此我在尝试加载 ES6 代码时收到有关意外符号的错误。
我尝试了and之类的东西require("babel-loader!individual_activity")
,require("babel-loader!individual_activity/path/to/main.js")
但无济于事。
我正在尝试做的事情不是正常的做事方式吗?我应该将所有模块的所有代码保存在同一目录结构中吗?我在做一些公然错误的事情吗?
webpack.config.js:
var webpack = require("webpack");
module.exports = {
entry: ['./assets/js/main.js'],
output: {
path: './build',
filename: 'bundle.js'
},
module: {
loaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader'
},
{
test: /\.css$/,
exclude: /node_modules/,
loader: "style-loader!css-loader"
}
]
},
resolve: {
modulesDirectories: ['node_modules', 'bower_components'],
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
dead_code: true,
conditionals: true,
unsafe: false,
warnings: false
},
mangle: false
}),
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en.js/)
]
};
谢谢!