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) 提问来寻求帮助。我真的需要一个真正的答案,所以我重新发布了我自己的解决方案,希望有人最终能帮助我理解这个问题。
在这种情况下我是:
- 不使用任何框架,例如Angular
- 使用打字稿
- 使用requirejs导入模块
- 使用Visual Studio
- 使用 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.
如果我什么都不做并添加它适用于 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
- 使用打字稿
- 使用requirejs导入模块
- 使用Visual Studio
- 使用 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.