我正在创建我的第一个Bower组件 . 运行 bower init 后,脚本会问我'what types of modules does this package expose?'这些选项:
bower init
amd
es6
全局
节点
这些选项有什么区别?
我也是第一次使用 bower init .
选项应该参考模块化一些JavaScript代码的不同方法:
amd:使用AMD define ,就像requirejs一样 .
define
node:使用Node.js require .
require
globals:使用JavaScript模块模式公开全局变量(如window.JQuery) .
es6:使用即将推出的EcmaScript6模块功能 .
在我的情况下,我写了一个Node.js模块dflow,但我使用browserify来创建一个导出全局dflow var的dist / dflow.js文件:所以我选择了 globals .
我用来浏览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更改为 node .
主要动机是如果我的模块名称有破折号,例如我的项目flow-view,我需要在flowView中使用全局名称 .
这种新方法还有两个好处:
节点和浏览器界面是相同的 . 在客户端和服务器端使用require,让我只编写一次代码示例,并在两个上下文中轻松地重用它们 .
我使用npm脚本,因此,我可以利用 ${npm_package_name} 变量并编写一次我使用的脚本进行浏览 .
${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对模块类型的指定:
主JavaScript文件中定义的模块类型 . 可以是以下字符串中的一个或数组:globals:使用window.namespace或this.namespace语法添加到全局命名空间的JavaScript模块amd:与AMD兼容的JavaScript模块,如RequireJS,使用define()语法节点:JavaScript模块使用module.exports语法与节点和CommonJS兼容es6:与ECMAScript 6模块兼容的JavaScript模块,使用导出和导入语法yui:与YUI模块兼容的JavaScript模块,使用YUI.add()语法
相关链接:https://github.com/bower/spec/blob/master/json.md#moduletype
如果你不知道,很可能全局变量对你来说是正确的答案 .
无论哪种方式,您都需要了解:
what is and why AMD
what is a nodejs module
what is ecmascript 6 and especially es6 modules
这个功能最近在凉亭中推出,尚未完全记录(AFAIK) . 它基本上描述了 moduleType ,它说明了要使用的包的模块技术(见上文) .
moduleType
现在,除了在包的 bower.json 文件中设置 moduleType 属性之外,它没有任何效果 .
bower.json
有关原始拉取请求,请参阅https://github.com/bower/bower/pull/934 .
还有几点要回答评论:
现在AFAIK没有对 moduleType 属性进行验证 - 这意味着技术上允许人们使用他们想要的任何值,包括 angularjs 如果他们愿意这样做
angularjs
bower committee似乎并不热衷于包含额外的 non-interoperable/proprietary moduleTypes (想想作曲家,角色等) - 这很容易理解,但是再一次,没有什么能真正阻止人们使用他们想要的 moduleType 值
non-interoperable/proprietary moduleTypes
前一个例外是(有些)最近包含 yui moduleType ,因此,有"exceptions",假设它们是part of a concerted plan
yui moduleType
如果我为一个未列出的包管理器创作一个包并将其发布在凉亭上,我该怎么办?
我会创建一个es6模块,并使用/ patch es6-transpiler输出我需要的包格式 . 然后我要么/和:
请求凉亭家伙将我的包装技术作为一种选择(基于es6-transpiler作为目标支持的事实)
发布我的包,包括它的es6模块版本和它的转换后的XXX版本,并使用 es6 作为 moduleType
免责声明:我没有创作angularjs模块的现实经验 .
3 回答
初始
我也是第一次使用
bower init
.选项应该参考模块化一些JavaScript代码的不同方法:
amd:使用AMD
define
,就像requirejs一样 .node:使用Node.js
require
.globals:使用JavaScript模块模式公开全局变量(如window.JQuery) .
es6:使用即将推出的EcmaScript6模块功能 .
在我的情况下,我写了一个Node.js模块dflow,但我使用browserify来创建一个导出全局dflow var的dist / dflow.js文件:所以我选择了 globals .
其他更新
我用来浏览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更改为 node .
主要动机是如果我的模块名称有破折号,例如我的项目flow-view,我需要在flowView中使用全局名称 .
这种新方法还有两个好处:
节点和浏览器界面是相同的 . 在客户端和服务器端使用require,让我只编写一次代码示例,并在两个上下文中轻松地重用它们 .
我使用npm脚本,因此,我可以利用
${npm_package_name}
变量并编写一次我使用的脚本进行浏览 .这是另一个主题,但是,你真的值得考虑后一个好处是多么有用:让我分享我在package.json中使用的
npm.scripts.browserify
属性"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
仅供参考,这正是bower对模块类型的指定:
相关链接:https://github.com/bower/spec/blob/master/json.md#moduletype
如果你不知道,很可能全局变量对你来说是正确的答案 .
无论哪种方式,您都需要了解:
what is and why AMD
what is a nodejs module
what is ecmascript 6 and especially es6 modules
[更新]
这个功能最近在凉亭中推出,尚未完全记录(AFAIK) . 它基本上描述了
moduleType
,它说明了要使用的包的模块技术(见上文) .现在,除了在包的
bower.json
文件中设置moduleType
属性之外,它没有任何效果 .有关原始拉取请求,请参阅https://github.com/bower/bower/pull/934 .
[更新#2]
还有几点要回答评论:
现在AFAIK没有对
moduleType
属性进行验证 - 这意味着技术上允许人们使用他们想要的任何值,包括angularjs
如果他们愿意这样做bower committee似乎并不热衷于包含额外的
non-interoperable/proprietary moduleTypes
(想想作曲家,角色等) - 这很容易理解,但是再一次,没有什么能真正阻止人们使用他们想要的moduleType
值前一个例外是(有些)最近包含
yui moduleType
,因此,有"exceptions",假设它们是part of a concerted plan如果我为一个未列出的包管理器创作一个包并将其发布在凉亭上,我该怎么办?
我会创建一个es6模块,并使用/ patch es6-transpiler输出我需要的包格式 . 然后我要么/和:
请求凉亭家伙将我的包装技术作为一种选择(基于es6-transpiler作为目标支持的事实)
发布我的包,包括它的es6模块版本和它的转换后的XXX版本,并使用
es6
作为moduleType
免责声明:我没有创作angularjs模块的现实经验 .