Angular2 & TypeScript импорт node_modules

У меня было очень простое приложение "hello world" Angular2. Я также сделал явно необоснованное решение работать с разными структурами каталогов между моим проектом dev и конечной папкой развертывания на моем сервере spring.

Из-за этой разницы у меня возникла проблема с импортом TypeScript, и эта строка закончила выпуск 404 ошибок (не удалось найти /angular2/​​core library), когда я попытался открыть фактическое приложение в своем браузере

import {Component, View} from 'angular2/core';

Короче говоря, я закончил тем, что добавил обратно папку /app, чтобы все работало, но в итоге я изменил свои инструкции импорта следующим образом:

import {Component, View} from '../node_modules/angular2/core';

Это, однако, оказалось причиной какого-то странного поведения. По какой-то причине указание ../node_modules в путях библиотеки приводит к тому, что JS фактически загружает файлы ALL Angular2 с нуля, используя вызовы ajax для извлечения каждого отдельного файла из папки npm_modules/angular2/, даже если это было частью моего заголовка HTML

<script src="/node_modules/angular2/bundles/angular2.dev.js"></script>

Когда я наконец понял, что происходит, я вернул оператор импорта обратно в

import {Component, View} from 'angular2/core';

и все это сработало. Angular2 теперь полностью загружен из тега script выше и не было файлов, загружаемых дополнительными вызовами ajax.

Может кто-нибудь объяснить, что это вызывает? Я предполагаю, что это нормальное поведение, но я не понимаю, как работает импорт, и почему указание более подробного пути делает такую ​​разницу.

Ответ 1

Правила import TypeScript соответствуют тому же соглашению, что и node.js. Если импорт начинается с точки:

import {Something} from './some/path';

Затем он рассматривается как относительный путь из файла, объявляющего импорт. Если, однако, это абсолютный путь:

import {Component} from 'angular2/core';

Тогда предполагается, что это внешний модуль, поэтому TypeScript будет перемещаться по дереву, ищущему файл package.json, затем перейдите в папку node_modules и найдите папку с тем же именем, что и импорт, затем просматривает package.json модуля для основного файла .d.ts или .ts, а затем загружает его или будет искать файл с тем же именем, что и указанный, или index.d.ts или index.ts.

Ничего себе, кажется сложным, когда выписано, и там есть некоторые исключения... Но в целом, если вы работали с node.js до этого, это должно вести себя точно так же.

Следует отметить, что существует опция компилятора TypeScript, которая должна быть настроена для ввода разрешений для работы таким образом.

в tsconfig.json

"moduleResolution": "node"

Теперь вторая часть вашего вопроса заключалась в том, как это загружается без использования вызовов ajax. Это особенность System.js. Тег script, загруженный в файл index.html, импортирует пакет, который регистрирует пакет angular2 с помощью System. Как только это произошло, система знает об этих файлах и правильно назначает их своим ссылкам. Это довольно глубокая тема, но много информации можно найти либо в README systemjs, либо systemjs-builder.