Как импортировать неосновные модули npm в Angular 2, например (использовать библиотеку шифрования)?

в моем приложении Angular 2 (SystemJS module manager, Typescript как язык сценариев) мне нужно импортировать модуль npm для обработки шифрования (либо Crypto-JS;Forge-JS или любой другой, служащий этой цели)

в случае CryptoJS, после его установки через установка npm * я попытался добавить:

  <script src="node_modules/crypto-js/crypto-js.js"></script>

на индекс: html.

в моей службе (app / services / my-service.услуга.ТС) I импортируйте его через

  import {CryptoJS} from 'node_modules/crypto-js/crypto-js.js' // or /aes.js --> same issue

однако импорт работает неправильно, например

 console.log(CryptoJS);

печать неопределено.

я также попытался добавить путь модуля в

 System.config({
     // ...
     map: {
        CryptoJS
    }
}

и импортировать его в мою службу

 import {CryptoJS} from 'cryptoJs';

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

редактировать я тоже пытался...

// import ... as to overcome no default export
import * as CryptoJS from 'node_modules/crypto-js/crypto-js.js';

а то

 console.log(CryptoJS.); 

не дает никакого метода AES/whatever (мой редактор обычно советует, какие методы я мог бы использовать через автозаполнение)

Изменить 2 Теперь благодаря вкладу Тьерри и Пьерредука ясно, что типы и импорт модулей являются несвязанными понятиями.

ни один из них не работает. Вот что я сделал:--15-->

я скачал CryptoJS typings file, положил его в typings/cryptojs/cryptojs.д.ТС

затем я добавил

  /// <reference path="cryptojs/cryptojs.d.ts"/>

to typings / main.д.ТС

затем я добавил cryptojs в конфигурацию карты SystemJS:

   cryptojs: "node_modules/crypto-js/crypto-js.js"

наконец, я попытался импортировать cryptojs в мой сервис по

  import CryptoJS from 'cryptojs'

насколько я вижу, есть 2 проблемы:

  • typings не загружаются, так как нет автозаполнения при попытке импортировать модуль (я также попытался перезапустить Приложение Angular 2). Возможно, я не понял, как импортировать внешние типы?
  • модуль все равно не загружен, я вижу это по консоли.log (cryptojs) (ничего не печатается, даже не определено; маловероятно, что мои предыдущие попытки)

EDIT 3

наконец, я получил работу импорта благодаря совету Тьерри и Пьерредука (не уверен, что пошло не так в первую очередь). Однако у меня все еще есть проблемы с typings.

несмотря на Я положил

  /// <reference path="../../typings/cryptojs/cryptojs.d.ts"/>

непосредственно в моей службе, когда я пишу

  import CryptoJS from 'cryptojs';

чуть ниже этой строки я не получаю автозаполнения, и когда я начинаю Angular 2 app over by НПМ запустить, я получаю следующую ошибку и приложение не запускается

  app/services/user.service.ts(6,22): error TS2307: Cannot find module 'cryptojs'.

Примечание: если я добавлю cryptojs в конфигурацию SystemJS (но не a), а затем напишу (без импорта)

console.log(CryptoJS.AES.encrypt('my message', 'secret key123').toString());

это просто работает, но я бы предпочел решить typings + import проблемы.

5 ответов


вы можете попробовать это, так как библиотека совместима с CommonJS в вашем основном HTML-файле:

System.config({
  map: {
    cryptojs: 'node_modules/crypto-js/crypto-js.js'
  },
  (...)
});

и импортировать его таким образом:

import CryptoJS from 'cryptojs';

для части компиляции вы можете следовать предложению Пьера.

редактировать

Я сделал несколько тестов, и вот как это надо делать.

  • установка типов для crypto-js:

    $ typings install --ambient crypto-js
    
  • включите соответствуя typings в ваше файл ТС:

    /// <reference path="../typings/main/ambient/crypto-js/crypto-js.d.ts"/>
    
    import {Component} from 'angular2/core';
    (...)
    
  • настройте библиотеку в SystemJS в главном HTML-файле:

    <script>
      System.config({
        map: {
          'crypto-js': 'node_modules/crypto-js/crypto-js.js'
        },
        (...)
      });
    </script>
    
  • импортируйте библиотеку в файлы ts:

    import CryptoJS from 'crypto-js';
    

я смог заставить CryptoJS работать в проекте Angular2, созданном с помощью angular-cli, со следующими шагами / конфигурацией:

Баш

npm install crypto-js --save
typings install crypto-js --ambient --save

угловая-cli-сборка.js

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      /* ... */
      'crypto-js/**/*.+(js|js.map)'
    ]
  });
};


ответы импортируют весь crypto-js библиотека, тем самым раздувая приложение, если вы используете только небольшие его части.

Я хочу, чтобы мое приложение было максимально обрезано, поэтому это мой подход:

установить через NPM

npm install core-js@3.1.6

systemjs.конфиг.js

System.config({
    map:{
        'crypto-js':  'node_modules/crypto-js',
        ...
    },
    packages:{
        'crypto-js': {main: './index.js', defaultExtension: 'js', format: 'cjs'},
        ...
    }
});

компонент.ТС

//only the core + the modules you need
import CryptoJS from 'crypto-js/core';
import 'crypto-js/sha1';

у этого есть несколько недостатков. Методы сочетания не работают я:

не работает

let hash = CryptoJS.SHA1('abcdefghi'); // CryptoJS.SHA1 is undefined

работает

let sha1 = CryptoJS.algo.SHA1.create();
sha1.update("abcdefghi");
let hash = sha1.finalize();

чтобы избежать ошибки компилятора "Could not find module x", мне нужно было добавить следующее к таможни.вводы.д.ТС

declare module 'crypto-js/core'

затем ссылка на типизации из my main.ТС

///<reference path="./app/custom.typings.d.ts"/>

основным недостатком является то, что типы, упомянутые в других ответах, похоже, не работают с этим подходом, потому что они предназначены для целое crypto-js библиотека. Например, CryptoJS.algo не признала. Так что это действительно отстой, но у меня нет intellisense / автозаполнения в IDE

так зачем же ставить с таким недостатком? В то время как вся библиотека добавляет около 60 КБ minified JS в мое приложение, импорт только того, что мне нужно, добавляет 4.5 КБ. И это победа для меня.


для установки пакета cryptojs выполните следующую команду:

npm установить crypto-js --save

после завершения вышеуказанной установки, если вы используете webpack / bundles или обновленные версии angularjs, запустите следующую команду, чтобы получить файлы объявлений.

npm install --save @types / crypto-js

в @типах node_modules d.файлы ts будут добавлены, чтобы устранить ошибку, связанную с импортом для cryptojs. Это сработало для меня.


когда я попытался запустить:

typings install --ambient crypto-js

Я получил ошибку:

typings ERR! устаревший флаг" ambient " является устаревшим. Пожалуйста, используйте "global" вместо

вместо этого поместите эту строку в typings.файл json, он работал.

"crypto-js": "реестр: DT / crypto-js#3.1.4+20160505170201"