Lodash - '_' 指的是 UMD 全局并且 lodash.js 不是模块错误

Lodash - '_' refers to a UMD global and lodash.js is not a module errors

如果我什么都不做并添加它适用于 jquery 的类型定义,但 lodash 得到

'_' referes to a UMD global, but the current file is a module. Consider adding an import instead.

如果我尝试使用导入调用的任意组合导入 lodash,我会得到

lodash.js is not a module

我试图通过向 here and it was closed because there was Angular (Angular 2) 提问来寻求帮助。我真的需要一个真正的答案,所以我重新发布了我自己的解决方案,希望有人最终能帮助我理解这个问题。

在这种情况下我是:

  1. 不使用任何框架,例如Angular
  2. 使用打字稿
  3. 使用requirejs导入模块
  4. 使用Visual Studio
  5. 使用 MVC5

'_' referes to a UMD global, but the current file is a module. Consider adding an import instead.

这是类型定义造成的。进入你的@types/lodash 文件并删除这些行:

export = _;
export as namespace _;

这将解决错误。

***编辑****

如果您的类型定义文件中有任何全局声明,则删除上面的导出语句将导致另一个错误,例如:

declare global { }

要解决此问题,请将属性从全局声明移至引用它们的接口 - 或者完全删除它们并将引用类型更改为通用类型。我不确定哪个解决方案会做出更好的最终编译,但前者在我的应用程序中没有引起任何问题,早在 IE11。

我在我的全局类型定义文件 (~\src\typings.d.ts) 中添加了以下代码来解决这个问题。我正在使用 Angular CLI 1.7

// lodash global typing - begin
declare namespace _ {
}
// lodash global typing - end

我在安装 lodash 后在我的工作文件中使用 import * as _ from 'lodash';

我在 ~\src\typings.d.ts 中添加了 :

declare const _;

对我有用。 See also

None 其他答案对我有用。这是我解决它的方法。

使用此方法,您将能够从全局包含加载 lodash

您还将拥有非常重要的类型提示,而无需将 lodash 构建到您的 webpack 包中

Lodash 现在可以在所有 ts 文件中全局访问,无需导入它

这是我的设置。

HTML

<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js" integrity="sha256-VeNaFBVDhoX3H+gJ37DpT/nTuZTdjYro9yBruHjVmoQ=" crossorigin="anonymous"></script>
</head>

NPM

npm i @types/lodash lodash --save-dev

Webpack

externals: {
    _: 'lodash'
}

global.d.ts

import _ from 'lodash';
declare global {
    const _: typeof _;
}

tsconfig.json

"types": [
    "lodash"
],

entry.ts

console.log(_.VERSION)

此方法将加快编译包所需的时间。减少您的构建大小,进而减少每次构建后客户端的下载大小,并允许客户端使用来自 CDN 的缓存库,这些库可能已经存在于之前构建、其他页面或其他站点的内存中。

有一个 compiler option 如果您知道它是安全的则允许这样做:

--allowUmdGlobalAccess Allow accessing UMD globals from modules.