Как я могу получить webpack для поиска угловых модулей?
я пытаюсь настроить приложение с голыми костями с Angular 1 + Typescript 2 и Webpack. Приложение работает нормально, пока я не попытаюсь использовать внешний модуль, например:angular-ui-router
.
он всегда жалуется, что не может найти зависимости:
ERROR in ./src/app.ts Module not found: Error: Cannot resolve module 'angular-ui-router' in ./src/app.ts 3:26-54
демонстрационная проблема:https://github.com/jxc876/angular-ts
я подозреваю, что я не импортирую зависимость маршрутизации правильно, попробовал:
import uiRouter from 'angular-ui-router';
import * as uiRouter from 'angular-ui-router'
попытался с angular-route
и ui-router
но не работает. Пробовал ts-loader
и awesome-typescript-loader
.
App
import * as angular from 'angular';
import uiRouter from 'angular-ui-router';
let myApp = angular.module('myApp', [uiRouter]);
myApp.config(function($stateProvider) {
let homeState = {
name: 'home',
url: '/home',
template: '<div>It works !!!</div>'
}
$stateProvider.state(homeState);
});
Config
пакета.в JSON
{
"name": "ts-demo",
"scripts": {
"start": "webpack-dev-server --content-base ./src"
},
...
"devDependencies": {
"@types/angular": "^1.5.16",
"@types/angular-ui-router": "^1.1.34",
"awesome-typescript-loader": "^3.0.0-beta.3",
"typescript": "^2.0.9",
"webpack": "^1.13.3",
"webpack-dev-server": "^1.16.2"
},
"dependencies": {
"angular": "^1.5.8",
"angular-ui-router": "^0.3.1",
"enhanced-resolve": "^2.3.0"
}
}
webpack.конфиг.js
module.exports = {
entry: './src/app',
output: {
filename: './dist/bundle.js'
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx']
},
devtool: 'source-map',
module: {
loaders: [
{
test: /.ts$/,
loader: 'awesome-typescript-loader'
}
]
}
};
tsconfig.в JSON
{
"compilerOptions": {
"outDir": "./dist/",
"allowJs": true,
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"strictNullChecks": true,
"listFiles": true
},
"include": [
"./src/**/*"
],
"exclude": [
"node_modules"
]
}
3 ответов
наконец-то понял.
первая проблема заключается в том, что компилятор TypeScript удаляет операторы импорта, которые не используются.
компилятор определяет, используется ли каждый модуль в испускаемом JavaScript. Если идентификатор модуля используется только в аннотациях типа и никогда в качестве выражения, для этого модуля не выдается вызов require. Этот отбраковка неиспользуемых ссылок является хорошей оптимизацией производительности, а также позволяет для дополнительной загрузки из этих модулей.
источник:https://github.com/Microsoft/TypeScript/issues/4717
я назначил импортированное значение фиктивному массиву и, похоже, исправил это. Регистрация значения в консоли также работает. (См. мое последнее замечание о том, почему я не мог просто передать его в массив зависимостей).
EDIT: лучшее решение-использовать import "module"; syntax
так как это всегда испускается на основе github выше, ex: import 'angular-ui-router';
во-вторых, в моем файле webpack отсутствовала пустая строка в массиве resolve:
resolve { extensions: ['', '.ts', '.js'] }
без этого он не мог вытащить файл для ui-маршрутизатора.
несколько вещей, которые я заметил во время работы над этим: webpack --display-error-details
очень полезно. По какой-то причине он искал двойной .js.js
расширения внутри node_modules/angular-ui-router/release
:
resolve file
/Users/mich2264/projects/angular-ts/node_modules/angular-ui-router/release/angular-ui-router.js.ts doesn't exist
/Users/mich2264/projects/angular-ts/node_modules/angular-ui-router/release/angular-ui-router.js.js doesn't exist
--traceResolution
одинаково полезно для typescript.
EDIT: появляется быть удивительным-typescript-loader ошибка загрузчика: https://github.com/s-panferov/awesome-typescript-loader/pull/264
наконец, я не уверен, почему, но когда я импортирую значение по умолчанию из angular-ui-router
и я регистрирую его или устанавливаю точку останова, она отображается правильно как ui.router
, но если я попытаюсь передать его в массив зависимостей, он станет неопределенным.
@types/angular-ui-router
определяет следующий экспорт внутри файла типа:export default "ui.router";
этот должен выполнить работу:
import * as angular from 'angular';
import * as uiRouter from 'angular-ui-router';
let myApp = angular.module('myApp', ['ui.router']);
обратите внимание, что импорт - это просто импорт кода маршрутизатора, и в модуль приложения вам нужно ввести 'ui.router'
строку.
Я полагаю, что так как я использую UI-маршрутизатор для AngularJS (1.x), Я должен был использовать...
import '@uirouter/angularjs'
...вместо...
import 'angular-ui-router'