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 包?