【发布时间】:2016-07-27 01:43:31
【问题描述】:
假设我正在用 JavaScript 编写一个模块,它可以在浏览器和服务器(使用 Node)上使用。我们称之为模块。假设 Module 将受益于另一个名为 Dependancy 的模块中的方法。这两个模块都被编写为供浏览器和服务器使用,就像 CommonJS 风格:
module.js
if (typeof module !== 'undefined' && module.exports)
module.exports = Module; /* server */
else
this.Module = Module; /* browser */
dependancy.js
if (typeof module !== 'undefined' && module.exports)
module.exports = Dependancy; /* server */
else
this.Dependancy = Dependancy; /* browser */
显然,Dependancy 可以直接在浏览器中使用。但是,如果 Module 中包含 var dependancy = require('dependency'); 指令,那么“维护”模块就会变得更加麻烦。
我知道我可以在 Module 中对 Dependancy 执行全局检查,如下所示:
var dependancy = this.Dependancy || require('dependancy');
但这意味着我的模块对浏览器安装有两个附加要求:
- 用户必须将 dependency.js 文件作为
<script>包含在他们的文档中 - 并且用户必须确保在 module.js 之前加载此脚本
添加这两个要求引发了一个像 CommonJS 这样简单易用的模块化框架的想法。
我的另一个选择是在我的 Module 包中包含第二个已编译脚本,其中 dependency.js 使用 browserify 捆绑。然后我指示在浏览器中使用该脚本的用户包含此脚本,而服务器端用户使用package.json 中概述的非捆绑条目脚本。这比第一种方式更可取,但它需要一个预编译过程,我每次更改库时都必须运行该过程(例如,在上传到 GitHub 之前)。
还有其他我没有想到的方法吗?
【问题讨论】:
-
这是一个糟糕的想法,出于安全原因,服务器和浏览器不应该共享同一个库,这就是为什么我们首先需要两者。想象一下,您的依赖项之一会暴露您的用户电子邮件或密码或类似的东西。这将是灾难性的。
-
@Val 有许多通用库可以在服务器端和浏览器端使用,但不涉及安全性。例如,async 库。此外,在这种情况下,Module和Dependency都是我自己编写的。
标签: javascript node.js module browserify commonjs