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

Max*_*kyi 9 javascript angularjs webpack

我已经像这样配置了webpack:

resolve: {
    alias: {
        angular: path.join(__dirname, './node_modules/angular/angular.js')
    }
},
Run Code Online (Sandbox Code Playgroud)

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

var angular = require("angular");
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*lay 5

其他答案不太准确 - 核心angular.js文件确实不支持 CommonJS,但是如果您从 NPM 安装它,index.js则会提供一个名为的小包装文件。它实际上只是两行:

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

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

resolve: {
    alias: {
        angular: path.join(__dirname, './node_modules/angular/index.js')
    }
},
Run Code Online (Sandbox Code Playgroud)

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


Mot*_*tin 4

其他答案没有提供可行的解决方案。确实,Angular 1 不能很好地与开箱即用的 webpack 配合使用(请参阅https://github.com/webpack/webpack/issues/2049),但可以使用填充程序加载它。尝试这个 webpack 加载器配置:

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',
    }),
],
Run Code Online (Sandbox Code Playgroud)

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