假设的遗留方案:
假设我有4个脚本,它们被简单地串联在一起作为一个脚本进行部署,以在浏览器中为实用程序库提供全局名称空间。
然后,我有1个利用该库的独立应用程序脚本。
就像是:
<script src="library.js"></script>
<script src="app.js"></script>
在我的app.js脚本中,通过其名称空间对库方法进行了调用,例如
var id = lib.id(prefix);
我看到4个库脚本中的1个是有用的实用程序,我想将其转换为Node模块。我复制它并创建一个包,然后将其发布到npm以用于新开发中。
问题:现在,我需要维护此脚本的两个版本-一个用于Node,一个用于旧版库。
有没有一种方法可以在Node模块和旧版库中包含一个通用文件?还是我坚持维护文件的两个版本,直到我们逐步淘汰旧代码?
附加信息:
我查看了browserify和webpack,以为它们可能有用,但是它们都遇到了一个我不知道如何解决的问题。除非最终模块定义了全局变量,否则我无法在旧版代码中使用该模块,因为没有可用的require命令。换句话说,我无法浏览节点模块,然后将其放入旧版网页并在现有的app.js中使用,因为我无法调用
var mymodule = require('mymodule')
。有什么方法可以让browserify或webpack定义和公开require函数,以允许我从旧版代码库访问新的Node模块?当然,这不是唯一的情况。 最佳答案
最好的选择是使用UMD pattern以确保该模块既可以用作全局系统,也可以在commonJS(即节点)系统中使用。
最适合您的模式是returnExports。这样可以确保所有导出的属性都应用于全局对象(即window)或节点中的模块对象。
由于您未使用AMD,因此可以稍微简化模式,并删除第18和42行上的if语句的第一块。
这将需要您重新组织代码,以使其与模式匹配。
您还可以使用其他模式,例如commonJsStrictGlobal,但我个人更喜欢returnExports。