为什么require(“angular”)返回一个空对象

时间:2016-02-23 07:16:38

标签: javascript angularjs webpack

我已经像这样配置了webpack:

resolve: {
    alias: {
        angular: path.join(__dirname, './node_modules/angular/angular.js')
    }
},

在我的文件中我需要像这样的角度:

var angular = require("angular");

但由于某种原因,返回一个空对象,为什么?

4 个答案:

答案 0 :(得分:4)

其他答案都不准确 - 核心angular.js文件不支持CommonJS,但是如果你从NPM安装它,那么一个很小的包装文件叫做提供了index.js。它实际上只有两行:

require('./angular'); // Runs angular.js, which attaches to the window object
module.exports = angular; // Exports the global variable

这允许您像普通一样在CommonJS环境中使用它。因此,如果您像这样更新配置,它应该可以工作:

resolve: {
    alias: {
        angular: path.join(__dirname, './node_modules/angular/index.js')
    }
},

(也就是说,即使你不是别名angular,这应该是Webpack的默认行为,因为index.js在其中被标记为Angular的主要文件package.json - 您可能完全不使用别名就可以逃脱!)

答案 1 :(得分:4)

其他答案没有提供有效的解决方案。确实,Angular 1与开箱即用的webpack不能很好地协同工作(参见https://github.com/webpack/webpack/issues/2049),但它可以加载一个垫片。试试这个webpack loader配置:

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',
    }),
],

这应该正确初始化角度对象,而不是将其设置为空对象(没有名为module的属性)的默认操作。

答案 2 :(得分:1)

Angular 1不支持CommonJS模块,因此它“导出”一个空对象。

  

相反,只需要它(不指定结果):

 require('angular')

答案 3 :(得分:1)

概念性答案 -

Angular 1.x 不支持CommonJS模块,这就是为什么以下导出方法产生empty object的原因:

var angular = require("angular");

因此,最好省略var angular部分,只使用require("angular");