Webpack ProvidePlugin/vendor bundle: angular.模块不是一个函数
Webpack ProvidePlugin/vendor bundle: angular.module is not a function
我有一个Angular应用,它目前是通过Webpack构建成一个大bundle的,它把所有依赖项和应用代码都包含在一个文件中。我试图将代码分成两个包,一个包包含我所有的依赖项,另一个包包含我所有的应用程序代码。
我有以下webpack.config.js:
var webpack = require('webpack');
var path = require('path');
var definePlugin = new webpack.DefinePlugin({
'process.env': {
NODE_ENV: `"${process.env.NODE_ENV}"`
}
});
var SRC = path.resolve(__dirname, 'src/main/client');
var APP = path.resolve(SRC, 'app/index.js');
var DEST = path.resolve(__dirname, 'target/webapp/dist');
module.exports = {
entry: {
vendor: [
'angular',
'angular-animate',
'moment',
'angular-moment',
'angular-translate',
'angular-ui-bootstrap',
'angular-ui-router',
'lodash'
],
app: APP
},
plugins: [
new webpack.ProvidePlugin({
_: 'lodash',
angular: 'angular',
angularMoment: 'angular-moment',
angularTranslate: 'angular-translate',
moment: 'moment',
ngAnimate: 'angular-animate',
uibootstrap: 'angular-ui-bootstrap',
uirouter: 'angular-ui-router'
}),
new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.bundle.js'),
definePlugin
],
output: {
path: DEST,
filename: 'bundle.js',
publicPath: '/',
hash: true
},
module: {
preLoaders: [],
loaders: [
{ test: /'.html$/, loaders: ['html'] },
{ test: /'.css$/, loaders: ['style', 'css'] },
{ test: /'.scss$/, loaders: ['style', 'css', 'sass'] },
{
test: /'.js$/,
exclude: /(node_modules|bower_components)/,
loaders: ['ng-annotate', 'babel?presets[]=es2015', 'eslint']
},
{
test: /'.(ttf|eot|svg|woff2?)('?v=[0-9]'.[0-9]'.[0-9])?$/,
loader: 'file'
}
]
},
sassLoader: {
includePaths: [path.resolve(__dirname, './node_modules')]
}
};
这会生成两个包,一个只包含依赖项,另一个只包含应用程序代码。但是,当我尝试加载应用程序时,我得到:Uncaught TypeError: angular.module is not a function
,它可以追溯到vendor.bundle.js
中的angular-moment.js
。换句话说,需要在vendor.bundle.js
文件中加载的其他模块无法访问angular
。但是,我不确定如何使这些依赖对彼此可见。
要回答原文章标题中的问题,如果没有shim, Angular 1不能很好地与webpack一起工作(参见https://github.com/webpack/webpack/issues/2049)。试试这个webpack加载器config:
module: {
loaders: [
/*
* Necessary to be able to use angular 1 with webpack as explained in https://github.com/webpack/webpack/issues/2049
*/
{
test: require.resolve('angular'),
loader: 'exports?window.angular'
},
]
},
plugins: [
new webpack.ProvidePlugin({
'angular': 'angular',
}),
],
这应该正确地初始化angular对象,而不是默认的将其设置为一个空对象(它没有名为module的属性)。
下面应该把所有不在src文件夹中的脚本移动到供应商块中。
const path = require('path');
const projectRoot = path.resolve('./');
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: (module) => module.resource && module.resource.indexOf(path.join(projectRoot, 'src')) === -1,
}),
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 我可以在json对象中添加一个函数吗
- Javascript使函数一个接一个地执行
- 是JavaScript中的函数一个对象
- 两个几乎相等的jQuery函数;一个适用于IE,一个不适用于IE
- 两个Javascript函数一个window.onload=Custom.init;和一个window.onload=f
- 使javascript加载函数一个接一个地执行
- 如何通过两个嵌套的匿名函数(一个带有超时的事件处理程序)传递变量
- 为什么我不能让两个jQuery函数一个在另一个里面呢?
- 给函数一个变量名,而不是它的值
- 如何使用嵌入函数(一个滚动页由Pete - peachananr)
- 是否有可能给JavaScript函数一个类型/类?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- 两个不同的ajax函数一个接一个调用返回相同的值
- jQuery第一次更改函数一个工作
- 给这个函数一个id
- 如何给回调函数一个值一个变量在特定时刻
- 使用回调使两个函数一个接一个地运行
- 两个函数(一个用php)是否可以用“;onclick”;
- 两个几乎相同的函数.一个函数用Queue进行排队.Jquery效果在queued函数上不起作用.为什么