bower init – amd,es6,globals和node之间的区别
我正在创build我的第一个Bower组件。 在运行bower init
,脚本问我“这个软件包暴露了什么types的模块? 与这些选项:
- AMD
- ES6
- 全局
- 节点
这些选项有什么区别?
如果你不知道,全局variables很可能是你的正确答案。
无论哪种方式,你需要明白:
- 什么是和为什么AMD
- 什么是nodejs模块
- 什么是ecmascript 6,特别是es6模块
[UPDATE]
这个function是最近在凉亭中引入的,目前还没有logging(AFAIK)。 它基本上描述了moduleType
,它指出了封装将被使用的模块技术(参见上文)。
现在,除了在包的bower.json
文件中设置moduleType
属性以外,它没有任何作用。
请参阅https://github.com/bower/bower/pull/934获取原始的拉取请求。;
[更新#2]
再补充一点,回答评论:
- 现在AFAIK没有对
moduleType
属性进行validation – 这意味着人们在技术上被允许使用任何他们想要的值,包括angularjs
如果他们觉得倾向于这样做的话 - 凉亭委员会似乎并不热衷于包含额外的
non-interoperable/proprietary moduleTypes
(思考composer php,angular度等) – 这是容易理解的,但再一次,没有什么真正阻止人们使用他们想要的moduleType
值 - 前一个例外是
yui moduleType
最近(有点)包含,因此,假设它们是一个协调一致的计划的一部分 ,那么就有“例外”
如果我要为未列出的软件包pipe理器创作一个软件包并将其发布在凉亭上,我该怎么办?
我将编写一个es6模块,并使用/打补丁es6-transpiler输出我需要的包格式。 那么我会或者和:
- 请求凉亭的人包括我的包装技术作为一个select(根据它的事实,它是由es6 – transpiler作为一个目标)
- 发布我的包,包括它的es6模块版本和它的转发的XXX版本,并使用
es6
作为moduleType
免责声明:我没有创作angularjs模块的实际经验。
初始
我也是第一次使用bower init
。
这些选项应该参考模块化JavaScript代码的不同方式:
- amd:使用AMD
define
,就像requirejs一样。 - 节点:使用Node.js
require
。 - 全局variables:使用JavaScript模块模式公开全局variables(如window.JQuery)。
- es6:使用即将发布的EcmaScript6模块function。
在我的情况下,我写了一个Node.js模块dflow,但是我正在使用browserify创build一个导出全局dflow var的dist / dflow.js文件:所以我select了全局variables 。
其他更新
我用来浏览dflow作为窗口全局对象的命令是
browserify -s dflow -e index.js -o dist/dflow.js
我改变了,因为我更喜欢在浏览器内部使用require ,所以现在我正在使用
browserify -r ./index.js:dflow -o dist/dflow.js
所以我改变了我的bower.json文件中的bower.moduleType 节点 。
主要的动机是,如果我的模块名称有一个破折号,例如我的项目stream程视图 ,我需要骆驼在flowView的全球名称。
这种新方法还有另外两个好处:
- 节点和浏览器界面是一样的。 在客户端和服务器端都使用require ,让我只写代码示例一次,并在两个上下文中轻松地重用它们。
- 我使用npm脚本,因此,我可以利用
${npm_package_name}
variables并编写一次我用来浏览的脚本。
这是另一个话题,但是真的值得你考虑后者的好处:让我分享我在package.json中使用的npm.scripts.browserify
属性
"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
仅供参考,这正是鲍尔在模块types中指定的内容:
main
JavaScript文件中定义的模块types。 可以是一个或下列string的数组:
globals
:使用window.namespace
或this.namespace
语法添加到全局名称空间的JavaScript模块amd
:与AMD兼容的JavaScript模块,如RequireJS ,使用define()
语法node
:JavaScript模块兼容节点和CommonJS使用module.exports
语法es6
:与ECMAScript 6模块兼容的JavaScript模块,使用export
和import
语法yui
:使用YUI.add()
语法与YUI模块兼容的JavaScript模块
相关链接: https : //github.com/bower/spec/blob/master/json.md#moduletype