未捕获的TypeError:在webpack重建CommonsChunkPlugin后无法读取未定义的属性'call'

时间:2016-04-14 21:42:42

标签: javascript angularjs typescript webpack

我在尝试要求html文件时遇到一个奇怪的错误。有问题的代码是一个用typescript编写并使用webpack的AngularJs应用程序。

app.directive.ts

// require('./app.scss');

// import AppController from './app.controller';

function AppDirective(): ng.IDirective {
  return {
    restrict: 'E',
    scope: {},
    controllerAs: 'vm',
    // controller: AppController,
    controller: () => {},
    // template: require('./app.html')
    template: '<div>this is a test</div>'
  }
}

angular
  .module('myApp')
  .directive('appDirective', AppDirective);

app.controller.ts

export default class AppController {

  public static $inject = ['$scope'];

  constructor(private $scope) {

  }
}

app.html

<div>
  THIS IS A TEST, REMAIN CALM
</div>

app.scss为空。

现在,按照包含的注释,此代码在webpack中构建时没有错误,并将使用webpack dev服务器进行部署。

使用webpack dev服务器,它允许您在服务器运行时更​​改代码并重新加载它,我可以取消注释任何/所有注释行,它将正常工作。

但是,如果我关闭开发服务器并重建,则无法提供此错误:

  

未捕获的TypeError:无法读取未定义的属性“call”

Uncaught TypeError: Cannot read property 'call' of undefined__webpack_require__ @ bootstrap 9163605…:50
webpackJsonp.152 @ app.ts:2__webpack_require__ @ bootstrap 9163605…:50
webpackJsonp.153 @ main.browser.ts:1__webpack_require__ @ bootstrap 9163605…:50
webpackJsonp.0 @ main.bundle.js:7__webpack_require__ @ bootstrap 9163605…:50

webpackJsonpCallback @ bootstrap 9163605 ...:21(匿名函数)@main.bundle.js:1

在webpack的这一行失败:boostrap文件:

modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

尝试取消注释app.scss行,控制器行或app.html行时发生此错误。只有在重建之后才会发生这种情况,任何或所有行都会被取消注释。

我正在使用webpack构建,并在tsconfig中使用commonjs进行模块加载,我在webpack.config中为这些类型的文件提供了以下webpack加载器:

      {
        test: /\.ts$/,
        loader: 'awesome-typescript-loader',
        exclude: [/\.(spec|e2e)\.ts$/]
      },

      {
        test: /\.scss$/,
        loader: 'style-loader!css-loader!sass-loader'
      },

      {
        test: /\.html$/,
        loader: 'raw-loader',
        exclude: [helpers.root('src/index.html')]
      },

我一直在使用角度js和打字稿,但这是第一次启动我自己的项目,而且我仍然在webpack中磕磕绊绊。

我很困惑,为什么这个代码在它运行时插入它会起作用,但是在重建后停止工作。我认为它与我的webpack配置有关,但我无法弄明白,我已经坚持了一段时间。任何帮助将不胜感激。

更新 我找到了原因,但没有找到解决方案。它似乎是由我的webpack配置中的CommonsChunkPlugin引起的:

new webpack.optimize.CommonsChunkPlugin({
      name: helpers.reverse(['polyfills', 'vendor', 'main']),
      // minChunks: Infinity
    }),

如果我删除了插件,则错误消失,但之后我不再拥有此插件。

更新2

将插件初始化更改为可解决此问题:

new webpack.optimize.CommonsChunkPlugin({
  names: ['polyfills', 'vendor', 'main'],
  minChunks: 2
}),

但我仍然不明白为什么

2 个答案:

答案 0 :(得分:0)

如果您在同一页面上加载了多个webpack编译的文件,它们将相互覆盖。使用module.output.library选项定义&#39;命名空间&#39;为您的应用程序。

答案 1 :(得分:0)

Posting update #2 as answer as per Zze's recommendation.

Changing the plugin initialization to this fixes the issue:

new webpack.optimize.CommonsChunkPlugin({
  names: ['polyfills', 'vendor', 'main'],
  minChunks: 2
}),

But I still don't understand why