Как я могу получить 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'