Импорт lodash в приложение angular2 + typescript
Мне тяжело пытаться импортировать модули lodash. Я настроил свой проект, используя npm + gulp, и продолжаю ударять по одной стене. Я пробовал обычный lodash, но также lodash-es.
Пакет lodash npm: (имеет файл index.js в корневой папке пакета)
import * as _ from 'lodash';
Результаты в:
error TS2307: Cannot find module 'lodash'.
Пакет lodash-es npm: (имеет экспорт defaut в lodash.js я в корневую папку пакета)
import * as _ from 'lodash-es/lodash';
Результаты в:
error TS2307: Cannot find module 'lodash-es'.
Обе задачи gulp и webstorm сообщают о той же проблеме.
Забавный факт, это не возвращает ошибки:
import 'lodash-es/lodash';
... но, конечно, нет "_"...
Мой файл tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
},
"exclude": [
"node_modules"
]
}
Мой gulpfile.js:
var gulp = require('gulp'),
ts = require('gulp-typescript'),
uglify = require('gulp-uglify'),
sourcemaps = require('gulp-sourcemaps'),
tsPath = 'app/**/*.ts';
gulp.task('ts', function () {
var tscConfig = require('./tsconfig.json');
gulp.src([tsPath])
.pipe(sourcemaps.init())
.pipe(ts(tscConfig.compilerOptions))
.pipe(sourcemaps.write('./../js'));
});
gulp.task('watch', function() {
gulp.watch([tsPath], ['ts']);
});
gulp.task('default', ['ts', 'watch']);
Если я правильно понимаю, moduleResolution: 'node' в моем tsconfig должен указывать операторы импорта в папку node_modules, где установлены lodash и lodash-es. Я также пробовал много разных способов импорта: абсолютные пути, относительные пути, но ничего не работает. Есть идеи?
При необходимости я могу предоставить небольшой zip файл, чтобы проиллюстрировать проблему.
Ответы
Ответ 1
Вот как это сделать с Typescript 2.0:
(tsd и typings устарели в пользу следующего):
$ npm install --save lodash
# This is the new bit here:
$ npm install --save-dev @types/lodash
Затем в вашем файле .ts:
Или:
import * as _ from "lodash";
Или (как предложено @Naitik):
import _ from "lodash";
Я не уверен, в чем разница. Мы используем и предпочитаем первый синтаксис. Однако некоторые сообщают, что первый синтаксис у них не работает, а кто-то другой заметил, что последний синтаксис несовместим с лениво загруженными модулями веб-пакетов. YMMV.
Изменить 27 февраля 2017 г.:
Согласно @Koert ниже, import * as _ from "lodash";
является единственным рабочим синтаксисом на Typescript 2.2.1, lodash 4.17.4 и @types/lodash 4.14.53. Он говорит, что другой предложенный синтаксис импорта выдает ошибку "не имеет экспорта по умолчанию".
Ответ 2
Обновление 26 сентября 2016 года:
Как сказано в ответе @Taytay, вместо установок "typings", которые мы использовали несколько месяцев назад, теперь мы можем использовать:
npm install --save @types/lodash
Вот несколько дополнительных ссылок, поддерживающих этот ответ:
Если вы все еще используете установку типирования, см. комментарии ниже (другими) относительно '' '--ambient' '' и '' '--global' ''.
Кроме того, в новом Quick Start, config больше не находится в index.html; это теперь в systemjs.config.ts(если используется SystemJS).
Исходный ответ:
Это сработало на моем mac (после установки Angular 2 по Быстрый старт):
sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
Вы найдете различные файлы, затронутые, например.
- /typings/main.d.ts
- /typings.json
- /package.json
Angular 2 Quickstart использует System.js, поэтому я добавил "map" в config в index.html следующим образом:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/lodash.js'
}
});
Тогда в моем .ts-коде мне удалось:
import _ from 'lodash';
console.log('lodash version:', _.VERSION);
Редактирует с середины 2016 года:
Как упоминает @tibbus, в некоторых контекстах вам нужно:
import * as _ from 'lodash';
Если вы начинаете с angular2-seed, и если вы не хотите импортировать каждый раз, вы можете пропустить карту и импортировать шаги и просто раскомментируйте строку lodash в tools/config/project.config.ts.
Чтобы мои тесты работали с lodash, мне также пришлось добавить строку в массив файлов в файле karma.conf.js:
'node_modules/lodash/lodash.js',
Ответ 3
Шаг 1: Измените файл package.json, чтобы включить lodash в зависимости.
"dependencies": {
"@angular/common": "2.0.0-rc.1",
"@angular/compiler": "2.0.0-rc.1",
"@angular/core": "2.0.0-rc.1",
"@angular/http": "2.0.0-rc.1",
"@angular/platform-browser": "2.0.0-rc.1",
"@angular/platform-browser-dynamic": "2.0.0-rc.1",
"@angular/router": "2.0.0-rc.1",
"@angular/router-deprecated": "2.0.0-rc.1",
"@angular/upgrade": "2.0.0-rc.1",
"systemjs": "0.19.27",
"es6-shim": "^0.35.0",
"reflect-metadata": "^0.1.3",
"rxjs": "5.0.0-beta.6",
"zone.js": "^0.6.12",
"lodash":"^4.12.0",
"angular2-in-memory-web-api": "0.0.7",
"bootstrap": "^3.3.6" }
Шаг 2: Я использую загрузчик модуля SystemJs в приложении angular2. Поэтому я бы изменил файл systemjs.config.js для отображения lodash.
(function(global) {
// map tells the System loader where to look for things
var map = {
'app': 'app', // 'dist',
'rxjs': 'node_modules/rxjs',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'@angular': 'node_modules/@angular',
'lodash': 'node_modules/lodash'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' },
'lodash': {main:'index.js', defaultExtension:'js'}
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade',
];
// add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
}
// filterSystemConfig - index.html chance to modify config before we register it.
if (global.filterSystemConfig) { global.filterSystemConfig(config); }
System.config(config);})(this);
Шаг 3: Теперь сделайте npm install
Шаг 4: Использовать lodash в вашем файле.
import * as _ from 'lodash';
let firstIndexOfElement=_.findIndex(array,criteria);
Ответ 4
Перво-наперво
npm install --save lodash
npm install -D @types/lodash
Загрузите полную библиотеку lodash
//some_module_file.ts
// Load the full library...
import * as _ from 'lodash'
// work with whatever lodash functions we want
_.debounce(...) // this is typesafe (as expected)
ИЛИ загружайте только те функции, с которыми мы будем работать
import * as debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
UPDATE - March 2017
В настоящее время я работаю с ES6 modules
, и недавно я смог работать с lodash
следующим образом:
// the-module.js (IT SHOULD WORK WITH TYPESCRIPT - .ts AS WELL)
// Load the full library...
import _ from 'lodash'
// work with whatever lodash functions we want
_.debounce(...) // this is typesafe (as expected)
...
ИЛИ import
специфично lodash functionality
:
import debounce from 'lodash/debounce'
//work with the debounce function directly
debounce(...) // this too is typesafe (as expected)
...
ПРИМЕЧАНИЕ - разница в * as
не требуется в syntax
Ссылки:
![enter image description here]()
Удачи.
Ответ 5
Так как Typescript 2.0, для импорта титров используются модули @types npm.
# Implementation package (required to run)
$ npm install --save lodash
# Typescript Description
$ npm install --save @types/lodash
Теперь, когда этот вопрос был дан ответ, я расскажу, как эффективно импортировать lodash
Отказоустойчивый способ импорта всей библиотеки (в main.ts)
import 'lodash';
Это новый бит здесь:
Реализация более легкого lodash с функциями, которые вам требуются
import chain from "lodash/chain";
import value from "lodash/value";
import map from "lodash/map";
import mixin from "lodash/mixin";
import _ from "lodash/wrapperLodash";
источник: https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba#.kg6azugbd
PS: В приведенной выше статье интересен вопрос об улучшении времени сборки и уменьшении размера приложения
Ответ 6
Я успешно импортировал lodash в свой проект со следующими командами:
npm install lodash --save
typings install lodash --save
Затем я импортировал его следующим образом:
import * as _ from 'lodash';
и в systemjs.config.js я определил это:
map: { 'lodash' : 'node_modules/lodash/lodash.js' }
Ответ 7
У меня была точно такая же проблема, но в приложении Angular2, и эта статья просто решила его: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.p6gra5eli p >
Резюме статьи:
- Установка библиотеки
npm install lodash --save
- Добавить TypeScript Определения для Lodash
tsd install underscore
- Включая Script
<script src="node_modules/lodash/index.js"></script>
- Настройка SystemJS
System.config({
paths: {
lodash: './node_modules/lodash/index.js'
- Импортирующий модуль
import * as _ from ‘lodash’;
Я надеюсь, что это может быть полезно и для вашего случая.
Ответ 8
Еще одно элегантное решение - получить только то, что вам нужно, а не импортировать все lodash
import {forEach,merge} from "lodash";
а затем используйте его в своем коде
forEach({'a':2,'b':3}, (v,k) => {
console.log(k);
})
Ответ 9
Если кто-то еще сталкивается с этой проблемой, и ни одно из вышеперечисленных решений не работает из-за проблем с повторяющимся идентификатором, запустите это:
npm install typings --global
С более старыми версиями типизации все испортится, и вы получите кучу проблем "Дублирующий идентификатор". Насколько мне известно, вам больше не нужно использовать --ambient
.
Итак, как только типизация обновляется, это должно работать (используя быстрый старт Angular 2).
Run:
npm install lodash --save
typings install lodash --save
Сначала добавьте это в systemjs.config.js:
'lodash': 'node_modules/lodash/lodash.js'
Теперь вы можете использовать его в любом файле: import * as _ from 'lodash';
Удалите свою папку с образцами и запустите npm install
, если у вас все еще есть проблемы.
Ответ 10
Обратите внимание, что npm install --save
будет способствовать любой зависимости, которую требует ваше приложение в производственном коде.
Что касается "typings", это требуется только TypeScript, который в конечном итоге переводится в JavaScript. Поэтому вы, вероятно, не хотите иметь их в производственном коде. Я предлагаю добавить его в ваш проект devDependencies
, используя
npm install --save-dev @types/lodash
или
npm install -D @types/lodash
(см., например, сообщение Акаша). Кстати, это так, как это делается в ng2 tuto.
В качестве альтернативы, вот как выглядит ваш package.json:
{
"name": "my-project-name",
"version": "my-project-version",
"scripts": {whatever scripts you need: start, lite, ...},
// here comes the interesting part
"dependencies": {
"lodash": "^4.17.2"
}
"devDependencies": {
"@types/lodash": "^4.14.40"
}
}
только совет
Самое приятное в npm
заключается в том, что вы можете просто начать с npm install --save
или --save-dev
, если вы не уверены в последней доступной версии зависимостей, которую вы ищете, и она автоматически установит ее для вас в вашем package.json
для дальнейшего использования.
Ответ 11
Я также создал типизацию для lodash-es
, поэтому теперь вы можете сделать следующее
установки
npm install lodash-es -S
npm install @types/lodash-es -D
Использование
import kebabCase from "lodash-es/kebabCase";
const wings = kebabCase("chickenWings");
если вы используете rollup, я предлагаю использовать это вместо lodash
, поскольку он будет treeshaken правильно.
Ответ 12
Частичный импорт из lodash должен работать в angular 4.1.x, используя следующие обозначения:
let assign = require('lodash/assign');
Или используйте 'lodash-es' и импортируйте в модуль:
import { assign } from 'lodash-es';
Ответ 13
Установить через npm
.
$ npm install lodash --save
Теперь import
в файле:
$ import * as _ from 'lodash';
ENV:
Angular CLI: 1.6.6
Node: 6.11.2
OS: darwin x64
Angular: 5.2.2
typescript: 2.4.2
webpack: 3.10.0
Ответ 14
sudo npm install typings --global
npm install lodash --save
typings install lodash --ambient --save
- В index.html добавьте карту для lodash:
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
map: {
lodash: 'node_modules/lodash/index.js'
}
});
- В модуле импорта lodash кода .ts
import _ from 'lodash';
Ответ 15
Я использую ng2 с webpack, а не системой JS. Мне нужны были шаги:
npm install underscore --save
typings install dt~underscore --global --save
а затем в файле я хочу импортировать подчеркивание в:
import * as _ from 'underscore';
Ответ 16
Управление типами с помощью команд typings
и tsd
в конечном счете устаревает в пользу использования npm через npm install @types/lodash
.
Тем не менее, я долго боролся с "Не могу найти модуль lodash" в инструкции import:
import * as _ from 'lodash';
В конечном итоге я понял, что Typescript будет загружать только типы из node_modules/@types start version 2, а моя служба VsCode Language по-прежнему использует 1,8, поэтому редактор сообщает об ошибках.
Если вы используете VSCode, вы хотите включить
"typescript.tsdk": "node_modules/typescript/lib"
в вашем файле настроек VSCode.json(для параметров рабочей области) и убедитесь, что у вас установлена Typescript версия >= 2.0.0 с помощью npm install [email protected] --save-dev
После этого мой редактор не будет жаловаться на инструкцию import.
Ответ 17
если dosen't работает после
$ npm install lodash --save
$ npm install --save-dev @types/lodash
попробуйте это и импортируйте lodash
typings install lodash --save
Ответ 18
Установить все через терминал:
npm install lodash --save
tsd install lodash --save
Добавить пути в index.html
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
}
},
paths: {
lodash: './node_modules/lodash/lodash.js'
}
});
System.import('app/init').then(null, console.error.bind(console));
</script>
Импортировать lodash в начало файла .ts
import * as _ from 'lodash'
Ответ 19
Я нахожусь на Angular 4.0.0, используя preboot/angular-webpack и должен идти немного иначе.
Решение, предоставленное @Taytay, в основном работало для меня:
npm install --save lodash
npm install --save @types/lodash
и импортировать функции в данный файл .component.ts, используя:
import * as _ from "lodash";
Это работает, потому что нет экспортированного класса по умолчанию. Разница в моей: мне нужно было найти способ, который был загружен в сторонние библиотеки: vendor.ts, который сидел в:
src/vendor.ts
Мой файл vendor.ts выглядит следующим образом:
import '@angular/platform-browser';
import '@angular/platform-browser-dynamic';
import '@angular/core';
import '@angular/common';
import '@angular/http';
import '@angular/router';
import 'rxjs';
import 'lodash';
// Other vendors for example jQuery, Lodash or Bootstrap
// You can import js, ts, css, sass, ...
Ответ 20
Может быть, это слишком странно, но ничего из вышеперечисленного не помогло мне, прежде всего, потому что я правильно установил lodash (также переустановил с помощью приведенных выше предложений).
Короче говоря, проблема была связана с использованием метода _.has
из lodash.
Я исправил это, просто используя оператор JS in
.
Ответ 21
npm install --save @types/lodash
https://www.npmjs.com/package/@types/lodash
Ответ 22
попробуйте → tsd install lodash --save
Ответ 23
Вы также можете выполнить импорт через старые добрые запросы, например:
const _get: any = require('lodash.get');
Это единственное, что сработало для нас. Конечно, убедитесь, что любые вызовы require() идут после импорта.