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

Posted

技术标签:

【中文标题】Lodash - \'_\' 指的是 UMD 全局并且 lodash.js 不是模块错误【英文标题】:Lodash - '_' refers to a UMD global and lodash.js is not a module errorsLodash - '_' 指的是 UMD 全局并且 lodash.js 不是模块错误 【发布时间】:2018-05-12 13:55:41 【问题描述】:

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

'_' 指的是一个 UMD 全局,但当前文件是一个模块。考虑改为添加导入。

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

lodash.js 不是一个模块

我试图通过提问here 来寻求帮助,但由于 Angular (Angular 2) 有 another answer,所以它已关闭。我真的需要一个真正的答案,所以我重新发布了我自己的解决方案,希望有人最终能帮助我理解这个问题。

在这种情况下,我是:

    不使用 Angular 等任何框架 使用 TypeScript 使用 requirejs 导入模块 使用 Visual Studio 使用 MVC5

【问题讨论】:

【参考方案1】:

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

--allowUmdGlobalAccess 允许从模块访问 UMD 全局变量。

【讨论】:

【参考方案2】:

其他答案都不适合我。这是我解决它的方法。

使用此方法,您将能够从全局包含加载 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 的缓存库,这些库可能已经在内存中来自以前的构建、其他页面或其他站点。

【讨论】:

这是对我有用的答案。【参考方案3】:

'_' 指的是一个 UMD 全局,但当前文件是一个模块。考虑改为添加导入。

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

export = _;
export as namespace _;

这将解决错误。

***编辑****

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

declare global  

要解决这个问题,要么将属性从全局声明移动到引用它们的接口 - 要么完全删除它们并将引用的类型更改为通用的东西。我不确定哪种解决方案会产生更好的最终编译,但前者在我的应用程序中没有造成任何问题,早在 IE11 时。

【讨论】:

这只是胡乱摆弄。 @MattSom 回想起来,是的。我不知道我在做什么。你知道我是问这个问题的人吧?【参考方案4】:

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

declare const _;

它对我有用。 See also

【讨论】:

【参考方案5】:

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

【讨论】:

这不是答案。请将其作为评论插入。 @dpap 对我来说作为答案看起来不错,并且可以在 TS 中使用。 嗯嗯...这个答案导致问题第二句中概述的“lodash.js 不是模块”。所以这个答案根本没有帮助。如果“从'lodash'导入*作为_”是答案,我不会有任何麻烦,这个问题也不存在。如果您的 @typings 文件与您的框架不兼容,“import * as _ from 'lodash'”将永远无法工作。较早出现的公认答案解决了这个问题。然而,自从这篇文章以来,我拒绝在主要框架之外工作,因为没有太多支持......【参考方案6】:

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

// lodash global typing - begin
declare namespace _ 

// lodash global typing - end

【讨论】:

这不是一个真正的解决方案,更像是一种 hacky 解决方法,违背了 TS 的目的 当我尝试编译这个_.union([1], [2, 3]);我得到:Cannot use namespace '_' as a value.

以上是关于Lodash - '_' 指的是 UMD 全局并且 lodash.js 不是模块错误的主要内容,如果未能解决你的问题,请参考以下文章

如何填充依赖于全局 jQuery 和 lodash 的非 CommonJS、非 AMD 包?

vue引入 lodash

如何覆盖 TypeScript UMD 全局类型定义?

如何将lodash直接导入JavaScript中的自定义命名空间

webpack 配置全局 jQuery 对象

LayaBox---TypeScript---结构