我正在创建一个javascript库,我希望它与环境无关(它不会使用DOM,AJAX或NodeJS api。它将是vanilla javascript)。因此,它应该在任何javascript环境(浏览器,npm,流星智能包,V8 C绑定......)中运行。
我目前的方法是使用库创建git repo,将所有库都放在一个全局变量中,而不考虑像CommonJS或AMD这样的模式。 稍后,我将创建另一个git repo,使用我的库作为git子模块,并创建将其作为npm模块发布所需的内容。我担心这是一个好方法,我没有发现任何人这样做。 优点:代码将是vanilla javascript,没有环境模式的意识。它不会将自己绑定到CommonJS。它可以重新打包(复制和粘贴或git子模块)到任何JavaScript环境。它将根据需要发送到浏览器。 缺点:我必须保持与我想要支持的环境一样多的git。至少有第二个git repo可以在npm发送。
以jQuery为例,它只在浏览器和nodejs中运行,只有一个git repo。有些代码需要注意在nodejs或其他CommonJS兼容环境中运行的“exports”变量。 优点:只有一个git repo to mantain。 缺点:它将绑定到CommonJS模式(以实现npm兼容性)
我的问题是:我是否遵循正确(或接受)的方法?或者我应该遵循jquery的路径,并尝试创建一个单一的git repo?
更新1:
Browserify 和其他require()
库不是有效的答案。我的问题不是如何在浏览器上使用require()
,而是关于实现环境不可知论的架构模式。
更新2:
创建一个browser / nodejs模块不是问题,it's known。问题是:可以建立一个真正的环境不可知库吗?此示例绑定到CommonJS模式,在NodeJS中使用。
答案 0 :(得分:1)
如果您正在为未来的图书馆工作寻找设计建议,那么在我看来,您可以思考未来,并且只使用在其他语言,系统和库中得到充分证明的通常的面向对象实践。
主要关注设计的UML视图。
忘记"一个变量"要求。
使用计划的下一版JavaScript中提议的功能。
有一个实验性编译器,即使在今天也可以编写ES6风格的代码(参见https://www.npmjs.org/package/es6-module-transpiler-rewrite)。
Node.js有--harmony
命令行开关,允许相同(见What does `node --harmony` do?)
因此,在我看来,正确的方法是遵循最佳实践并且"思考未来"
答案 1 :(得分:1)
“使用构建工具”是这个问题的答案。使用构建工具,您可以使用最佳代码实践进行开发,而无需将代码应用于当今的某些环境标准(AMD,commonjs ...),并且仍然将代码发布到这些环境中。
例如,我正在使用Grunt.js来运行一些任务,例如构建,lint,测试等。
它执行繁琐的操作(缩小,编译......),如Make,Maven,Gulp.js以及其他各种操作。
构建任务可以处理已编译代码的标准(如commonjs)。因此,图书馆可以完全与环境无关,构建过程处理环境适应
请注意,我不是在谈论编译二进制文件。它正在编译源代码到另一个源,比如CoffeScript到JavaScript。在我的例子中,它是没有环境标准的JavaScript汇编到具有commonjs标准的JavaScript(以Node.js module运行)。
最终结果是我可以将我的项目编译成各种标准而不会弄乱我的代码。
另外,在构建阶段,我可以“思考未来”,例如xmojmr answered,并使用我的JavaScript代码上的EcmaScript 6功能,使用Grunt插件,如grunt-es6-transpiler或grunt-traceur编译从ES 6到5的JavaScript代码(因此它可以在今天的环境中运行)
答案 2 :(得分:0)
根据模块化您的库(如果您需要模块)。阅读此问题Relation between CommonJS, AMD and RequireJS?
以bootstrap为例,它使用npm来管理项目依赖项,并使用bower作为其他Web应用程序的静态内容发布。
看看browserify作为参考,它有点重,因为它提供了将依赖的npm模块捆绑为浏览器资源的功能。