Как импортировать пакет UMD в requirejs при получении & ldquo; x не является модулем & rdquo; ошибка? [Дубликат]

Да, но только если ваша реализация включает функцию for ... of, введенную в ECMAScript 2015 (релиз «Harmony»).

Это работает например:

// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
  // ... do something with s ...
}

Или еще лучше, поскольку ECMAScript 2015 также предоставляет переменные с блочным диапазоном через let и const:

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here

Многие разработчики JavaScript все еще работа в среде, которой еще нет, однако, особенно если писать код для работы в веб-браузерах, где разработчики сайта часто не могут быть уверены в том, какой браузер / версия будут использовать их клиенты.

Если вы может предположить, что интерпретатор JavaScript соответствует версии previous спецификации ECMAScript (которая исключает, например, версии Internet Explorer до 9), тогда вы можете использовать метод итератора forEach вместо петля. В этом случае вы передаете функцию, которая будет вызываться для каждого элемента массива:

var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );

Но если даже это слишком много, чтобы предположить, и вы хотите что-то, что работает в , все версии JavaScript, тогда вам нужно использовать явный цикл подсчета. Самая безопасная версия, которая правильно обрабатывает разреженные массивы, выглядит примерно так:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i

Присвоение значения длины локальной переменной (в отличие от включения полного выражения myStringArray.length в состоянии цикла) может существенно влияют на производительность, поскольку каждый раз пропускает поиск свойств; используя Rhino на моей машине, ускорение составляет 43%.

Вы часто увидите кеширование длины, выполненное в предложении инициализации цикла, например:

var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i

Синтаксис for ... in, упомянутый другими, предназначен для перемещение по свойствам объекта; поскольку Array в JavaScript - это просто объект с именами числовых свойств (и автоматически обновляемое свойство length), вы можете теоретически перебрать его через массив. Но проблема в том, что он не ограничивается численными значениями свойств (помните, что даже методы на самом деле являются просто свойствами, значение которых является замыканием), равно как и не перебирает их в числовом порядке. Поэтому синтаксис for ... in должен использоваться для not для циклического прохождения через массивы.

194
задан Davy 7 January 2016 в 17:39
поделиться

22 ответа

Вот как это сделать с TypScript 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";

Я не уверен, в чем разница. Мы используем и предпочитаем первый синтаксис. Однако некоторые сообщают, что первый синтаксис для них не работает, а кто-то еще прокомментировал, что последний синтаксис несовместим с ленивыми загруженными модулями webpack. YMMV.

Редактировать 27 февраля 2017 года:

В соответствии с @Koert ниже import * as _ from "lodash"; является единственным рабочим синтаксисом, указанным в машинописном тексте 2.2.1, lodash 4.17.4 и @ types / lodash 4.14.53. Он говорит, что другой предложенный синтаксис импорта дает ошибку «не имеет экспорта по умолчанию».

341
ответ дан Spikeh 25 August 2018 в 15:29
поделиться

Сначала первые вещи

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

Ссылки:

Удача.

21
ответ дан Akash 25 August 2018 в 15:29
поделиться

Частичный импорт из lodash должен работать в угловом 4.1.x, используя следующие обозначения:

let assign = require('lodash/assign');

Или использовать «lodash-es» и импортировать в модуль:

import { assign } from 'lodash-es';
3
ответ дан Alex Dzeiko 25 August 2018 в 15:29
поделиться

Возможно, это слишком странно, но ни одно из вышеизложенных не помогло мне, прежде всего, потому, что я правильно установил lodash (также был переустановлен с помощью вышеупомянутых предложений).

Я исправил его просто с помощью оператора JS in.

0
ответ дан Arsen Khachaturyan 25 August 2018 в 15:29
поделиться

Обратите внимание, что 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 для дальнейшего использования.

4
ответ дан avi.elkharrat 25 August 2018 в 15:29
поделиться

Если кто-то еще сталкивается с этой проблемой, и ни одно из вышеперечисленных решений не работает из-за проблем с повторяющимся идентификатором, запустите это:

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, если у вас все еще есть проблемы.

4
ответ дан Bart 25 August 2018 в 15:29
поделиться

У меня была точно такая же проблема, но в приложении Angular2, и эта статья просто решила его: https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1 # .p6gra5eli

