我有一个困难的时间试图得到lodash模块导入。我已经使用npm+gulp设置了我的项目,并不断撞击相同的墙。我试过普通的lodash,也试过lodash。

lodash npm包:(在包根文件夹中有一个index.js文件)

import * as _ from 'lodash';    

结果:

error TS2307: Cannot find module 'lodash'.

lodash-es npm包:(在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']);

如果我理解正确,我的tsconfig中的modulerresolution:'node'应该将import语句指向node_modules文件夹,其中安装了lodash和lodash-es。我还尝试了许多不同的导入方法:绝对路径、相对路径,但似乎都不起作用。什么好主意吗?

如果有必要,我可以提供一个小zip文件来说明这个问题。


当前回答

从lodash部分导入应该在angular 4.1中工作。X使用以下符号:

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

或者使用'lodash-es'并在module中导入:

import { assign } from 'lodash-es';

其他回答

2016年9月26日更新:

正如@Taytay的回答所说,我们现在可以使用几个月前使用的“typings”安装:

npm install --save @types/lodash

以下是支持这个答案的一些参考文献:

https://www.npmjs.com/package/@types/lodash NPM @types org包中的TypeScript类型

如果仍在使用类型安装,请参阅下面(其他人)关于“'——ambient''和'——global " ''的评论。

此外,在新的快速入门中,配置不再在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快速入门使用System.js,所以我在index.html的配置中添加了'map',如下所示:

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开始,如果你不想每次都导入,你可以跳过映射和导入步骤,只需取消tools/config/project.config.ts中的lodash行注释。

为了让我的测试与lodash一起工作,我还必须在karma.conf.js中的文件数组中添加一行:

'node_modules/lodash/lodash.js',

你也可以通过旧的require来导入,比如:

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

这是唯一对我们有效的方法。当然,要确保所有require()调用都在导入之后。

通过npm安装。

$ npm install lodash --save

现在在文件中导入:

$ import * as _ from 'lodash';

ENV:

Angular CLI: 1.6.6 节点:6.11.2 操作系统:darwin x64 角:22 打印稿:2.4.2 webpack: 3.10.0

我还为lodash创建了类型,所以现在您实际上可以执行以下操作

安装

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

使用

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

如果您使用rollup,我建议使用它而不是lodash,因为它将正确地进行树摇。

如果其他人遇到这个问题,并且由于“重复标识符”问题,上述解决方案都不起作用,运行这个:

npm install typings --global

对于旧版本的类型,事情会变得混乱,你会得到一堆“重复标识符”的问题。你也不需要再使用环境,就我所知。

因此,一旦类型是最新的,这应该可以工作(使用Angular 2快速入门)。

Run:

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

首先,将它添加到systemjs.config.js:

'lodash':                     'node_modules/lodash/lodash.js'

现在你可以在任何文件中使用它:import * as _ from 'lodash';

如果你仍然有问题,删除你的typings文件夹并运行npm install。