Angular build optimizer - TypeError: this._createContainer is not a function
Angular build optimizer - TypeError: this._createContainer is not a function
使用 --prod
编译 Angular 7.2.5 应用程序会产生奇怪的 运行 时错误。
堆栈跟踪是
ERROR TypeError: this._createContainer is not a function
at bg.pa (Viewer.js.pre-build-optimizer.js:143)
at new bg (Modeler.js.pre-build-optimizer.js:129)
at Qg.ngOnInit (diagram.component.ts:105)
at core.js.pre-build-optimizer.js:28285
at core.js.pre-build-optimizer.js:29961
at Sr (core.js.pre-build-optimizer.js:29900)
at ao (core.js.pre-build-optimizer.js:30868)
at core.js.pre-build-optimizer.js:30811
at Object.updateDirectives (diagram-wrapper.component.html:1)
at Object.ro [as updateDirectives] (core.js.pre-build-optimizer.js:30799)
但是,Viewer.js.pre-build-optimizer.js
文件确实包含 _createContainer
函数
export default function Viewer(options) {
options = assign({}, DEFAULT_OPTIONS, options);
this._moddle = this._createModdle(options); // works
this._container = this._createContainer(options); // <---
...
Viewer.prototype._createContainer = function(options) {
var container = domify('<div class="bjs-container"></div>');
assign(container.style, {
width: ensureUnit(options.width),
height: ensureUnit(options.height),
position: options.position
});
return container;
};
该库不是本地 Angular 库,它是 https://github.com/bpmn-io/bpmn-js
我不知道该去哪里,我想维护构建优化器。
几张截图
我遇到过同样的问题。在我的例子中,解决方案是将 diagram.js 依赖项添加到 package.json。像这样:
"dependencies": {
...
"diagram-js": "^4.0.0"
...
bpmn.js是用diagram.js库写的,这个函数(_createContainer)是从它继承的。
在开发应用程序时 npm 将所有依赖项本地下载到 node_modules 目录。但是当您尝试构建 prod 版本时,您应该指定您的应用程序使用的所有库。
我已经设法通过覆盖有问题的模块中的 sideEffects
设置来实现它。设置 sideEffects: true
将告诉 webpack 修剪未使用的导出是不安全的(参见 https://webpack.js.org)。
首先,在您的 Angular 项目的根目录中创建一个 extra-webpack.config.js
文件,内容为
module.exports = {
module: {
rules: [{
include: [/node_modules\/moddle-xml/],
sideEffects: true
}, {
include: [/node_modules\/diagram-js/],
sideEffects: true
}, {
include: [/node_modules\/bpmn-js/],
sideEffects: true
}, {
include: [/node_modules\/bpmn-moddle/],
sideEffects: true
}]
}
};
甚至更短
rules: [
{
include: [/node_modules\/(bpmn-js|bpmn-moddle|diagram-js|moddle-xml)/],
sideEffects: true
}
]
然后,更新您的 angular.json
构建器配置以使用 custom-webpack
构建器。
"builder": "@angular-builders/custom-webpack:browser",
"options": {
"customWebpackConfig": {
"path": "./extra-webpack.config.js",
"mergeStrategies": { "module.rules": "prepend" }
},
这实际上会告诉构建优化器忽略这些模块。
使用 --prod
编译 Angular 7.2.5 应用程序会产生奇怪的 运行 时错误。
堆栈跟踪是
ERROR TypeError: this._createContainer is not a function
at bg.pa (Viewer.js.pre-build-optimizer.js:143)
at new bg (Modeler.js.pre-build-optimizer.js:129)
at Qg.ngOnInit (diagram.component.ts:105)
at core.js.pre-build-optimizer.js:28285
at core.js.pre-build-optimizer.js:29961
at Sr (core.js.pre-build-optimizer.js:29900)
at ao (core.js.pre-build-optimizer.js:30868)
at core.js.pre-build-optimizer.js:30811
at Object.updateDirectives (diagram-wrapper.component.html:1)
at Object.ro [as updateDirectives] (core.js.pre-build-optimizer.js:30799)
但是,Viewer.js.pre-build-optimizer.js
文件确实包含 _createContainer
函数
export default function Viewer(options) {
options = assign({}, DEFAULT_OPTIONS, options);
this._moddle = this._createModdle(options); // works
this._container = this._createContainer(options); // <---
...
Viewer.prototype._createContainer = function(options) {
var container = domify('<div class="bjs-container"></div>');
assign(container.style, {
width: ensureUnit(options.width),
height: ensureUnit(options.height),
position: options.position
});
return container;
};
该库不是本地 Angular 库,它是 https://github.com/bpmn-io/bpmn-js
我不知道该去哪里,我想维护构建优化器。
几张截图
我遇到过同样的问题。在我的例子中,解决方案是将 diagram.js 依赖项添加到 package.json。像这样:
"dependencies": {
...
"diagram-js": "^4.0.0"
...
bpmn.js是用diagram.js库写的,这个函数(_createContainer)是从它继承的。 在开发应用程序时 npm 将所有依赖项本地下载到 node_modules 目录。但是当您尝试构建 prod 版本时,您应该指定您的应用程序使用的所有库。
我已经设法通过覆盖有问题的模块中的 sideEffects
设置来实现它。设置 sideEffects: true
将告诉 webpack 修剪未使用的导出是不安全的(参见 https://webpack.js.org)。
首先,在您的 Angular 项目的根目录中创建一个 extra-webpack.config.js
文件,内容为
module.exports = {
module: {
rules: [{
include: [/node_modules\/moddle-xml/],
sideEffects: true
}, {
include: [/node_modules\/diagram-js/],
sideEffects: true
}, {
include: [/node_modules\/bpmn-js/],
sideEffects: true
}, {
include: [/node_modules\/bpmn-moddle/],
sideEffects: true
}]
}
};
甚至更短
rules: [
{
include: [/node_modules\/(bpmn-js|bpmn-moddle|diagram-js|moddle-xml)/],
sideEffects: true
}
]
然后,更新您的 angular.json
构建器配置以使用 custom-webpack
构建器。
"builder": "@angular-builders/custom-webpack:browser",
"options": {
"customWebpackConfig": {
"path": "./extra-webpack.config.js",
"mergeStrategies": { "module.rules": "prepend" }
},
这实际上会告诉构建优化器忽略这些模块。