【问题标题】:Angular 2 quickstart demo doesn't workAngular 2 快速入门演示不起作用
【发布时间】:2017-03-18 05:13:15
【问题描述】:

我是 Angular 2 的新手,要开始使用,我从官方网站下载 Quickstart 项目。

但它在控制台中显示以下错误:

获取 http://localhost:3000/node_modules/@angular/platf...-dynamic/bundles/platform-browser-dynamic.umd.js

304 未修改 87ms zone.js(2019 行)GET http://localhost:3000/systemjs-angular-loader.js 404 未找到 2ms zone.js(2019 行)

“网络错误:404 未找到 - http://localhost:3000/systemjs-angular-loader.js"systemj...ader.js

未处理的 Promise 拒绝:访问属性的权限被拒绝 “然后” ;区域:;任务:Promise.then;值:错误:权限 拒绝访问属性“then”

resolvePromise@http://localhost:3000/node_modules/zone.js/dist/zone.js:622:21

scheduleResolveOrReject/http://localhost:3000/node_modules/zone.js/dist/zone.js:716:17

ZoneDelegate.prototype.invokeTask@http://localhost:3000/node_modules/zone.js/dist/zone.js:367:17

Zone.prototype.runTask@http://localhost:3000/node_modules/zone.js/dist/zone.js:166:28

drainMicroTaskQueue@http://localhost:3000/node_modules/zone.js/dist/zone.js:546:25

ZoneTask/this.invoke@http://localhost:3000/node_modules/zone.js/dist/zone.js:424:25

