首页 文章

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

提问于
浏览
290

我正在创建我的第一个Bower组件 . 运行 bower init 后,脚本会问我'what types of modules does this package expose?'这些选项:

  • amd

  • es6

  • 全局

  • 节点

这些选项有什么区别?

3 回答

  • 27

    初始

    我也是第一次使用 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"

  • 121

    仅供参考,这正是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

  • 7

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

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

    [更新]

    这个功能最近在凉亭中推出,尚未完全记录(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模块的现实经验 .

相关问题