【问题标题】:SystemJS error when compiling ahead-of-time (no provider for NgZone)提前编译时出现 SystemJS 错误(NgZone 没有提供程序)
【发布时间】:2017-01-29 23:40:57
【问题描述】:

我之前成功使用过Angular的提前编译。现在我已经在我的应用程序中添加了路由和延迟加载,但我不能再让它工作了。

我已更新我的代码以使用 2.0(最新)版本,并且当我即时编译时它运行良好。但是提前编译时出现以下错误:

(index):52 错误: (SystemJS) XHR 错误 (404 Not Found) 正在加载 https://127.0.0.1:3443/traceur.js 错误:XHR 错误(404 未找到) 正在加载https://127.0.0.1:3443/traceur.js 在 XMLHttpRequest.wrapFn [as _onreadystatechange] (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:647:29) 在 ZoneDelegate.invokeTask (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:236:37) 在 Zone.runTask (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:136:47) 在 XMLHttpRequest.ZoneTask.invoke (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:304:33) 加载错误https://127.0.0.1:3443/traceur.js 加载错误 https://127.0.0.1:3443/node_modules/@angular/core/src/linker/ng_module_factory.js 作为“@angular/core/src/linker/ng_module_factory”来自 https://127.0.0.1:3443/dist/app/app.module.ngfactory.js

查看app.module.ngfactory.js,有一堆类似如下的import:

...
var import0 = require('@angular/core/src/linker/ng_module_factory');
var import1 = require('./app.module');
var import2 = require('@angular/common/src/common_module');
var import3 = require('@angular/core/src/application_module');
var import4 = require('@angular/platform-browser/src/browser');
var import5 = require('@angular/forms/src/directives');
var import6 = require('@angular/forms/src/form_providers');
...

我注意到如果我改变了

var import0 = require('@angular/core/src/linker/ng_module_factory');

import * as import0 from '@angular/core/src/linker/ng_module_factory';

SystemJS 接受这一行,并为下一行触发相同的错误,即

var import1 = require('./app.module');

所以我一直试图让 SystemJS 识别这种 CommonJS 样式格式,但这只会导致其他错误,没有一个比上面的更清楚。

编辑: 当我切换到在 tsconfig 中使用 es2015 模块并运行应用程序时,我得到了(可怕的)traceur.js 错误:

https://127.0.0.1:3443/traceur.js资源加载失败:服务器 响应状态为 404(未找到)2016-09-26 10:11:19.842 127.0.0.1/:52 错误:(SystemJS)XHR 错误(404 未找到)正在加载 https://127.0.0.1:3443/traceur.js 错误:XHR 错误(404 未找到) 正在加载https://127.0.0.1:3443/traceur.js 在 XMLHttpRequest.wrapFn [as _onreadystatechange] (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:647:29) 在 ZoneDelegate.invokeTask (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:236:37) 在 Zone.runTask (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:136:47) 在 XMLHttpRequest.ZoneTask.invoke (https://127.0.0.1:3443/node_modules/zone.js/dist/zone.js:304:33) 加载错误https://127.0.0.1:3443/traceur.js 加载错误 https://127.0.0.1:3443/dist/app/main.js

我之前遇到过这个问题,并通过删除包含 import 语句的注释代码解决了这个问题。在这种情况下,我的代码中没有这样的行。

这是我的 systemjs.config.js:

