流星找不到重新导出的模块

Sti*_*lev 7 javascript node-modules meteor babeljs

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

(这是来自普通节点的示例,在同一目录中)

~/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] }
Run Code Online (Sandbox Code Playgroud)

我在ES6中编写,使用Babel创建模块公开的输出文件,ES5对我来说似乎很好:

var _color_range = require('./color_range');

Object.defineProperty(exports, 'color_range', {
  enumerable: true,
  get: function get() {
    return _interopRequireDefault(_color_range).default;
  }
});
Run Code Online (Sandbox Code Playgroud)

(这是我使用的ES6系列)

export {default as color_range} from './color_range'
Run Code Online (Sandbox Code Playgroud)

Chr*_*itz 4

您正在使用哪个版本的节点进行测试?我敢打赌,如果你meteor node这样做并尝试同样的方法,require('frog-utils')它不会工作,因为流星当前使用节点 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"
  ...
Run Code Online (Sandbox Code Playgroud)