关于git子模块:如何创建与环境无关的javascript库

how to create an environment agnostic javascript library

我正在创建一个javascript库,我希望它不受环境影响(它不会使用dom、ajax或nodejs api)。它将是普通的javascript)。所以,它应该在任何JavaScript环境中运行(浏览器、NPM、Meteor智能包、V8C绑定…)。

我目前的方法是用库创建git repo,所有库都在一个全局变量内,而不考虑commonjs或amd之类的模式。稍后,我将创建另一个git repo,使用我的库作为git子模块,并创建将其作为NPM模块发布所需的内容。我担心这是否是一个好方法,我没有发现有人这样做。优点:代码将是普通的JavaScript,不了解环境模式。它不会绑定到commonjs。它可以重新打包(复制粘贴或git子模块)到任何JavaScript环境中。它将根据需要被发送到浏览器。缺点:我需要维护尽可能多的Git环境来支持它。至少有第二个git repo交付NPM。

以jquery为例,它在浏览器和nodejs中运行,只有一个git repo。有一些代码需要注意要在nodejs或其他与commonjs兼容的环境中运行的"exports"变量。优点:只需一个git repo到mantain。缺点:它将绑定到CommonJS模式(以实现NPM兼容性)

我的问题是:我是否遵循正确(或可接受)的方法?还是应该遵循jquery的路径,尝试创建单个git repo?

更新1:browserify和其他require()库不是有效答案。我的问题不是如何在浏览器上使用require(),而是关于架构模式来实现环境不可知性。

更新2:创建一个浏览器/nodejs模块不是问题,它是已知的。问题是:能否使一个真正的环境不可知论图书馆?这个例子绑定到了在nodejs中使用的commonJS模式。


"使用构建工具"是这个问题的答案。使用构建工具,您可以使用最佳的代码实践进行开发,而无需将代码与当今的某些环境标准(AMD、CommonJS…)相适应,仍然可以将代码发布到此类环境中。

例如,我正在使用grunt.js运行一些任务,比如build、lint、test等。它执行诸如make、maven、gulp.js和其他各种繁琐的操作(缩小、编译…)。

构建任务可以处理已编译代码的标准(如commonjs)。因此,库可以完全不区分环境,而构建过程处理环境适应。注意,我不是在讨论编译到二进制文件。它将源代码编译成另一个源代码,比如将coffescript编译成javascript。在我的例子中,它是将没有环境标准的javascript编译成带有commonJS标准的javascript(作为node.js模块运行)。最后的结果是,我可以将我的项目编译成各种标准,而不必弄乱我的代码。

另外,在构建阶段,我可以"思考未来",比如xmojmr回答并使用我的javascript代码上的ecmascript 6功能,使用grunt-es6-sportealer或grunt tracer之类的grunt插件来编译从es6到5的javascript代码(这样它就可以在今天的环境中运行)。


如果您正在为您未来的库工作寻找设计建议,那么在我看来,您可以考虑未来,并且只使用在其他语言、系统和库中得到很好证明的面向对象实践。

主要关注设计的UML视图。

忘记"一个变量"的要求。

使用计划的下一个版本的javascript中提出的功能。

  • http://wiki.ecmascript.org/doku.php?id=strawman:最大最小类
  • http://wiki.ecmascript.org/doku.php?id=和谐:模块原理

有一个实验性的编译器可以让你编写ES6风格的代码,即使在今天(请参见https://www.npmjs.org/package/es6 module sportaler rewrite)。

node.js有一个允许相同操作的--harmony命令行开关(参见"node--harmony"做什么?)

所以在我看来,正确的方法是遵循最佳实践和"思考未来"


根据模块化您的库(如果您需要模块)。读一下CommonJS、AMD和RequireJS之间的关系?

以引导程序为例,它使用NPM来管理项目依赖性,并使用Bower作为其他Web应用程序的静态内容发布。

看看browserify作为参考,它有点重,因为它提供了捆绑依赖的NPM模块作为浏览器资源的能力。