(function(global) {
    System.defaultJSExtensions = true;
    System.defaultExtension = 'js';

    // map tells the System loader where to look for things
    // N.B. the dots at the start of the paths are very important!
    var map = {
        'app':                        './dist/app',
        '@angular':                   './node_modules/@angular',
        'rxjs':                       './node_modules/rxjs'
    };

    // packages tells the System loader how to load when no filename and/or no extension
    var packages = {
        'app':                        { main: 'main.js',  defaultExtension: 'js' },
        'rxjs':                       { defaultExtension: 'js' }
    };
    var ngPackageNames = [
        'common',
        'compiler',
        'compiler-cli',
        'core',
        'forms',
        'http',
        'platform-browser',
        'platform-browser-dynamic',
        'router',
        'tsc-wrapped',
        'upgrade'
    ];
    function packUmd(pkgName) {
        packages['@angular/'+pkgName] = { main: 'bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
    }
    var setPackageConfig =  packUmd;
    // Add package entries for angular packages
    ngPackageNames.forEach(setPackageConfig);
    console.log("SystemJS packages:", packages);
    var config = {
        map: map,
        packages: packages
    };

    System.config(config);

})(this);

编辑 2: 当我在systemjs.config.js中将'app'的格式设置为'cjs'时,即

'app': { main: 'main.js',  defaultExtension: 'js', format: 'cjs' },

使用commonjs编译代码时,不再出现上述app.module.ngfactory.js的错误。

但是,在浏览器中运行时,我会收到以下错误(安装 traceur 后;没有 traceur 我只会收到上述 traceur 错误):

(index):52 错误: (SystemJS) NgZone 没有提供者!错误:否 NgZone 的提供商! 在 NoProviderError.Error (本机) 在 NoProviderError.BaseError [作为构造函数] (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:1255:38) 在 NoProviderError.AbstractProviderError [作为构造函数] (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:1739:20) 在新的 NoProviderError (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:1770:20) 在 ReflectiveInjector_._throwOrNull (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:3366:23) 在 ReflectiveInjector_._getByKeyDefault (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:3394:29) 在 ReflectiveInjector_._getByKey (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:3357:29) 在 ReflectiveInjector_.get (https://147.252.67.223:3443/node_modules/@angular/core/bundles/core.umd.js:3166:25) 在 AppModuleInjector.createInternal (https://147.252.67.223:3443/dist/app/app.module.ngfactory.js:610:69) 在 AppModuleInjector.NgModuleInjector.create (https://147.252.67.223:3443/node_modules/@angular/core/src/linker/ng_module_factory.js!transpiled:96:32) 评估 https://147.252.67.223:3443/dist/app/main.js 错误 加载中https://147.252.67.223:3443/dist/app/main.js

我的 tsconfig.json:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "removeComments": true,
        "noImplicitAny": true,
        "suppressImplicitAnyIndexErrors": true,
        "rootDir":"./src",
        "outDir":"./dist"
    },
    "angularCompilerOptions": {
        "genDir": ".",
        "debug": true,
        "skipMetadataEmit": true
    }
}

非常感谢任何帮助。

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    由于systemjs.config.js,我从 Angular RC6 切换到 2.0.0 时遇到了类似问题。

    我最终会根据最新的快速入门指南 https://angular.io/docs/ts/latest/quickstart.html#!#add-config-files 重新完成整个 systemjs.config.js 并进行一些修改。

    我在您的 systemjs.config.js 中看到的一个问题是缺少对以下软件包的引用:

    • es6-shim(或 core-js)
    • 反映元数据
    • zone.js

    以下是我的systemjs.config.js

    (function (global) {
        System.config({
            paths: {
                'npm:': '/node_modules/'
            },
            // map tells the System loader where to look for things
            map: {
                // our app is within the app folder
                app: '/app',
                // angular bundles
                '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
                '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
                '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
                '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
                '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
                '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
                '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
                '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
                // other libraries
                'es6-shim': 'npm:es6-shim',
                'reflect-metadata': 'npm:reflect-metadata',
                'rxjs': 'npm:rxjs',
                'zone.js': 'npm:zone.js'
            },
            // packages tells the System loader how to load when no filename and/or no extension
            packages: {
                'app': { main: 'main.js', defaultExtension: 'js' },
                'es6-shim': { main: 'es6-shim.min.js', defaultExtension: 'js' },
                'reflect-metadata': { main: 'Reflect.js', defaultExtension: 'js' },
                'rxjs': { main: 'bundles/Rx.min.js', defaultExtension: 'js' },
                'zone.js': { main: 'dist/zone.min.js', defaultExtension: 'js' }
            }
        });
    })(this);
    

    【讨论】:

    • 感谢您的建议。我试过了,但没有用。仍然出现同样的错误。
    • @BrendanB 你能 github 回购吗?
    • 谢谢,但我不能。这是一个私人工作项目。我将尝试使用 Angular CLI。一切顺利。
    • @BrendanB angular-cli 真的容易多了。它使您免于所有设置麻烦,尤其是所有 webpack 配置、prod vs dev 等。
    猜你喜欢
    • 2018-11-27
    • 2023-03-18
    • 2018-03-05
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多