从带有babel的node_modules导入模块但失败了

时间:2015-08-05 02:46:51

标签: reactjs babeljs

我用es6编写了一个模块并发布到npm,我想在另一个项目中使用它,所以我输入如下:

import {ActionButton} from 'rcomponents'

但它不起作用:

D:\github\blog\node_modules\rcomponents\src\actionButton.jsx:1
(function (exports, require, module, __filename, __dirname) { import React fro
                                                              ^^^^^^
SyntaxError: Unexpected reserved word
    at exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:443:25)
    at Module._extensions..js (module.js:478:10)
    at Object.require.extensions.(anonymous function) [as .jsx] (D:\github\blog\
node_modules\babel\node_modules\babel-core\lib\api\register\node.js:214:7)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at D:\github\blog\node_modules\rcomponents\src\index.js:3:19
    at Object.<anonymous> (D:\github\blog\node_modules\rcomponents\src\index.js:
7:3)

这是我在webpack中的js loader配置:

{ test: /\.jsx?$/, loader: `babel?cacheDirectory=${babelCache}` }

当我尝试导入一个非node_modules的模块时,babel工作得很好。但是从node_modules导入模块,babel似乎不起作用?

3 个答案:

答案 0 :(得分:23)

请参阅the babel docs

  

注意:默认情况下,将忽略node_modules的所有要求。您可以通过传递忽略正则表达式来覆盖它。

一般来说,期望node_modules中的模块已经提前编译过,因此它们不会被Babel处理。如果你不这样做,那么你需要告诉它它可以处理哪些文件。 ignore允许这样做。

require("babel/register")({
    // Ignore everything in node_modules except node_modules/rcomponents.
    ignore: /node_modules\/(?!rcomponents)/
});

答案 1 :(得分:4)

通常,上传到npm的软件包应该是预编译的,因此用户可以获得正常的JS并且不需要构建步骤。请使用npm prepublish

但是,如果您正在使用webpack,则可以在webpack配置中指定exclude函数(请参阅webpack docs):

module: {
  loaders: [{
    test: /.jsx?$/,
    loader: 'babel-loader',
    exclude(file) {
      if (file.startsWith(__dirname + '/node_modules/this-package-is-es6')) {
        return false;
      }
      return file.startsWith(__dirname + '/node_modules');
    },

如果您直接使用babel,you can write a similar ignore function in the require hook

答案 2 :(得分:1)

您可以使用https://www.npmjs.com/package/babel-node-modules 对于这种情况

npm install --save-dev babel-node-modules
require('babel-node-modules')([
  'helloworld' // add an array of module names here 
]);

然后它将列出的模块编译为其他文件