Угловой 2 Краткое руководство: неожиданный токен
я пытаюсь настроить angular 2 в соответствии с быстрым началом, найденным в http://angular.io. я скопировал каждый файл точно так, как описано в руководстве, но когда я запускаю npm start и открывается вкладка браузера, я получаю " загрузка..."со следующей ошибкой в консоли:
Uncaught SyntaxError: Unexpected token < (program):1
__exec @ system.src.js:1374
Uncaught SyntaxError: Unexpected token < angular2-polyfills.js:138
Evaluating http://localhost:3000/app/boot
Error loading http://localhost:3000/app/boot
это мой app.component.ts:
import {Component} from 'angular2/core';
@Component({
selector: 'my-app',
template: `<h1>My First Angular 2 App</h1>`
})
export class AppComponent {
}
мой boot.ts:
import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
bootstrap(AppComponent);
мой index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Angular 2 Quick Start</title>
<script src="node_modules/es6-shim/es6-shim.js"></script>
<script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/rxjs/bundles/Rx.js"></script>
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
<script>
System.config({
packages: {
format: 'register',
defaultExtension: 'js'
}
});
System.import('app/boot')
.then(null, console.error.bind(console));
</script>
</head>
<body>
<my-app>Loading...</my-app>
</body>
</html>
мой package.json:
{
"name": "angular2-quickstart",
"version": "0.1.0",
"scripts": {
"tsc": "tsc",
"tsc:w": "tsc -w",
"lite": "lite-server",
"start": "concurrent "npm run tsc:w" "npm run lite" "
},
"license": "MIT",
"dependencies": {
"angular2": "2.0.0-beta.0",
"systemjs": "0.19.6",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.3",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.0",
"zone.js": "0.5.10"
},
"devDependencies": {
"concurrently": "^1.0.0",
"lite-server": "^1.3.1",
"typescript": "^1.7.3"
}
}
и наконец-то мой tsconfig.json:
{
"compilerOptions": {
"target": "ES5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
заранее спасибо за любую помощь.
14 ответов:
попробуйте заменить этот
System.config({ packages: { format: 'register', defaultExtension: 'js' } });С
System.config({ packages: { app: { // must match your folder name format: 'register', defaultExtension: 'js' } } });Я пытался применить немного другую структуру папок для их быстрого запуска и столкнулся с той же проблемой. Я обнаружил, что имя свойства объекта "пакеты" должно совпадать с родительской папкой.
совет для тех, кто сталкивается с "неожиданной ошибкой токена
Я смог точно определить это в инструментах разработчика Chrome на вкладке "Сеть", просматривая загруженные файлы JavaScript один за другим, пока не нашел тот, где вместо этого был возвращен HTML. Это легко решить проблема с моим импортом.
надеюсь, мы можем получить более осмысленное сообщение об ошибке в какой-то момент-
у меня были подобные проблемы с различными модулями узлов и пришли сюда из Google.
обычно я получаю ошибку после
importing пакет, а затем пытается использовать его.например, у меня была такая же проблема при загрузке https://github.com/ngrx/store.
Я проверил вкладку Сеть и получается файл, который был загружен для магазина.js (основной файл этого модуля) не был правильным. Он запросил магазин.js, но получил мой индекс.формат html, который начинался с
<!DOCTYPE html>, т. е. он начался с "мне непонятно, почему мой индекс.html был подан вместо фактического файла JavaScript. Одним из объяснений может быть то, что SystemJS сделал запрос, который никуда не привел, и мой сервер был настроен для обслуживания индекса.html по умолчанию. Однако у меня недостаточно данных, чтобы доказать это. Кум Грано Салис.
в любом случае, я исправил это, явно сообщив SystemJS, где живет пакет, если он не могу найти его сам по себе. Так, например, чтобы исправить ошибку
import { Store } from '@ngrx/store';, вы можете сделать:System.config({ packages: { src: { format: 'register', defaultExtension: 'js' } }, map: { '@ngrx/store' : '/node_modules/@ngrx/store/dist/store.js' } // <-- this! }); System.import('src/boot') .then(null, console.error.bind(console));, потому что
Storeмодуль живет в этом файле. Таким образом, SystemJS находит его, и модуль может быть импортирован просто отлично.
у меня была аналогичная проблема импорта
rx.jsЯ закончил тем, что решил его, добавив путь кSystem.config()System.config({ defaultJSExtensions: true, paths: { 'rx' : 'lib/rx.js' } });
у меня была аналогичная проблема, я настроил сервер IIS, чтобы переписать все пути к
index.htmlдля того, чтобы маршрутизатор работал правильно. (обновление страницы возвращало 404. Читайте подробности в этом ответе)как @dchacke указывает, это потому что
System.jsждет . Это действительно производит странное сообщение, начинающееся сSyntaxError: Unexpected token <. Временное отключение перезаписи URL позволяет мне видеть реальная проблема.при импорте дочерних компонентов в родительские компоненты
System.jsможет запутаться, если пути не объявлены должным образом.parent.component.tsимеет следующий импорт:
import { ChildComponent } from './childComponentFolder/childComponent';выдает эту ошибку:
GET app/parentComponentFolder/childComponentFolder/childComponent.js 404 (Not Found) Error: Error: XHR error (404 Not Found) loading app/parentComponentFolder/childComponentFolder/childComponent.jsизменение пути инструкции импорта от относительного к абсолютному пути решает проблему:
import { ChildComponent } from 'app/childComponentFolder/childComponent';отображение пути в системе.конфиг.js также может сделайте трюк, но мне сложнее поддерживать, потому что не совсем понятно, почему работает путь импорта или нет. Теперь я могу раскомментировать правила перезаписи в
Web.configи все работает просто отлично.Edit:
похоже, что TypeScript transpiler очень разборчив в путях. Только относительные пути проходят без ошибок броска:
в основном вам нужно сделать шаг назад одну папку из
parentComponentFolder/доapp/папка.
import { ChildComponent } from '../childComponentFolder/childComponent';
я столкнулся с этой же проблемой. Я исправил это, реализовав следующее в моем индексе.html (Примечание: я помещаю зависимости angular2 js в папку' lib'):
приложение.деталь.ТС выглядит так:<html> <head> <title>Desktop main</title> </head> <body> <div> <my-app>Loading...</my-app> </div> <script src="~/lib/anguar2/angular2-polyfills.js"></script> <script src="~/lib/es6-shim/es6-shim.js"></script> <script src="~/lib/systemjs/system.src.js"></script> <script> System.config({ defaultJSExtensions: true }); </script> <script src="~/lib/rxjs/rx.js"></script> <script src="~/lib/anguar2/angular2.dev.js"></script> <script> System.import('app/boot'); </script> </body> </html>import {Component} from "angular2/core"; @Component({ selector: "my-app", template: "<h1>Hello Angular 2</h1>" }) export class AppDesktopComponent { }жаль, что я не могу сказать вам, почему это работает и angular2 quickstart boilerplate не делает.
я получал аналогичную проблему:
Unexpected token ]при запуске сервера. Оказывается, у меня была конечная запятая в моем
tsconfig.json:... "files": [ "app.ts", "typings.d.ts", "abc-vt/abc-vt", <-Doh! ]урок: не просто предполагайте, что это ошибка в исходном коде-проверьте ваши файлы конфигурации, а также.
в моем случае я случайно включил расширение файла в импорт...
import {SomeComponent} from 'some.component.ts';и (очевидно!) так и должно было быть...
import {SomeComponent} from 'some.component';
конечная запятая в вашей конфигурации systemjs вызовет это.
Регистрация
systemjs.config.tsфайл и убедитесь, что json действителен.
у меня была похожая ошибка. Я получил:
Uncaught SyntaxError: Unexpected token = (index):16потому что я бросил точку с запятой в конце
@Input()на .надеюсь, это кому-то поможет.
основная причина этой проблемы заключается в том, что файл, который вы пытаетесь импортировать файл html, а не JS файл. Вы можете увидеть это, используя вкладку "Сеть" в Chrome, чтобы посмотреть на файл, который он фактически импортировал.
моя проблема не была решена с помощью указанных выше методов. Для меня это произошло потому, что я маршрутизировал все маршруты по умолчанию до индекса.html-страница, так я получаю угловую глубокую привязку, работающую в Visual Studio Enterprise. Когда я запросил файл без расширения, и он не мог найти этот файл, он будет служить индексом по умолчанию.html-страница, которая начинается с символа
поддавки для меня было то, что когда я поставил полный путь к файлам, это будет работать.
во всяком случае, чтобы исправить это, мне пришлось добавить маршрут игнорирования для папки node_modules в моем RouteConfig.cs файл:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("node_modules/{*pathInfo}"); }
я получил то же сообщение об ошибке. Подобно тому, что упоминали другие люди, мой случай был вызван переписыванием url, обслуживающим html вместо javascript, ожидаемого angular.
Я использую lite-server / browser-sync для разработки и размещения моего приложения локально. Чтобы угловая маршрутизация работала правильно, я использовал
var history = require('connect-history-api-fallback')для перенаправления соответствующей навигации pushState обратно в индекс.формат html. В конечном счете, неправильная конфигурация в моем импорте typescript привела к одному запросу не распознается как JS-файл и вместо этого перенаправляется в индекс.формат html. Трудность заключалась в том, как это выяснить.
я обнаружил, что вы можете включить подробное ведение журнала для резервного копирования connect-history-api.
middleware: [history({ index: '/src/index.html', verbose: true })]который затем привел меня, чтобы найти виновника, сканируя журнал для перенаправленных записей:
Not rewriting GET /node_modules/systemjs/dist/system.js because the path includes a dot (.) character. Not rewriting GET /node_modules/core-js/client/shim.min.js because the path includes a dot (.) character. Rewriting GET /src/culprit to /src/index.html
для тех, кто прочитал все это и не нашел ничего интересного, у меня может быть другой вариант для вас.
Я столкнулся с той же проблемой, потому что веб-сайт был развернут на более чем 1 веб-сервере. Проблема была связана с различными сборками, развернутыми на некоторых серверах.
в принципе, у вас есть 1 сервер с одной версии и другой сервер с другой версией. Итак, конечно, когда вы балансируете нагрузку, вы, вероятно, получите 404 на некоторых ресурсах на некоторых серверах потому что версии разные (вспомним главное.xxxxx.js, где xxx отличается при каждой сборке). И если вы настроили свой веб-сервер для возврата веб-страницы 404 - что часто случается, я думаю-вы получаете некоторый HTML вместо файлов JS, а затем неожиданный токен.
Итак, Проверьте свои версии на каждом сервере !
для меня эта ошибка была вызвана тем, что я обслуживал свой угловой интерфейс с простым сервером Node express как таковым:
app.use('/*', (req, res) => { res.sendFile(path.join(__dirname,'index.html')); });но я забыл указать, что все статические файлы должны быть из текущего каталога в строке:
app.use(express.static(__dirname));поэтому каждый вызов статического актива возвращает индекс.формат html. Ой. Как только я добавил эту строку, все было в порядке. Надеюсь, что это может помочь кому-то вниз по линии :)
Comments