【发布时间】:2017-08-18 10:32:31
【问题描述】:
我正在创建一个可以动态注入到正在运行的网站的 Angular 2 应用程序。这个应用程序的重点是能够直观地修改网站内容。
当有问题的网站也没有使用 Angular 2 运行时,一切都按预期工作。特别是,当原始网站使用 Angular 2 和 Zone.js 时,我的应用程序也尝试加载 Zone.js,但它在 @987654321 上崩溃@。我使用 Webpack 作为构建系统,并尝试通过将构建拆分为 3 个部分来解决问题:manifest、polyfill 和 app。 Manifest 只包含 Webpack 清单,polyfill 包含core-js 和zone.js,其余的都在app 中。还有第四个块称为index。这是放置在网站中的一个,它首先检查是否定义了window.Zone。如果是,则仅添加 manifest 和 app。否则也polyfill。
问题是当 polyfill 块没有加载时,该块中的所有模块都从 Webpack 中丢失。因此,当代码从需要core-js 或Zone.js 的app 块中到达一些import(我认为这是正在发生的事情)时,我会收到此错误:
TypeError: Cannot read property 'call' of undefined
at __webpack_require__ (manifest.js:55)
at Object.<anonymous> (app.js:15016)
at __webpack_require__ (manifest.js:55)
at Object.<anonymous> (app.js:65567)
at __webpack_require__ (manifest.js:55)
at Object.<anonymous> (app.js:65163)
at __webpack_require__ (manifest.js:55)
at Object.defineProperty.value (app.js:65137)
at __webpack_require__ (manifest.js:55)
at webpackJsonpCallback (manifest.js:26)
清单文件中的某处:
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
问题
如何将 Webpack 或 Angular 配置为不导入 zone.js 作为依赖项,而是使用已在窗口上注册的那个?我希望能够有条件地加载 core-js 和 zone.js,前提是它尚未加载到网站上。
更新
我修改了我的构建 (Webpack) 以仅使用一个包。在那个包中,我尝试像这样使用 Webpack 的 dynamic imports:
// import reflect metadata shim
import 'core-js/es6/reflect';
import 'core-js/es7/reflect';
// Angular and application imports
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
import { ViewEncapsulation } from '@angular/core';
// load the editor in the next frame
requestAnimationFrame(() => {
if (window.Zone) {
bootstrap();
}
else {
import('zone.js/dist/zone') // <-- PROBLEM HERE
.then(bootstrap);
}
});
// bootstraps the editor
function bootstrap() {
// add the root component to the DOM
const root = document.createElement('efe-root');
document.body.appendChild(root);
// bootstrap the Angular app
platformBrowserDynamic()
.bootstrapModule(AppModule, {
defaultEncapsulation: ViewEncapsulation.Native
})
.then(() => console.debug('Exponea Free Editor has bootstrapped'));
}
我正在使用 Typescript,这需要定义文件。问题是Zone.js is an ambient dependency 所以当我像这样使用它时,我得到一个关于缺少定义文件的错误。我该如何解决?
【问题讨论】:
标签: angular typescript webpack polyfills zonejs