Git 子模块 - 如何创建与环境无关的 JavaScript 库

git submodules - how to create an environment agnostic javascript library

本文关键字:环境 JavaScript 创建 模块 何创建 Git      更新时间:2023-09-26

我正在创建一个JavaScript库,我希望它与环境无关(它不会使用DOM,AJAX或NodeJS api。它将是香草javascript)。所以,它应该在任何javascript环境中运行(浏览器,npm,meteor智能包,V8 C绑定......)。

我目前的方法是使用库创建 git 存储库,将所有库都放在单个全局变量中,而无需考虑 CommonJS 或 AMD 等模式。稍后,我将创建另一个 git 存储库,使用我的库作为 git 子模块,并创建将其发布为 npm 模块所需的内容。我担心这是否是一个好方法,我没有发现有人这样做。优点:代码将是普通的javascript,没有对环境模式的了解。它不会将自己绑定到 CommonJS。它将可重新打包(复制并粘贴或 git 子模块)到任何 JavaScript 环境中。它将根据需要发送到浏览器。缺点:我必须维护与我想要支持的环境一样多的 git。至少第二个 git 存储库在 npm 上交付。

以jQuery为例,它同时在浏览器和nodejs中运行,只有一个git存储库。有一些代码需要注意在nodejs或其他CommonJS兼容环境中运行的"export"变量。优点:只需维护一个 git 存储库。缺点:它将被绑定到 CommonJS 模式(以实现 npm 兼容性)

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

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

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

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

主要集中在设计的UML视图上。

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

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

  • http://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes
  • http://wiki.ecmascript.org/doku.php?id=harmony:modules_rationale

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

Node.js 有一个--harmony命令行开关,允许相同的操作(请参阅"node --harmony"有什么作用?

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

"

使用构建工具"是这个问题的答案。使用构建工具,您可以使用最好的代码实践进行开发,而无需将代码限制为当今的一些环境标准(AMD,commonjs...),并且仍然可以将代码发布到这些环境中。

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

构建任务可以处理已编译代码的标准(如 commonjs)。因此,库可以完全与环境无关,并且构建过程处理环境适应。
请注意,我不是在谈论编译为二进制文件。它是将源代码编译到另一个源,例如 CoffeScript 到 JavaScript。就我而言,它是将没有环境标准的JavaScript编译到具有commonjs标准的JavaScript(作为Node.js模块运行)。
最终结果是,我可以按照各种标准编译我的项目,而不会弄乱我的代码。

另外,在构建阶段,我可以"思考未来",就像 xmojmr 回答并在我的 JavaScript 代码上使用 EcmaScript 6 功能一样,使用 Grunt 插件,如 grunt-es6-transpiler 或 grunt-traceur 编译从 ES 6 到 5 的 JavaScript 代码(因此它可以在今天的环境中运行)

根据模块化你的库(如果你需要模块)。阅读这个问题 CommonJS、AMD 和 RequireJS 之间的关系?

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

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