如何创建与环境无关的javascript库

如何创建与环境无关的javascript库,javascript,git-submodules,Javascript,Git Submodules,我正在创建一个javascript库,我希望它与环境无关(它不会使用DOM、AJAX或NodeJSAPI,而是普通的javascript)。因此,它应该在任何javascript环境(浏览器、npm、meteor智能包、V8 C绑定等)中运行 我目前的方法是使用库创建git repo,将所有库放在一个全局变量中,而不考虑CommonJS或AMD等模式。 稍后,我将使用我的库作为git子模块创建另一个git repo,并创建将其作为npm模块发布所需的内容。我担心这是否是一个好方法,我没有发现有人

我正在创建一个javascript库,我希望它与环境无关(它不会使用DOM、AJAX或NodeJSAPI,而是普通的javascript)。因此,它应该在任何javascript环境(浏览器、npm、meteor智能包、V8 C绑定等)中运行

我目前的方法是使用库创建git repo,将所有库放在一个全局变量中,而不考虑CommonJS或AMD等模式。 稍后,我将使用我的库作为git子模块创建另一个git repo,并创建将其作为npm模块发布所需的内容。我担心这是否是一个好方法,我没有发现有人这样做。 优点:代码将是普通的javascript,没有环境模式的意识。它不会绑定到CommonJS。它可以重新打包(复制粘贴或git子模块)到任何javascript环境。它将尽可能小,以便发送到浏览器。 缺点:我必须维护尽可能多的git环境。在npm上至少要进行第二次git回购

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

我的问题是:我是否遵循了正确(或可接受)的方法?或者我应该遵循jquery的路径,尝试创建一个git回购协议

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

更新2:

创建浏览器/nodejs模块不是问题所在。问题是:是否可以建立一个真正的环境不可知论图书馆?此示例绑定到CommonJS模式,在NodeJS中使用。

根据您的模块库(如果您需要模块)。读这个问题

以bootstrap为例,它使用npm管理项目依赖关系,并使用bower将其他web应用程序作为静态内容发布


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

如果您正在为未来的库工作寻找设计建议,那么我认为您可以考虑未来,只需使用在其他语言中得到充分验证的常用面向对象实践,系统和图书馆

主要关注设计的UML视图

忘记“一个变量”的要求

使用计划中的下一版本JavaScript中建议的功能

现在有一个实验性的编译器,允许您编写ES6风格的代码(请参阅)

Node.js有一个
--harmony
命令行开关,允许相同的操作(请参阅)

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

“使用构建工具”是这个问题的答案。有了构建工具,您可以使用最佳的代码实践进行开发,而无需使您的代码符合当今的某些环境标准(AMD、commonjs…),并且仍然可以将您的代码发布到此类环境中

例如,我正在使用运行一些任务,如构建、lint、测试等。
它执行繁琐的操作(缩小、编译等),如Make、Maven、Gulp.js和其他各种操作

构建任务可以处理编译代码的标准(如commonjs)。因此,库可以完全与环境无关,构建过程可以处理环境适应。
请注意,我不是说编译成二进制文件。它将源代码编译成另一个源代码,比如将CoffeScript编译成JavaScript。在我的例子中,它是将不带环境标准的JavaScript编译成带commonjs标准的JavaScript(作为一个应用程序运行)。
最终的结果是,我可以将我的项目编译成各种标准,而不会弄乱我的代码


另外,在构建阶段,我可以“思考未来”,比如xmojmr,在我的JavaScript代码上使用EcmaScript 6功能,使用像or这样的Grunt插件来编译从ES 6到ES 5的JavaScript代码(这样它就可以在今天的环境中运行)

相关问题:相关文章:这是不是->问题是关于模式与环境无关,不兼容(请参阅更新2)。但这是一个有用的链接,谢谢。我不得不查找“环境不可知论者”通常指的是什么:)英语不是我的母语。我的答案是基于对你需要什么的新理解↓当您在浏览器上加载jQuery文件时,您将同时拥有jQuery和$global变量。@Josmar您说得对。关键是jquery只引入很少的全局变量(
$
jquery
,据我所知)。我反对在javascript中使用全局变量,因为它是javascript中最糟糕的部分。正如我在问题中所说:“单个全局变量中的所有库内容”。Browserify不是一个可接受的答案,因为问题不是如何在浏览器上使用“require()”。更新了问题以避免此类回答。Bootstrap不是一个可接受的示例。twitter引导npm不在服务器上运行,只在浏览器中运行。这不是环境不可知论。