【问题标题】:Lodash - '_' refers to a UMD global and lodash.js is not a module errorsLodash - '_' 指的是 UMD 全局并且 lodash.js 不是模块错误
【发布时间】:2023-03-17 00:39:01
【问题描述】:

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

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

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

lodash.js 不是一个模块

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

在这种情况下,我是:

  1. 不使用 Angular 等任何框架
  2. 使用 TypeScript
  3. 使用 requirejs 导入模块
  4. 使用 Visual Studio
  5. 使用 MVC5

【问题讨论】:

    标签: typescript asp.net-mvc-5 requirejs lodash


    【解决方案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.
        猜你喜欢
        • 2018-02-15
        • 2022-09-23
        • 2021-02-15
        • 2018-09-06
        • 1970-01-01
        • 2014-08-10
        • 2021-11-05
        • 1970-01-01
        • 2017-05-25
        相关资源
        最近更新 更多