【问题讨论】:

    标签: javascript angular typescript systemjs


    【解决方案1】:

    用这个 systemjs.config.js 改变你的 systemjs.config.js

    (function (global) {
      System.config({
        map: {
          'rxjs': 'node_modules/rxjs',
          '@angular': 'node_modules/@angular',
         'app': './app',
         'angular2-in-memory-web-api' : 'node_modules/angular2-in-memory-web-api'
       },
        packages: {
          'app': {
            main: 'main.js',
            defaultExtension: 'js'
          },
    
          '@angular/platform-browser': {
            main: 'bundles/platform-browser.umd.js'
          },
    
          '@angular/core': {
            main: 'bundles/core.umd.js'
          },
    
          '@angular/http': {
            main: 'bundles/http.umd.js'
          },
    
          '@angular/compiler': {
            main: 'bundles/compiler.umd.js'
          },
    
          '@angular/compiler-cli': {
            main: 'index.js'
          },
    
          '@angular/router': {
            main: 'bundles/router.umd.js'
          },
    
          '@angular/upgrade': {
            main: 'bundles/upgrade.umd.js'
          },
    
          '@angular/forms': {
            main: 'bundles/forms.umd.js'
          },
    
          '@angular/common': {
            main: 'bundles/common.umd.js',
            defaultExtension: 'js'
          },
    
          '@angular/platform-browser-dynamic': {
            main: 'bundles/platform-browser-dynamic.umd.js'
          },
    
          '@angular/platform-server': {
            main: 'bundles/platform-server.umd.js'
          },
    
          'rxjs': {
            defaultExtension: 'js'
          },
    
          'angular2-in-memory-web-api': {
            main: './index.js',
            defaultExtension: 'js'
          }
        }
      });
    })(this);
    

    【讨论】:

    【解决方案2】:

    Angular.io 团队似乎将systemjs-angular-loader.js 包含在 plunker 链接中,但忘记将文件包含到可下载项目中。

    请将systemjs-angular-loader.js添加到与systemjs.config.js相同的级别

    var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)['"`]\s*)/gm;
    var stylesRegex = /styleUrls *:(\s*\[[^\]]*?\])/g;
    var stringRegex = /(['`"])((?:[^\\]\\\1|.)*?)\1/g;
    
    module.exports.translate = function(load){
    
      var url = new URL(load.address);
    
      var basePathParts = url.pathname.split('/');
    
      if (url.href.indexOf('plnkr') != -1) {
        basePathParts.shift();
        basePathParts.shift();
      }
    
      basePathParts.pop();
      var basePath = basePathParts.join('/');
      load.source = load.source
        .replace(templateUrlRegex, function(match, quote, url){
          let resolvedUrl = url;
    
          if (url.startsWith('.')) {
            resolvedUrl = basePath + url.substr(1);
          }
    
          return `templateUrl: '${resolvedUrl}'`;
        })
        .replace(stylesRegex, function(match, relativeUrls) {
          var urls = [];
    
          while ((match = stringRegex.exec(relativeUrls)) !== null) {
            if (match[2].startsWith('.')) {
              urls.push(`'${basePath.substr(1)}${match[2].substr(1)}'`);
            } else {
              urls.push(`'${match[2]}'`);
            }
          }
    
          return "styleUrls: [" + urls.join(', ') + "]";
        });
    
      return load;
    };
    

    代码取自这里: https://angular.io/resources/live-examples/forms/ts/eplnkr.html

    【讨论】:

    • 源已消失 (404)
    【解决方案3】:

    systemjs-angular-loader.js 是 3 月 13 日更新日志中提到的一个新模块,https://angular.io/docs/ts/latest/guide/change-log.html,但我还没有找到它。

    【讨论】:

      【解决方案4】:

      错误日志的第一行指出了问题:

      GET http://localhost:3000/systemjs-angular-loader.js 404 Not Found 2ms  zone.js (line 2019)
      

      这意味着您的项目中缺少systemjs-angular-loader.js 文件。

      正如@TimFogarty 在his answer 中提到的,systemjs-angular-loader.js 是 Angular 4.0 中添加的一个新模块。

      由于官方文档仍然没有阐明 systemjs-angular-loader.js 中应该包含什么,甚至 Angular-CLI 也不会生成它,我相信 唯一的选择是从官方 @987654322 中获取它@。

      仅供参考,这是它的当前版本:

      var templateUrlRegex = /templateUrl\s*:(\s*['"`](.*?)['"`]\s*)/gm;
      var stylesRegex = /styleUrls *:(\s*\[[^\]]*?\])/g;
      var stringRegex = /(['`"])((?:[^\\]\\\1|.)*?)\1/g;
      
      module.exports.translate = function(load){
        if (load.source.indexOf('moduleId') != -1) return load;
      
        var url = document.createElement('a');
        url.href = load.address;
      
        var basePathParts = url.pathname.split('/');
      
        basePathParts.pop();
        var basePath = basePathParts.join('/');
      
        var baseHref = document.createElement('a');
        baseHref.href = this.baseURL;
        baseHref = baseHref.pathname;
      
        if (!baseHref.startsWith('/base/')) { // it is not karma
          basePath = basePath.replace(baseHref, '');
        }
      
        load.source = load.source
          .replace(templateUrlRegex, function(match, quote, url){
            var resolvedUrl = url;
      
            if (url.startsWith('.')) {
              resolvedUrl = basePath + url.substr(1);
            }
      
            return 'templateUrl: "' + resolvedUrl + '"';
          })
          .replace(stylesRegex, function(match, relativeUrls) {
            var urls = [];
      
            while ((match = stringRegex.exec(relativeUrls)) !== null) {
              if (match[2].startsWith('.')) {
                urls.push('"' + basePath + match[2].substr(1) + '"');
              } else {
                urls.push('"' + match[2] + '"');
              }
            }
      
            return "styleUrls: [" + urls.join(', ') + "]";
          });
      
        return load;
      };
      

      【讨论】:

        【解决方案5】:

        我正在使用 Angular 4.3.2,它是最近但不是最新的版本,并且我的 package.json 文件中没有 systemjs-angular-loader.js。我没有收到 OP 的 404 错误。这是否意味着 systemjs-angular-loader.js 现在被埋在 4.x.y 版本的某个地方?

        另一方面,如果我从 app.component.ts 中的 @Component 中删除 moduleId: module.id,页面将​​不再加载。感觉好像已经进行了一些代码更改,在文档更改日志 https://devdocs.io/angular~2/guide/change-log 中有所暗示,但在 Angular 更改日志 https://github.com/angular/angular/blob/master/CHANGELOG.md 或入门文档中没有描述。 Angular 文档中没有示例(之前 -> 之后)。

        答案需要出现在官方 Angular 代码文档中 - 带有之前 -> 示例之后。然后在这里引用它。

        【讨论】:

        • 您下载了哪个演示?我想他们现在更新了。给我一个链接,我下载它并在我身边检查。让你知道
        • 我下载了一个早期的 beta 版本 - beta.2? - 并用新版本更新了它。 dev.docs 部分,Setup Anatomy,关于 systemjs.config 的系统架构,没有提到 systemjs-angular-loader.js 文件。所以我假设 4.x.y 有那个文件埋在它的某个地方。如果它很重要并且适用于所有使用 Systemjs 的人,Angular 团队应该更新 Setup Anatomy 和 Angular Changelog。
        猜你喜欢
        • 2017-02-23
        • 2017-05-02
        • 2021-01-20
        • 2018-11-19
        • 1970-01-01
        • 2021-06-06
        • 2017-01-18
        • 2018-06-18
        • 2023-03-15
        相关资源
        最近更新 更多