javascript - TypeError:尝试创建另一个脚本文件的类的新实例时出现非法构造函数
问题描述
我使用 LitElement + WebPack 创建了一个包含大约 25 个自定义 Web 组件的库。该库包含组件(例如上下文菜单组件)和视图(例如也使用上下文菜单组件的自定义表)。
到目前为止,所有组件和代码都在一个 javascript 文件中。为了使包更加模块化,我创建了第二个入口点。现在所有的 ui 组件都有它们的依赖图以及特殊的矩阵表视图。
entry: {
'ui-components': './src/index.js',
'view-matrix': './src/view-matrix.js'
},
在 WebPack (v4) 我使用 splitChunks 优化:
optimization: {
splitChunks: {
chunks: 'all',
},
}
如果我现在想在 view-matrix.js 中实例化一个 ui 组件(在 /src/index.js 中定义和导入),我会收到以下错误。
1)实例化(view-matrix.js:31)
import {MwNavigationContextmenu} from "./components/navigations/mw-navigation-contextmenu";
let contextMenu = new MwNavigationContextmenu();
2) 错误信息
TypeError: Illegal constructor (view-matrix.js:31)
在 index.js 中实例化同一行代码效果很好。
我确定,MwNavigationContextmenu 之前被定义为自定义 Web 组件:
window.customElements.define('mw-navigation-contextmenu', MwNavigationContextmenu);
3)MwNavigationContextmenu
定义
./components/navigations/mw-navigation-contextmenu
import { MwNavigationContextmenu } from './src/MwNavigationContextmenu.js';
window.customElements.define('mw-navigation-contextmenu', MwNavigationContextmenu);
./src/MwNavigationContextmenu.js
import {html, LitElement} from 'lit-element';
export class MwNavigationContextmenu extends LitElement {
static get properties() {
return {
// defined props
// hasbutton: {type:Boolean},
};
}
constructor() {
super();
// property defaults following
// this.hasbutton = true;
}
render() {
return html`
Render context menu…
`;
}
}
所以有问题是在MwNavigationContextmenu
中定义的index.js
并且view-matrix.js
由于任何原因都无法实例化类。
解决方案
我开始怀疑多个入口点之间的共享组件,并在类似的 webpack 问题案例中找到了提示:https ://github.com/webpack/webpack/issues/6977#issuecomment-388826616
问题(据我了解):来自两个入口点的脚本加载在同一页面上(而 Webpack 4 有这个经验法则:1 个入口点 = 1 个页面)。因此,必须生成共享运行时块而不是使用该splitChunks
属性。
解决方案(编辑 webpack.config.js)
optimization: {
runtimeChunk: {
name: 'shared',
},
}
感谢 GitHub 的 akx https://akx.github.io/
推荐阅读
- html - 使用引导程序如何在不使用绝对或负左边距的情况下制作位于导航容器外部的 div
- kentico - 如何在不使用原始 SQL 字符串的情况下使用 Kentico Pages API 嵌套 WHERE 子句条件?
- python - Python - ValueError:字典更新序列元素 #0 的长度为 15;2 是必需的
- graphene-python - Python graphql 异常处理:是否期望得到具有 200 OK 响应的错误数组?
- php - PHPMailer & GoDaddy
- swift - 在 Swift 中使用 NSToolbar 中的 ColorPanel
- ruby-on-rails - Rails 中如何将数组转换为字符串
- android - 片段中的按钮单击侦听器。安卓工作室
- ios - 无法分配“JSONObject.Type”类型的值(又名“字典”
.Type') 来输入'JSONObject' (又名'Dictionary) ') - ignite - 为什么 Ignite 使用 Spring 框架?