【问题标题】:How to make the node.js require function in pure JavaScript如何在纯 JavaScript 中使 node.js 需要函数
【发布时间】:2014-02-17 18:22:07
【问题描述】:

如何在纯 JavaScript 中创建 node.js require 函数?我在网上搜索了任何解决方案,但没有找到。

类似这样的事情:

function require(path){
    //Code
    return data;
}

我已经看过的一些帖子:

【问题讨论】:

  • 这看起来很有趣。为什么要在纯 JavaScript 中实现 require 函数?
  • 这完全取决于您如何定位和加载其他脚本。

标签: javascript node.js require


【解决方案1】:

CommonJS 功能是在 Curl Library 中实现的,正如其他答案中指出的 RequireJS 遵循与 Node 的 CommonJS var foo = require('foo'); 规范不同的 AMD 规范。

卷曲特征一览:

  • 并行加载 AMD 格式的 javascript 模块
  • 加载 CommonJS/node 模块(包装在 define() 中时为 v1.1)
  • 加载 CommonJS/node 模块(使用 cjsm11 加载器时解包)
  • 也可以并行加载非 AMD javascript 文件。
  • 并行加载 CSS 文件和文本文件
  • 在执行 javascript 之前等待依赖项(js、css、文本等)
  • 如果需要,等待 domReady
  • 允许文件和依赖项的几乎无限组合
  • 在 Safari 5+、IE6+ 和最近的 Chrome、FF、Opera 上测试

Browserify 并没有直接实现 CommonJS,而是将您的 CommonJS 样式代码转换为单个 bundle.js 文件,该文件包含在 html 中。

Webmake 似乎提供了与 Browserify 类似的功能,同时也允许其他文件类型。

简而言之,CommonJS 的工作原理是这样的:

  1. 维护与已加载模块对应的标识符映射。
  2. 遇到require('lib') 时,检查列表以查看它是否已加载。如果该库尚未加载(它的密钥不在库中),则通过 XHRRequest 加载脚本。如果库已加载,则返回与key 对应的值。

这就是为什么必需的模块总是单例的。

【讨论】:

    【解决方案2】:

    code 在你的函数中应该包含完整的模块解析逻辑,这可能不是那么简单。你可以在node.js中查看module模块的源代码 -> https://github.com/joyent/node/blob/master/lib/module.js

    有多种工具可以帮助您将 CJS 模块移植到 node.js 之外(它们为您提供 require 函数):最受欢迎的是 Browserify,但您也可以查看 Webmake(我是作者)。

    【讨论】:

    • 很高兴看到除了 browserify 之外的另一个选项。
    【解决方案3】:

    RequireJS 使用 AMD 加载器,而 node.js 使用 CommonJS 模式加载。

    Browserify 允许您在构建步骤中封装所有代码,以便您可以在浏览器中使用 require() 语句。

    要推出自己的(我不建议这样做,因为 Browserify 已经是一个久经考验的流行库),您必须自己映射所有模块并预先加载它,或者同步加载它们(如这是 CommonJS 规范所必需的),以阻塞(和不受欢迎的)方式。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 2014-09-22
      • 2011-04-18
      • 2016-01-01
      • 2013-02-01
      相关资源
      最近更新 更多