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的全球名称。

这种新方法还有另外两个好处:

  1. 节点和浏览器界面是一样的。 在客户端和服务器端都使用require ,让我只写代码示例一次,并在两个上下文中轻松地重用它们。
  2. 我使用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.namespacethis.namespace语法添加到全局名称空间的JavaScript模块
  • amd :与AMD兼容的JavaScript模块,如RequireJS ,使用define()语法
  • node :JavaScript模块兼容节点和CommonJS使用module.exports语法
  • es6 :与ECMAScript 6模块兼容的JavaScript模块,使用exportimport语法
  • yui :使用YUI.add()语法与YUI模块兼容的JavaScript模块

相关链接: https : //github.com/bower/spec/blob/master/json.md#moduletype