bower init - amd,es6,globals和node之间的区别

时间:2014-03-26 22:04:41

标签: node.js ecmascript-6 bower js-amd es2015

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

  • amd
  • es6
  • globals
  • 节点

这些选项有什么区别?

3 个答案:

答案 0 :(得分:121)

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

无论哪种方式,您都需要了解:

[UPDATE]

此功能最近在凉亭中推出,尚未完全记录(AFAIK)。它基本上描述了moduleType,它说明了要使用哪个模块技术(见上文)。

现在,除了在程序包的moduleType文件中设置bower.json属性之外,它没有任何效果。

请参阅https://github.com/bower/bower/pull/934了解原始拉取请求。

[更新#2]

还有几点要回答评论:

  • 现在AFAIK没有对moduleType属性进行验证 - 这意味着技术上允许人们使用他们想要的任何值,包括angularjs如果他们愿意这样做< / LI>
  • bower committee似乎并不热衷于包含额外的non-interoperable/proprietary moduleTypes(想想作曲家,角色等) - 这很容易理解,但同样,没有什么能真正阻止人们使用{ {1}}他们想要的价值
  • 前一个例外是(有些)最近包含moduleType,所以,有“例外”,假设它们是part of a concerted plan

如果我要为未列出的包管理器创作一个包并将其发布在凉亭上,我会怎么做?

我会创建一个es6模块,并使用/ patch es6-transpiler输出我需要的包格式。然后我会/和:

  • 请求凉亭家伙将我的包装技术作为一种选择(基于es6-transpiler作为目标支持的事实)
  • 发布我的包,包括它的es6模块版本和它的已转换XXX版本,并使用yui moduleType作为es6

免责声明:我没有创作angularjs模块的真实经历。

答案 1 :(得分:27)

初始

我第一次使用bower init

选项应该参考模块化某些JavaScript代码的不同方法:

  • amd:使用AMD define,例如requirejs。
  • node:using Node.js require
  • globals:使用JavaScript模块模式公开全局变量(如window.JQuery)。
  • es6:使用即将推出的EcmaScript6模块功能。

在我的情况下,我编写了一个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 中的全局名称。

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

  1. 节点和浏览器界面是相同的。在客户端和服务器端使用 require ,让我只编写一次代码示例,并在两种情况下轻松重用它们。
  2. 我使用npm脚本,因此,我可以利用${npm_package_name}变量并编写一次我用于浏览化的脚本。
  3. 这是另一个主题,但是,你真的值得考虑后者的好处:让我分享我在 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.namespacethis.namespace语法添加到全局命名空间的JavaScript模块
  •   
  • amd:与RequireJS兼容的JavaScript模块,使用define()语法
  •   
  • node:使用module.exports语法与nodeCommonJS兼容的JavaScript模块
  •   
  • es6:JavaScript模块与ECMAScript 6 modules兼容,使用exportimport语法
  •   
  • yui:JavaScript模块与YUI Modules兼容,使用YUI.add()语法
  •   

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