javascript - 浏览器内javascript需要节点样式吗?

标签 javascript load require scoping

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

7 个月前关闭。



Improve this question




是否有任何用于浏览器内 JavaScript 的库提供与 Node 的 require 相同的灵活性/模块化/易用性? ?
提供更多细节:原因require很好的是它:

  • 允许从其他位置动态加载代码(在我看来,这比在 HTML 中链接所有代码在风格上更好)
  • 它为构建模块提供了一致的接口(interface)
  • 模块很容易依赖其他模块(例如,我可以编写一个需要 jQuery 的 API,这样我就可以使用 jQuery.ajax()
  • 加载的 javascript 是有范围的,这意味着我可以加载 var dsp = require("dsp.js");我将能够访问 dsp.FFT ,这不会干扰我的本地 var FFT

  • 我还没有找到一个有效地做到这一点的图书馆。我倾向于使用的解决方法是:
  • coffeescript-concat -- 需要其他 js 很容易,但是你必须编译它,这意味着它不太适合快速开发(例如在测试中构建 API)
  • RequireJS -- 它很流行,简单明了,可以解决 1-3,但缺乏范围界定是一个真正的交易破坏者(我相信 head.js 的相似之处在于它缺乏范围界定,尽管我从来没有机会使用它。类似地, LABjs 可以加载并且 .wait() 确实可以缓和依赖性问题,但它仍然没有进行范围界定)

  • 据我所知,javascript 的动态和/或异步加载似乎有很多解决方案,但它们往往具有与仅从 HTML 加载 js 相同的范围问题。最重要的是,我想要一种加载 javascript 的方法,它根本不会污染全局命名空间,但仍然允许我加载和使用库(就像 node 的 require 那样)。
    2020 年更新: Modules现在是 ES6 的标准,到 2020 年年中,most browsers 原生支持.模块支持同步和异步(使用 Promise)加载。我目前的建议是,大多数新项目应该使用 ES6 模块,并使用转译器为旧版浏览器回退到单个 JS 文件。
    作为一般原则,今天的带宽通常也比我最初提出这个问题时宽得多。因此,在实践中,您可能会合理地选择始终使用带有 ES6 模块的转译器,并将精力集中在代码效率而不是网络上。
    以前的编辑(或者如果您不喜欢 ES6 模块):自从写这篇文章以来,我广泛使用了 RequireJS (现在有更清晰的文档)。在我看来,RequireJS 确实是正确的选择。我想澄清一下系统如何为和我一样困惑的人工作:
    您可以使用 require在日常开发中。模块可以是函数(通常是对象或函数)返回的任何内容,并作为参数限定范围。您还可以使用 r.js 将您的项目编译成单个文件进行部署。 (实际上这几乎总是更快,即使 require 可以并行加载脚本)。
    RequireJS 和像 browserify(tjameson 推荐的一个很酷的项目)使用的 node-style require 之间的主要区别在于模块的设计和需要的方式:
  • RequireJS 使用 AMD(异步模块定义)。在 AMD,require接受要加载的模块列表(javascript 文件)和回调函数。当它加载了每个模块时,它会调用回调,并将每个模块作为回调的参数。因此它是真正异步的,因此非常适合网络。
  • Node 使用 CommonJS。在 CommonJS 中,require是一个加载模块并将其作为对象返回的阻塞调用。这对 Node 很有效,因为文件是从文件系统读取的,这足够快,但在 web 上效果很差,因为同步加载文件可能需要更长的时间。

  • 在实践中,许多开发人员在看到 AMD 之前就使用了 Node(因此也使用了 CommonJS)。此外,许多库/模块是为 CommonJS 编写的(通过向 exports 对象添加内容)而不是为 AMD(通过从 define 函数返回模块)编写的。因此,许多由 Node 转为 Web 的开发人员希望在 Web 上使用 CommonJS 库。这是可能的,因为从 <script> 加载标签被阻塞。像 browserify 这样的解决方案采用 CommonJS (Node) 模块并将它们包装起来,以便您可以将它们包含在脚本标签中。
    因此,如果您正在为 Web 开发自己的多文件项目,我强烈推荐 RequireJS,因为它确实是一个用于 Web 的模块系统(尽管公平地说,我发现 AMD 比 CommonJS 更自然)。最近,区别变得不那么重要了,因为 RequireJS 现在允许您基本上使用 CommonJS 语法。此外,RequireJS 可用于在 Node 中加载 AMD 模块(尽管我更喜欢 node-amd-loader )。

    最佳答案

    退房 ender .它做了很多这样的事情。

    另外,browserify很好。我用过 require-kiss ¹它的工作原理。可能还有其他人。

    我不确定 RequireJS。它只是与节点不同。从其他位置加载可能会遇到问题,但它可能会起作用。只要有一个提供方法或可以调用的东西。

    TL;博士 - 我建议使用 browserify 或 require-kiss。

    更新:

    1:要求亲吻现在已死,作者已将其删除。从那以后,我一直在使用 RequireJS,没有任何问题。 require-kiss 的作者写道 pakmanagerpakman .完全披露,我与开发商合作。

    我个人更喜欢 RequireJS。调试要容易得多(您可以在开发中使用单独的文件,在生产中使用单个部署的文件)并且构建在可靠的“标准”之上。

    关于javascript - 浏览器内javascript需要节点样式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971583/

    相关文章:

    javascript - 为什么即使正则表达式可以,但用正则表达式替换却不起作用?

    node.js - typescript 中的 baseUrl 和路径 - 如何

    带有进度和线程噩梦的 Java 异步数据加载

    javascript - RequireJS 的 require 调用什么时候是异步的?什么时候同步?

    PHP foreach 循环分为两个不同的包含文件

    javascript - 用 Javascript 开发 native Linux/MacOSX 应用程序的工具?

    javascript - 如何判断删除的文件是否是文件夹?

    javascript - 在 javascript Assets 中使用 Rails 辅助方法

    mysql - 负载平衡 - 它共享 MySQL 最大连接数还是授予更多连接数?

    javascript - 如何在 Electron 上加载index.html文件?