Резюме статьи:

  1. Установка библиотеки npm install lodash --save
  2. Добавить определения типов для Lodash tsd install underscore
  3. Включая скрипт <script src="node_modules/lodash/index.js"></script>
  4. Настройка SystemJS System.config({ paths: { lodash: './node_modules/lodash/index.js'
  5. Импорт модуля import * as _ from ‘lodash’;

Надеюсь, это может быть полезно и для вашего случая

7
ответ дан Blaise 25 August 2018 в 15:29
поделиться

Обновление 26 сентября 2016 года:

Как следует из ответа Тейтай, вместо установок «типизации», которые мы использовали несколько месяцев назад, теперь мы можем использовать:

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

Угловая 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 , и если вы не хотите импортировать каждый раз, вы можете пропустить карту и импортировать шаги и просто uncomment lodash line в tools / config / project.config.ts.

Чтобы мои тесты работали с lodash, мне также пришлось добавить строку в массив файлов в файле karma.conf.js:

'node_modules/lodash/lodash.js',
57
ответ дан Community 25 August 2018 в 15:29
поделиться

, если dosen't работает после

$ npm install lodash --save 
$ npm install --save-dev @types/lodash

, вы попробуете это и импортируете lodash

typings install lodash --save
1
ответ дан demisx 25 August 2018 в 15:29
поделиться

Начиная с TypScript 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: В приведенной выше статье интересен вопрос о улучшении времени сборки и уменьшении размера приложения

13
ответ дан Dhruvan Ganesh 25 August 2018 в 15:29
поделиться

Я использую ng2 с webpack, а не системой JS. Для меня были следующие шаги:

npm install underscore --save
typings install dt~underscore --global --save

, а затем в файле я хочу импортировать подчеркивание в:

import * as _ from 'underscore';
1
ответ дан FrontEndFire 25 August 2018 в 15:29
поделиться

Я нахожусь на 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, ...
0
ответ дан Guentersniden 25 August 2018 в 15:29
поделиться

Вы также можете пойти и импортировать с помощью доброй старой необходимости, то есть:

const _get: any = require('lodash.get');

Это единственное, что сработало для нас. Конечно, убедитесь, что вызовы require () поступают после импорта.

-1
ответ дан Marc 25 August 2018 в 15:29
поделиться

Установить все через терминал:

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'
0
ответ дан Milan Milanovic 25 August 2018 в 15:29
поделиться

Управление типами с помощью команд typings и tsd в конечном счете устарело в пользу использования npm через npm install @types/lodash.

Однако я боролся с «Не могу найти модуль lodash» в инструкции import для долгое время:

import * as _ from 'lodash';

В конечном итоге я понял, что TypScript будет загружать только типы из node_modules / @ types start version 2, а моя служба VsCode Language по-прежнему использует 1.8, поэтому редактор сообщал об ошибках.

Если вы используете VSCode, вы захотите включить

"typescript.tsdk":  "node_modules/typescript/lib"

в свой файл настроек VSCode.json (для параметров рабочей области) и убедитесь, что у вас есть машинописная версия> = 2.0.0, установленный через npm install typescript@2.0.2 --save-dev

. После этого мой редактор не будет жаловаться на инструкцию import.

1
ответ дан parliament 25 August 2018 в 15:29
поделиться

Еще одно элегантное решение - получить только то, что вам нужно, а не импортировать все lodash

import {forEach,merge} from "lodash";

, а затем использовать его в коде

forEach({'a':2,'b':3}, (v,k) => {
   console.log(k);
})
7
ответ дан Pian0_M4n 25 August 2018 в 15:29
поделиться

try >> tsd install lodash --save

-2
ответ дан rustyx 25 August 2018 в 15:29
поделиться

Установите через npm.

$ npm install lodash --save

Теперь import в файле:

$ import * as _ from 'lodash';

ENV:

Угловой CLI: 1.6.6 Узел: 6.11.2 ОС: darwin x64 Угловой: 5.2.2 машинописный: 2.4.2 webpack: 3.10.0

1
ответ дан Sajib Khan 25 August 2018 в 15:29
поделиться

Я успешно импортировал lodash в свой проект со следующими командами:

npm install lodash --save
typings install lodash --save

Затем я импортировал его следующим образом:

import * as _ from 'lodash';

и в systemjs.config.js i определил это:

map: { 'lodash' : 'node_modules/lodash/lodash.js' }

10
ответ дан smartmouse 25 August 2018 в 15:29
поделиться

Я также создал типы для lodash-es, поэтому теперь вы можете сделать следующее

install

npm install lodash-es -S
npm install @types/lodash-es -D

use

import kebabCase from "lodash-es/kebabCase";
const wings = kebabCase("chickenWings");

если вы используете rollup, я предлагаю использовать это вместо lodash, поскольку он будет treeshaken правильно.

3
ответ дан Stephen Lautier 25 August 2018 в 15:29
поделиться
  1. Установить lodash

sudo npm install typings --global npm install lodash --save typings install lodash --ambient --save

  1. В index.html добавить карту для lodash:

System.config({ packages: { app: { format: 'register', defaultExtension: 'js' } }, map: { lodash: 'node_modules/lodash/index.js' } });

  1. В модуле ltsash кода импорта .ts

import _ from 'lodash';

1
ответ дан user3437231 25 August 2018 в 15:29
поделиться

Шаг 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's 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);
23
ответ дан Vi137 25 August 2018 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: