天天看点

浏览器加载 CommonJS 模块的原理与实现

npm 的模块都是 javascript 语言写的,但浏览器用不了,因为不支持 commonjs 格式。要想让浏览器用上这些模块,必须转换格式。

浏览器加载 CommonJS 模块的原理与实现

浏览器不兼容commonjs的根本原因,在于缺少四个node.js环境的变量。

module exports require global

只要能够提供这四个变量,浏览器就能加载 commonjs 模块。

下面是一个简单的示例。

上面代码向一个立即执行函数提供 module 和 exports 两个外部变量,模块就放在这个立即执行函数里面。模块的输出值放在 module.exports 之中,这样就实现了模块的加载。

浏览器加载 CommonJS 模块的原理与实现

请看一个例子,main.js 模块加载 foo.js 模块。

使用下面的命令,就能将main.js转为浏览器可用的格式。

然后,将前面生成的compile.js解包。

可以看到,browerify 将所有模块放入一个数组,id 属性是模块的编号,source 属性是模块的源码,deps 属性是模块的依赖。

因为 main.js 里面加载了 foo.js,所以 deps 属性就指定 ./foo 对应1号模块。执行的时候,浏览器遇到 require('./foo') 语句,就自动执行1号模块的 source 属性,并将执行后的 module.exports 属性值输出。

虽然 browserify 很强大,但不能在浏览器里操作,有时就很不方便。

浏览器加载 CommonJS 模块的原理与实现

它的逻辑非常简单,就是把模块读入数组,加载路径就是模块的id。

使用的时候,先将上面的代码放入页面。然后,将模块放在如下的立即执行函数里面,就可以调用了。

还是以前面的 main.js 加载 foo.js 为例。

注意,这个库只模拟了 require 、module 、exports 三个变量,如果模块还用到了 global 或者其他 node 专有变量(比如 process),就通过立即执行函数提供即可。

(完)

继续阅读