babel在导入语句中遇到问题

时间:2015-11-05 12:32:54

标签: node.js express webpack babeljs

我有一个项目,我正在使用ES6中的节点,它使用babel-node来运行。现在我正试图以更加生产的方式实施babel,并尝试了两次尝试。

具有以下配置的Webpack babel-loader:

module.exports = {
  entry: './src/cloud/main.js',
  devtool: 'source-map',
  output: {
    path: './src/static/build',
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loaders: [
          'babel-loader?presets[]=es2015',
        ],
      },
      {
        test: /\.css$/,
        loaders: [
          'style-loader',
          'css-loader',
        ],
      },
      {
        test: /\.html$/,
        loaders: [
          'raw-loader',
        ],
      },
    ],
  },
}

它开始抱怨main.js中的import语句,并且使用我在类似问题中找到的?presets[]=es2015使其静音。然后问题到了,它过滤到导入到node_modules的语句,并带有以下消息:

错误在./~/socket.io/lib/index.js中 找不到模块:错误:无法解析

中的模块'fs'

我的另一种方法是使用这样的寄存器钩子:

require('babel-core/register')({
  ignore: /node_modules/,
});
require('./main.js');

但它抛出了这样的信息: 从'express'进口快递; ^^^^^^

SyntaxError:意外的保留字

// main.js - 简化

import express from 'express'
const app = express()
const server = app.listen(port, () => {
  console.log(`Listening at http://${server.address().address === '::' ? 'localhost' : server.address().address}:${server.address().port}`)
})

2 个答案:

答案 0 :(得分:2)

我认为您不需要在加载程序配置中排除node_modules。但是,您可能希望让webpack知道要解决的问题。尝试添加以下内容:

resolve: {
    root: path.join(__dirname),
    fallback: path.join(__dirname, 'node_modules'),
    modulesDirectories: ['node_modules'],
    extensions: ['', '.json', '.js', '.jsx', '.scss', '.png', '.jpg', '.jpeg', '.gif']
},

modulesDirectories密钥应该使webpack不会在工作目录中的每个require / import中运行。

此外,将目标添加到配置顶部应解决内置问题,例如fs

target: 'node'

答案 1 :(得分:2)

好的,我想通过其他答案和4m1r'答案。我发布了示例代码。

var path = require('path');
var fs = require('fs');

var nodeModules = {};
fs.readdirSync('node_modules')
  .filter(function (x) {
    return ['.bin'].indexOf(x) === -1;
  })
  .forEach(function (mod) {
    nodeModules[mod] = 'commonjs ' + mod;
  });

module.exports = {
  name: 'server',
  target: 'node',
  context: path.join(__dirname, 'src', 'cloud'),
  entry: {
    server: './main.js'
  },
  output: {
    path: path.join(__dirname),
    filename: '[name].js'
  },
  externals: nodeModules,
  module: {
    loaders: [
      {test: /\.js$/, exclude: /node_modules/, loaders: ['babel-loader?presets[]=es2015']}
    ]
  },
  resolve: {
    root: path.join(__dirname),
    fallback: path.join(__dirname, 'node_modules'),
    modulesDirectories: ['node_modules'],
  }
};

真正重要的是外部密钥,它阻止它通过需求泄漏到node_modules并在babel-loader中指定某些原因?presets[]=2015。我接受了4m1r,因为它最终修复了代码。