【问题标题】:Module definition to work with node.js, require.js and with plain scripttags too模块定义可与 node.js、require.js 和纯脚本标签一起使用
【发布时间】:2014-05-19 09:48:33
【问题描述】:

我正在开发一个应该在 3 种环境中工作的 javascript 模块/库:

  1. 在 node.js 中
  2. 在requirejs中
  3. 仅使用标签包含在网页中时。在这种情况下,整个模块应该挂在 window.myModule 下

您对如何编写库的结构以使其适用于所有这些环境有什么建议吗?

编辑:基本上我的意思是库周围的某种包装代码,以便我可以从这三种方法中的任何一种调用文件,我很好......

【问题讨论】:

    标签: javascript node.js requirejs


    【解决方案1】:

    此要求及其解决方案称为通用模块定义 (UMD)。目前是一份提案草案。背景和当前状态在Addy Osmani - Writing Modular JavaScript With AMD, CommonJS & ES Harmony 文章中进行了描述。查找指向您可以使用的各种模板的“UMD”链接。

    可以在网络上找到很多其他模板 - UMD 是搜索关键字。

    (我自己还没有找到最终链接:)

    【讨论】:

      【解决方案2】:

      我认为我们正在做同样的事情。

      我们取得了一些成功。我们有库(我们称之为“slib”),编译为 AMD js 文件。它不依赖于npm模块或浏览器,因此可以从节点和浏览器调用。

      1) 要从节点调用它,我们使用 requirejs:

      文件 require.conf.js

      module.exports = function(nodeRequire){
          global.requirejs = require('requirejs');
      
          requirejs.config({
              baseUrl: __dirname+"/../web/slib/",
              paths: {
                  slib: "."
      
              },
              nodeRequire: nodeRequire
          });
      }
      

      在任何其他服务器端(nodejs)文件中,我们在开头添加这一行

      require("./require.conf")(require);
      

      然后我们调用slib的代码:

      var Computation = requirejs("slib/Computation");
      

      2) 要从浏览器调用 slib,我们只需要使用 requirejs。它处理一切都很好。

      3) 我们不需要直接从

      看来你可以使用 browserfy 让一些 npm 模块可以从 slib 的代码中访问,但我们还没有尝试过。 另外,我认为在 node 端使用 requirejs 可以更简单(为什么我们需要第二个 'requirejs' 函数和 node 的函数?)我们只是没有很好地研究它,但这很有效。

      在任何 slib 模块中你都可以写

      if (window)
          window.module1 = this // or whatever
      

      它会在加载时导出为旧的 js lib

      【讨论】:

      • 改用 webpack 并快乐
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多