javascript 节点模块和纯脚本引用如何在浏览器中共存?

How do javascript node modules and plain script references co-exist in the browser?

采用模块化javascript方式开发时,Node.JS+npm和browserify捆绑到浏览器,如何应对可能需要使用的情况javascript 没有在 npm 中分发的库?最终,这些库甚至不兼容模块化 (amd/commonJs),因为它们不以模块化方式公开任何内容。其中一些存在于 bower 中,我知道对于这些情况,有诸如 browserify transform debowerify 之类的资源,但是如果预期的库本身不像模块那样工作,那将没有任何帮助。

所以,我还想弄清楚的是:一旦你通过 node.js + npm 模块走上了模块化 javascript 的道路,它是否会超出使用范围任何不兼容模块化的库?

举个具体的例子:

我有和 main.js 一个应用程序的入口点(安装了 npm 包 knockout),代码如下:

var ko = require('knockout');

我知道当这个 ko 变量通过 browserify 到达浏览器时,它没有绑定到全局范围,而是有自己的范围,基本上捕获了 npm 加载的那个 knockout file/module 中定义的所有内容。

然后我有一个不是节点模块的第 3 方库,它通过使用 knockout 提供 dom 操作。我必须为第 3 方库提供先决条件,作为附加的显式 <script> 标记引用我的 html 文件中的敲除,这样就可以将其挂钩到全局 (window) 范围.然后我会在两个地方进行淘汰赛,但彼此隔离。例如,我的 main.js 中的 ko.applyBindings 对于依赖于全局范围内的 knockout 的其他库来说是未知的。

我的模块化 javascript 实现如何(如果可能的话)处理这两个方面的 dom 操作的共存?或者对于这种情况是否必须采用互斥的编程模式(所有模块或所有非模块)?

嗯,两个字:

浏览器化 shim

希望之前有人回答过。不管怎样,还是很值得自己一探究竟的。我已经做到了,它有效。好好读书。

Make CommonJS-Incompatible Files Browserifyable