如何在Node AND浏览器中使用相同的库,同时保持库的模块化
How can I use the same library in Node AND a browser while keeping my library modular?
我正在构建一个JavaScript库,我希望它能被Node和浏览器使用。
我的库由几个模块和几个[Handerbar]模板组成,没有什么不能在浏览器中运行的。与其将所有模块压缩到一个源文件中,还不如将模板添加到该源文件中(通过讨厌的字符串串联(,我真的希望在它们自己的、单独的源文件中保持分离。所以我会有
src/
module1.js
module2.js
templates/
one.handlebars
two.handlebars
然后,也许我会通过构建过程将所有内容打包到一个dist文件(dist/myllibrary.js(中
对此有什么共同的解决方案?Browserify?咕哝还有别的吗?
请注意,我想在AngularJS应用程序中使用这个库,并且我想保持这个库的香草风格。
我最近经历了这个过程,花了比我高兴的更多的时间来寻找一个好的解决方案。这三个要求很重要:
- 如何跨节点处理第三方库。JS和浏览器
- 如何维护一个可以在Node上执行测试的repo。JS还是浏览器?我的库没有与DOM或任何Node交互。JS核心模块,所以这是可以实现的
- 如何缩短构建时间,这样就不会持续等待重建/测试周期的完成
我发现问题是,"你希望require('<third party lib>')
调用在每个环境中做什么?"在npm、bower和组件之间,我无法在任何一个包管理器中找到所有的依赖项。一些依赖项在浏览器中支持CommonJS,但其他依赖项则不支持。其中一个节点有不同的脚本。JS和浏览器。另一个检测到的节点。JS以一种不寻常的方式与Browserify一起工作。
我想要一个在任何情况下都有效的单一解决方案。我决定使用的解决方案是:
- 始终使用节点。JS
require('<npm name>')
调用第三方库 - 为了在所有情况下在浏览器中都能做到这一点,请使用Browserify的
--require
功能将所有依赖项别名为它们的npm预期名称,同时加载一个填充程序,以获得依赖项的全局公开版本。这意味着在浏览器上,必须先加载所有依赖项,然后才能执行生成的lib
通过这种方法,所有Node。JS依赖项位于node_modules
中,版本通过package.json
管理,我的所有浏览器依赖项都可以位于vendor
文件夹中,无论它们来自哪里。或者它们都可以通过CDN提供服务。通过将第三方库排除在浏览器构建之外,重建很快,尤其是在使用watchify(browserify的监视模式(时。
示例:(使用watchify并显示async和lazy.js的垫片(
watchify --require ./shims/async.js:async --require ./shims/async.js:lazy.js index.js --outfile dist/lib.js
垫片结构:
shims/
index.js
async.js
lazy.js
Shim脚本:
// shims/index.js
module.exports = function retrieveGlobal(globalKey){
// Uses self so that this can be used in a web worker
var module = self[globalKey];
delete self[globalKey]; // Optional
return module;
}
// shims/async.js
var shim = require('./')
module.exports = shim('async')
// shims/lazy.js
var shim = require('./')
module.exports = shim('Lazy')
其他依赖项只需要另一个填充程序文件,并使用新的填充程序重新启动watchify。
至于测试,我在test/
下有一个简单的require
deach(Mocha(测试套件文件,并使用watchify构建该文件。我将watchify目标文件加载到karma.conf.js
的files
数组中,并在其之前包含依赖项。只要require
的每个测试套件的文件本身不在test/
目录中,就运行mocha
在Node中运行测试。JS仍然可以正常工作。
然后你所需要做的就是运行:
watchify <"--require" arguments> tests.js -o tests-built.js && karma start && mocha --watch
现在您是跨平台TDD JavaScript大师:(
使用Browserify:(
在这个库中工作时,我尝试了几个选项:https://github.com/dfernandez79/barman
在尝试了不同的模式之后(在网上搜索UMD(。
我发现browserify是为我做这件事的。例如,如果你在Grunt中使用browserify,你只需要将standalone: true
传递给Browseriify任务,你就可以免费获得AMD支持。
- 聚合物是一个框架而不是一个库.如何模块化地使用web组件
- 使用Ampersand.js路由模块化应用程序
- 性能与模块化:将JS集成到PHP或单独的custom.JS中
- 将broccoliJS与当前使用requireJS的模块化主干应用程序结合使用,我想完全放弃requireJS
- 用于多个选项卡和模块化的knockoutjs设计模式
- 编写在浏览器和node.js中运行的模块化ECMAScript
- 模块化&重用使用ExtJS编写的代码
- 使用模块化CSS与Bootstrap 4和React
- 构建模块化谷歌地图应用程序
- 模块化模块?需要父模块中的部分
- 为什么模块化幂函数在 Python 和 Javascript 中对于大数字的工作方式不同
- 模块化与性能与性能与角度应用程序中的ng-include
- 将变量传递给 Javascript 模块化模式方法
- When是通过node js使用CommonJS模块化时执行的Javascript构造函数
- node.js中模块化socket.io的体系结构
- 模块化gulp / node.js,调用模块变量
- 模块化node.js/socket的最佳方法.io /表达应用程序
- 从多个模块初始化Node.js数据库
- 如何正确地模块化node.js项目
- 如何在Node AND浏览器中使用相同的库,同时保持库的模块化