Git 子模块 - 如何创建与环境无关的 JavaScript 库
git submodules - how to create an environment agnostic javascript library
我正在创建一个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 模块捆绑为浏览器资源的功能。
- 能够在指向本地环境的浏览器中设置JavaScript断点
- RubyonRails环境控制器操作JavaScript响应
- 基于环境在Rails中加载不同的Javascript文件
- 我可以用JavaScript判断访问者是否'的语言环境遵循美国风格或世界其他地区's风格
- 在 Java 环境中编译为 javascript 的模板
- 如何将 Node.js 环境变量注入客户端 JavaScript
- JavaScript 引擎和 JavaScript 运行时环境有什么区别
- 如何在节点的沙盒环境中执行用户提交的javascript代码
- javascript如何成为一种同步语言并在浏览器和node.js环境中异步运行
- 关于为JavaScript添加适当的语言环境支持,我目前有什么建议可以遵循吗
- 执行批处理文件的Javascript,该文件包含基于每个会话的环境变量设置
- 引用JS文件所需的Javascript代码取决于Prod、Dev和stage环境
- javascript_include_tag :应用程序在开发环境中加载 JavaScript 两次
- 如何将环境变量从.bash_profile引入javascript
- 在JavaScript节点环境中将Gzip内容编码响应转换为JSON数据
- 在Meteor JS环境中运行JavaScript文件
- Javascript - 比较字符串环境
- Javascript 在暂存环境中失败(jQuery 滑块)
- Ruby on rails 应用程序在生产环境中找不到 JavaScript 运行时(使用 passenger 和 ng
- 在服务器端环境或命令行环境中将一个 javascript 文件“包含”到另一个文件