Using Underscore.js with require.js: Uncaught ReferenceError: _ is not defined

问题描述 投票:0回答:1

我有

Underscore.js 1.13.2
,我使用
requireJS 2.1.14
包含它。

paths = {
'underscore': my_folder_path + "/underscore", // for underscore.js
.. //path of other files
}

我在浏览器的网络选项卡中看到加载了 underscore.js。但是,当我尝试在其他文件中使用

_
时,我看到以下错误。

Uncaught ReferenceError: _ is not defined

注意:我完全相同的配置适用于

Underscore.js 1.6.0
requireJS 2.1.14

javascript requirejs underscore.js
1个回答
0
投票

如果你使用模块系统,无论是AMD、CommonJS、ESM还是浏览器全局变量,你都需要坚持下去。换句话说,每个使用 Underscore 的 AMD 模块都应该以相同的方式导入它:

define(['underscore', ...], function(_, ...) {
    // code that uses _
});

旧版本的 Underscore 使用了一个宽松的、手写的 UMD 包装器,它可以让你摆脱混合浏览器全局变量和另一个模块系统的麻烦。在您的情况下,这意味着只要有一个模块以 AMD 方式导入 Underscore,所有稍后加载的模块都可以假定它作为浏览器全局存在。然而,重要的是要认识到以这种方式编写的代码永远不会有效,即使它是偶然工作的。模块系统的真正目的是您以一致的方式明确声明您的依赖关系。此外,通过假设浏览器全局存在,您可以使一个模块隐式依赖于另一个进行实际导入的模块。

从 1.10 版本开始,Underscore 是 ESM 原生的,UMD 包装器由捆绑工具生成,这对一次只启用一个模块系统更加严格。这解释了为什么您的(无效!)设置不再有效。出于同样的原因,您不能再在 AMD 或 CommonJS 环境中使用

_.noConflict
。做这样的事情一开始就没有意义,但有些人错误地依赖了它,所以他们的代码在 1.10 发布时崩溃了。

也许是一个令人欣慰的想法:即使多个模块依赖 Underscore,require.js 也只会加载一次。

© www.soinside.com 2019 - 2024. All rights reserved.