是否有任何浏览器内的 javascript 库提供与 Node 的 require
相同的灵活性/模块性/易用性?
提供更多细节: require
如此优秀的原因在于:
jQuery.ajax()
的 API)var dsp = require("dsp.js");
并且我可以访问 dsp.FFT
,这不会干扰我的本地 var FFT
我还没有找到一个能有效做到这一点的图书馆。我倾向于使用的变通方法是:
Coffeescript-concat ——需要其他 js 很容易,但是你必须编译它,这意味着它对于快速开发(例如构建测试中的 API)来说不是很好
RequreJS ——它很流行,很直接,解决了1-3个问题,但是缺乏作用域是一个真正的问题(我相信 头 J是类似的,因为它缺乏作用域,尽管我从来没有机会使用它。类似地,实验室可以加载,而 .wait()
确实缓解了依赖性问题,但它仍然不做范围界定)
据我所知,对于 javascript 的动态和/或异步加载,似乎有很多解决方案,但它们往往具有与从 HTML 加载 js 相同的范围问题。最重要的是,我想要一种加载 javascript 的方法,它不会污染全局名称空间,但仍然允许我加载和使用库(就像 node 的需求那样)。
2020年更新: 现在,模组已经成为 ES6的标准,到2020年中期,大多数浏览器已经开始支持 模组。模块同时支持同步和异步(使用承诺)加载。我目前的建议是,大多数新项目应该使用 ES6模块,并使用传输器回退到旧版浏览器的单个 JS 文件。
作为一般原则,今天的带宽通常也比我最初问这个问题时宽得多。因此,在实践中,您可能会合理地选择总是使用带有 ES6模块的传输器,并将精力集中在代码效率而不是网络上。
之前的编辑(或者如果你不喜欢 ES6模块) : 自从写这篇文章以来,我已经广泛使用了 需要(现在有了更清晰的文档)。在我看来,RequreJS 确实是正确的选择。我想澄清一下,对于像我一样困惑的人来说,这个系统是如何工作的:
你可以在日常开发中使用 require
。模块可以是函数(通常是对象或函数)返回的任何内容,并且作为参数。您还可以使用 r.js
将项目编译成单个文件进行部署(在实践中,这几乎总是更快,即使 require
可以并行加载脚本)。
RequreJS 和像 Browserify (tjameson 推荐的一个很酷的项目)这样的节点风格需求之间的主要区别在于模块的设计和需求方式:
require
接受要加载的模块列表(javascript 文件)和一个回调函数。当它加载了每个模块时,它将每个模块作为参数调用回调函数。因此,它是真正的异步,因此非常适合网络。require
是一个阻塞调用,它加载模块并将其作为对象返回。这对 Node 很有效,因为文件是从文件系统中读取的,速度足够快,但是在 web 上效果很差,因为同步加载文件可能需要更长的时间。实际上,许多开发人员在看到 AMD 之前就已经使用了 Node (因此也就是 CommonJS)。此外,许多库/模块是为 CommonJS 编写的(通过向 exports
对象添加内容) ,而不是为 AMD 编写的(通过从 define
函数返回模块)。因此,许多由 Node 转型而来的 Web 开发人员希望在 Web 上使用 CommonJS 库。这是可能的,因为从 <script>
标记加载是阻塞的。像 Browserify 这样的解决方案使用 CommonJS (Node)模块并将它们包装起来,这样您就可以将它们包含在脚本标记中。
因此,如果您正在为 Web 开发自己的多文件项目,我强烈推荐 RequreJS,因为它确实是一个 Web 模块系统(尽管公平地说,我发现 AMD 比 CommonJS 自然得多)。最近,这种区别变得不那么重要了,因为 RequreJS 现在允许您基本上使用 CommonJS 语法。另外,RequreJS 可以用来在 Node 中加载 AMD 模块(尽管我更喜欢 Node-amd-loader 节点加载程序)。