我正在创建我的第一个Bower组件。运行bower init
后,脚本会问我'这个软件包暴露了什么类型的模块?'有这些选项:
这些选项有什么区别?
答案 0 :(得分:121)
如果您不知道,全局变量很可能是您的正确答案。
无论哪种方式,您都需要了解:
此功能最近在凉亭中推出,尚未完全记录(AFAIK)。它基本上描述了moduleType
,它说明了要使用哪个模块技术(见上文)。
现在,除了在程序包的moduleType
文件中设置bower.json
属性之外,它没有任何效果。
请参阅https://github.com/bower/bower/pull/934了解原始拉取请求。
还有几点要回答评论:
moduleType
属性进行验证 - 这意味着技术上允许人们使用他们想要的任何值,包括angularjs
如果他们愿意这样做< / LI>
non-interoperable/proprietary moduleTypes
(想想作曲家,角色等) - 这很容易理解,但同样,没有什么能真正阻止人们使用{ {1}}他们想要的价值moduleType
,所以,有“例外”,假设它们是part of a concerted plan 如果我要为未列出的包管理器创作一个包并将其发布在凉亭上,我会怎么做?
我会创建一个es6模块,并使用/ patch es6-transpiler输出我需要的包格式。然后我会/和:
yui moduleType
作为es6
免责声明:我没有创作angularjs模块的真实经历。
答案 1 :(得分:27)
我第一次使用bower init
。
选项应该参考模块化某些JavaScript代码的不同方法:
define
,例如requirejs。require
。在我的情况下,我编写了一个Node.js模块dflow,但我使用browserify创建了一个导出全局 dflow的 dist / dflow.js 文件 var:所以我选择了全局。
我曾经将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 更改为节点。
主要动机是,如果我的模块名称有破折号,例如我的项目flow-view,我需要 camelize flowView 中的全局名称。
这种新方法还有两个好处:
${npm_package_name}
变量并编写一次我用于浏览化的脚本。这是另一个主题,但是,你真的值得考虑后者的好处:让我分享我在 package.json 中使用的npm.scripts.browserify
属性/ p>
"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
答案 2 :(得分:7)
仅供参考,这正是bower对模块类型的指定:
main
JavaScript文件中定义的模块类型。可以是以下字符串中的一个或数组:
globals
:使用window.namespace
或this.namespace
语法添加到全局命名空间的JavaScript模块amd
:与RequireJS兼容的JavaScript模块,使用define()
语法node
:使用module.exports
语法与node和CommonJS兼容的JavaScript模块es6
:JavaScript模块与ECMAScript 6 modules兼容,使用export
和import
语法yui
:JavaScript模块与YUI Modules兼容,使用YUI.add()
语法
相关链接:https://github.com/bower/spec/blob/master/json.md#moduletype