Angular2 RC1 意外令牌 <

Angular2 RC1 Unexpected Token <

我正在努力使 angular 教程中的快速启动项目适应 asp.net5 站点。

到目前为止,它确实看起来应该可以正常工作...我按照教程并从那里获取了代码(调整路径以匹配我的 asp 网站中的路径)。但是我一直收到这个 "Unexpected Token <" 错误,这是非常误导的...

我发现了一些使用 beta9 的示例,但我更喜欢 运行 最新版本的 angular2 (rc1),所以我已经坚持了几个小时了.. .

无论如何,这是我的项目文件的样子:

index.html:

<html lang="">
<head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Trail Running Life</title>
        <base href="/">
        <link rel="stylesheet" href="/css/bootstrap.css">
        <link rel="stylesheet" href="/css/site.css">
</head>
<body>

    <app>
        Loading...
    </app>


    <script src="/lib/jquery.js"></script>
    <script src="/lib/bootstrap.js"></script>       

    <script src="/lib/es6-shim.js"></script>
    <script src="/lib/zone.js"></script>
    <script src="/lib/Reflect.js"></script>
    <script src="/lib/system.src.js"></script>
    <script src="/system.config.js"></script>

    <script>       
      System.import('app').catch(function(err){ console.error(err);  });
    </script>
</body>
</html>

system.config.js:

(function (global) {

    // map tells the System loader where to look for things
    var map = {
        'app': 'app', // 'dist',
        'rxjs': 'lib',
        '@angular': 'lib/angular2'
    };

    // 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 packageNames = [
      '@angular/common',
      '@angular/compiler',
      '@angular/core',
      '@angular/http',
      '@angular/platform-browser',
      '@angular/platform-browser-dynamic',
      '@angular/router',
      '@angular/router-deprecated',
      '@angular/testing',
      '@angular/upgrade'
    ];

    // add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
    packageNames.forEach(function (pkgName) {
        packages[pkgName] = { defaultExtension: 'js' };
    });

    var config = {
        map: map,
        packages: packages
    }

    // filterSystemConfig - index.html's chance to modify config before we register it.
    if (global.filterSystemConfig) { global.filterSystemConfig(config); }

    System.config(config);

})(this);

main.ts

import { bootstrap }    from '@angular/platform-browser-dynamic';
import { AppComponent } from './app.component';

bootstrap(AppComponent);

app.component.ts

import { Component } from '@angular/core';

@Component({
    selector: 'app',
    template: '<h1>My First Angular 2 App</h1>'
})
export class AppComponent { }

这是我的文件夹结构(lib 文件夹是通过 gulp 命令生成的):

非常感谢任何帮助!

您遗漏了现在以 @angular 名称发布的整个 Angular 2 个 RC 模块。您有名称为 angular2 的模块,它与 Angular 2 beta 相关,并且在 RC1 版本中已重命名为 @angular。此更改的详细信息已记录在案 here。您还可以看到您正在通过 system.config.js 脚本中的 packageNames 数组引用这些模块。

通过将它们添加到您的 package.json 文件来确保您正在获取依赖项:

"dependencies": {
  "@angular/common": "2.0.0-rc.1",
  "@angular/compiler": "2.0.0-rc.1",
  "@angular/core": "2.0.0-rc.1",
  "@angular/http": "2.0.0-rc.1",
  "@angular/platform-browser": "2.0.0-rc.1",
  "@angular/platform-browser-dynamic": "2.0.0-rc.1",
  "@angular/router": "2.0.0-rc.1",
  "@angular/router-deprecated": "2.0.0-rc.1",
  "@angular/upgrade": "2.0.0-rc.1",

  "systemjs": "0.19.27",
  "es6-shim": "^0.35.0",
  "reflect-metadata": "^0.1.3",
  "rxjs": "5.0.0-beta.6",
  "zone.js": "^0.6.12",

  "angular2-in-memory-web-api": "0.0.7",
  "bootstrap": "^3.3.6"
},

并且它们与您的 gulp 构建一起部署在您的 lib 文件夹中。

您是否在 运行 NPM 安装步骤时遇到此错误?这可能是 NPM 缓存代理问题。如果您使用的是不支持 NPM 包命名空间(例如:“@angular”)的稍旧的 Nexus,您将收到与您的错误类似的错误。

npm ERR! Unexpected token <

Can't install when behind an npm proxy such as Nexus or Artifactory #706

您收到此错误,因为 system.config.js 没有足够的(或有错误的)信息来构建静态 .js 文件的正确路径。它需要 Javascript 文件,但从您的网络服务器得到 HTML 响应。

再看看 Developers tools (Chrome) Network 对 JS 文件的 XHR 响应,会发现您需要添加哪些映射到 system.config.js。

构建后您的应用程序文件位于何处?这是 'app' 文件夹吗?或 'app/dist'?...

更新

试试这个:

(function (global) {

    // map tells the System loader where to look for things
    var map = {
        'app': 'app', // 'dist',
        'rxjs': 'lib',
        '@angular': 'lib/@angular'
    };

    // packages tells the System loader how to load when no filename and/or no extension
    var packages = {
        'app': { main: 'main'},
        'rxjs': { main: 'rx' }
    };

    var packageNames = [
      '@angular/common',
      '@angular/compiler',
      '@angular/core',
      '@angular/http',
      '@angular/platform-browser',
      '@angular/platform-browser-dynamic',
      '@angular/router',
      '@angular/router-deprecated',
      '@angular/testing',
      '@angular/upgrade'
    ];

    // add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
    packageNames.forEach(function (pkgName) {
        packages[pkgName] = { main: 'index' };
    });

    var config = {
        defaultJSExtensions: true,
        map: map,
        packages: packages
    }

    // filterSystemConfig - index.html's chance to modify config before we register it.
    if (global.filterSystemConfig) { global.filterSystemConfig(config); }

    System.config(config);

})(this);
  1. 可选:您可以对整个配置对象使用 defaultJSExtensions: true
  2. 可选:为@angular 包指明默认文件{main:'index'}
  3. 主要原因:您映射到 angular 的错误文件夹。而不是'@angular':'lib/angular2' 应该使用'@angular':'lib/@angular'。但是,如果您在 angular2 文件夹中有 @angular.rc1 文件(只保留旧文件夹名称),那么请使用您的映射,但尝试使用此可选更新。他们可以提供帮助。