模块定义与node.js,require.js和纯脚本标签一起工作

我正在一个JavaScript模块/库,应该在3个环境中工作:

  1. 在node.js中
  2. 在requirejs中
  3. 当简单地包括使用标签到网页。 在这种情况下,整个模块应该连接到window.myModule下

对于如何编写库的结构,你有什么build议,以便它可以在所有这些环境中工作?

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

这个要求及其解决scheme被称为通用模块定义(UMD) 。 目前这是一个提案草案。 背景和现状在Addy Osmani中描述- 使用AMD,CommonJS&ES Harmony文章编写模块化JavaScript 。 寻找指向您可以使用的各种模板的“UMD”链接。

在networking上可以find许多其他模板 – UMD是search关键字。

(自己还没find最后的链接:)

我想,我们正在做同样的事情。

我们取得了一些成功。 我们有库(我们称之为'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 }); } 

在其他serverside(nodejs)文件中,我们在开头添加这行

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

那么我们通过以下方式调用slib的代码:

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

2)从浏览器调用slib,我们只使用requirejs。 它处理一切正常。

3)我们不需要直接从<script>调用slib。 对于生产,我们使用r.js来创build一个包含大多数依赖关系的js文件,并在页面上用一个<script>来使用它。 这个脚本下载所有其他的代码,如果它们不包含,使用标准的requirejs,它不需要requirejs(据我所知),它只是单独工作。 这对于大型项目非常灵活:在开发时使用requirejs,使用r.js将核心文件捆绑到生产中以加快页面加载速度,如果只需要一个<script>而没有任何其他请求,则使用整个bundle。 r.js正确捆绑了所有的依赖关系,包括旧的js库,它们通常只使用<script>加载,并且可以通过window.myOldLibrary在config上使用shim param来访问。

看来你可以使用browserfy来从slib的代码中访问一些npm模块,但是我们还没有尝试过。 另外,在节点一方使用requirejs,我认为可以更简单(为什么我们需要第二个'requirejs'函数和节点一起?)我们只是没有调查好,但是这个工作。

在任何slib模块中,您都可以编写

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

并且会在加载时被作为旧的js库导出