我正在创建我的第一个Bower组件。运行bower init脚本后问我“这个包暴露了什么类型的模块?”的选项:

amd es6 globals node

这些选项之间的区别是什么?


如果你不知道,很可能全局变量是你的正确答案。

不管怎样,你需要明白:

AMD是什么?为什么 什么是nodejs模块 什么是ecmascript 6,特别是es6模块

(更新)

这个功能是最近才在bowwer中引入的,还没有被记录下来(AFAIK)。它本质上描述了moduleType,它声明了包将用于何种模块技术(参见上面)。

现在,除了在凉亭中设置moduleType属性外,它没有任何效果。包的Json文件。

原始的pull-request请参见https://github.com/bower/bower/pull/934。

(更新# 2)

为了回答评论,我还要补充几点:

right now AFAIK there is no validation done on the moduleType property - which means that people are technically allowed to use whatever value they want for it, including angularjs if they feel inclined to do so the bower committee seems to not be keen toward the inclusion of additional non-interoperable/proprietary moduleTypes (think composer, angular, etc) - which is easily understandable, but yet again, nothing really prevents people from using the moduleType value they want an exception to the previous is the (somewhat) recent inclusion of the yui moduleType, so, there are "exceptions" to be made, assuming they are part of a concerted plan

如果我要为未列出的包管理器编写一个包并将其发布到bower上,我会做什么?

我将编写一个es6模块,并使用/ patch es6 transpiler来输出我需要的包格式。那么我将/和:

请求bower的家伙把我的包技术作为一种选择(基于es6-transpiler作为目标支持它的事实) 发布我的包,包括它的es6模块版本和它的编译XXX版本,并使用es6作为模块类型

免责声明:我没有编写angularjs模块的实际经验。


最初的

我也是第一次使用bower init。

选项应该指模块化JavaScript代码的不同方式:

amd:使用amd定义,如requirejs。 node:使用node .js require。 globals:使用JavaScript模块模式公开全局变量(如window.JQuery)。 es6:使用即将推出的EcmaScript6模块特性。

在我的情况下,我写了一个Node.js模块dflow,但我使用browserify来创建一个dist/dflow.js文件,导出一个全局dflow var:所以我选择了globals。

其他的更新

我用来将dflow作为窗口全局对象进行browserify的命令是

Browserify -s dflow -e index.js -o dist/dflow.js

我改变了它,因为我更喜欢在浏览器内部使用require,所以现在我正在使用

Browserify -r ./index.js:dflow -o dist/dflow.js

所以我换了凉亭。moduleType到我的凉亭中的节点。json文件。

主要的动机是,如果我的模块名有破折号,例如我的项目流视图,我需要在flowView中驼峰化全局名称。

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

节点和浏览器界面相同。在客户端和服务器端都使用require,让我只编写一次代码示例,并在两个上下文中轻松重用它们。 我使用npm脚本,所以,我可以利用${npm_package_name}变量,写一次我用来browserify的脚本。

这是另一个主题,但是,它真的值得你考虑后一个好处是如何有用的:让我分享我在package.json中使用的npm.scripts.browserify属性

"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"


仅供参考,这正是bower针对模块类型指定的内容:

The type of module defined in the main JavaScript file. Can be one or an array of the following strings: globals: JavaScript module that adds to global namespace, using window.namespace or this.namespace syntax amd: JavaScript module compatible with AMD, like RequireJS, using define() syntax node: JavaScript module compatible with node and CommonJS using module.exports syntax es6: JavaScript module compatible with ECMAScript 6 modules, using export and import syntax yui: JavaScript module compatible with YUI Modules, using YUI.add() syntax

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