我正在创建我的第一个Bower组件。运行bower init后,脚本问我“这个包公开了什么类型的模块?”的选项:
bower init
这些选项之间的区别是什么?
如果你不知道,很可能全局变量是你的正确答案。
不管怎样,你需要明白:
这个功能是最近才在bowwer中引入的,还没有被记录下来(AFAIK)。它本质上描述了moduleType,它声明了包将用于何种模块技术(见上文)。
moduleType
现在,除了在包的bower.json文件中设置moduleType属性外,它没有任何效果。
bower.json
参见https://github.com/bower/bower/pull/934获取原始的pull-request。
为了回答评论,我还要补充几点:
angularjs
non-interoperable/proprietary moduleTypes
yui moduleType
如果我要为未列出的包管理器编写一个包并将其发布到bower上,我会做什么?
我会创建一个es6模块,并使用/ patch es6-transpiler来输出我需要的包格式。那么我将/和:
es6
免责声明:我没有编写angularjs模块的实际经验。
我也是第一次使用bower init。
选项应该指模块化JavaScript代码的不同方式:
define
require
在我的例子中,我写了一个Node.js模块dflow,但我使用browserify来创建一个dist / dflow.js文件,导出一个全局dflow变量:所以我选择了全局变量。
我用来将dflow浏览为窗口全局对象的命令是
我改变了它,因为我更喜欢在浏览器内部使用需要,所以现在我正在使用
所以我在我的bower.json文件中将bower.moduleType改为节点。
主要的动机是,如果我的模块名有破折号,例如我的项目连,我需要在flowView中camelize全局名称。
这种新方法还有两个好处:
${npm_package_name}
这是另一个话题,但是,你真的值得考虑后一个好处是如何有用的:让我分享我在package.json中使用的npm.scripts.browserify属性
npm.scripts.browserify
"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
仅供参考,这正是bower针对模块类型指定的内容:
main JavaScript文件中定义的模块类型。可以是以下字符串中的一个或一个数组: globals:使用window.namespace或this.namespace语法添加全局命名空间的JavaScript模块 amd:与AMD兼容的JavaScript模块,比如RequireJS,使用define()语法 node:使用module.exports语法与节点和CommonJS兼容的JavaScript模块 es6:与ECMAScript 6模块兼容的JavaScript模块,使用export和import语法 yui:与YUI模块兼容的JavaScript模块,使用YUI.add()语法
main JavaScript文件中定义的模块类型。可以是以下字符串中的一个或一个数组:
main
globals
window.namespace
this.namespace
amd
define()
node
module.exports
export
import
yui
YUI.add()
相关链接:https://github.com/bower/spec/blob/master/json.md#moduletype