我正在使用ES6编写Meteor应用程序,并且我有许多子组件,我想将它们保存为单独的npm软件包.我有一个名为frog-utils的库,它在所有包中共享,并包含常见的辅助函数.
当我尝试在frog-utils中重新导出模块时,它与普通节点一起正常工作,但Meteor抱怨说:
W20161114-10:12:17.483(1)? (STDERR) Error: Cannot find module './color_range' W20161114-10:12:17.484(1)? (STDERR) at require (packages/modules-runtime.js:109:19) W20161114-10:12:17.484(1)? (STDERR) at meteorInstall.node_modules.frog-utils.dist.index.js (packages/modules.js:17407:20)
(这是来自普通节点的示例,在同一目录中)
~/s/F/frog (ac-collab) $node > frogutils = require('frog-utils') { color_range: [Getter],uuid: [Function: uuid],currentDate: [Function: currentDate],booleanize: [Function: booleanize],shorten: [Function: shorten],compose: [Function: compose],composeReducers: [Function: composeReducers],notEmpty: [Function: notEmpty],identity: [Function: identity],getKey: [Function: getKey] }
我在ES6中编写,使用Babel创建模块公开的输出文件,ES5对我来说似乎很好:
var _color_range = require('./color_range'); Object.defineProperty(exports,'color_range',{ enumerable: true,get: function get() { return _interoprequiredefault(_color_range).default; } });
(这是我使用的ES6系列)
export {default as color_range} from './color_range'
解决方法
您正在测试哪个版本的节点?我打赌你,如果你做了meteor节点并尝试了同样的要求(‘frog-utils’)它就行不通,因为meteor目前使用节点4.5(至少在1.4.X中).
我担心你不能在你的npm包中使用ES6而不编译它(也见https://github.com/meteor/meteor/issues/4828).但是编译不是很难,你可以看看我刚才解决了一个非常类似的问题:
https://github.com/chfritz/ros_msg_utils/blob/add_babel/package.json
诀窍是定义一个脚本,在安装时使用babel编译代码.
... "main": "dist/index.js","scripts": { "compile": "babel --presets es2015 index.js -d dist/ && babel --presets es2015 lib -d dist/lib/","preinstall": "npm run compile" ...