Как включить несколько пакетов node_modules в babel-node - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь включить @ mycompany / package1 и @ mycompany / package2 для компиляции вместе с остальной частью моего кода, используя babel-node. Поскольку package1 и package2 находятся в ES6. (Также обратите внимание, что я не использую Webpack)

В моем jest конфиге я добавил опцию ниже в мой конфиг jest, который отлично работает. При тестировании кода правильно скомпилирует пакеты

"transformIgnorePatterns": [
  "/node_modules/(?!(@mycompany)/).*/"
],

Но при попытке запустить babel-node я получаю ошибки. В моем babel.config.js

module.exports = {
  presets: [
    '@babel/preset-flow',
    [
      '@babel/preset-env',
      {
        targets: {
          node: 8
        }
      }
    ]
  ],
  plugins: ['@babel/plugin-proposal-class-properties']
};

Я попытался добавить приведенный ниже код в мой babel.config.js, но он по-прежнему жалуется на ошибки ES6 в моих node_modules / @ mycompany / package1

Я пытался include пакет viz, но тогда babel не собирал мои файлы src

include: [path.resolve(__dirname, 'node_modules/@mycompany/package1')]

include: ['/node_modules/((@mycompany)/).*/']

Я пытался exclude все, кроме пакетов @mycompany, но в моем пакете все еще появляются ошибки транспиляции1

exclude: [/node_modules\/(?!(@mycompany)\/).*/],

Я пытался поиграть с игнором, но они не кажутся подходящими для чтения документов

1 Ответ

0 голосов
/ 28 января 2019

Я обнаружил, что мы можем сделать это с webpack, чтобы помочь связать пакеты с остальным кодом.

Это мой файл веб-пакета для NodeJS.

const path = require('path');
const nodeExternals = require('webpack-node-externals');
const webpack = require('webpack');
const spawn = require('child_process').spawn;
const nodeEnv = process.env.NODE_ENV;
const isProduction = nodeEnv === 'production';

const compiler = webpack({
  entry: ['@babel/polyfill', './src/server.js'],
  output: {
    path: path.resolve(__dirname, 'lib'),
    filename: 'server.bundle.js',
    libraryTarget: 'commonjs2'
  },
  externals: [
    nodeExternals({
      whitelist: [/@mycompany\/.*/]
    })
  ],
  plugins: plugins,
  target: 'node',
  mode: 'development',
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules\/(?!(@mycompany)\/).*/,
        use: {
          loader: 'babel-loader',
          options: {
            configFile: './babel.config.js'
          }
        }
      }
    ]
  }
});

if (isProduction) {
  compiler.run((err, stats) => {
    if (err) {
      console.error(err);
      return;
    }

    console.log(
      stats.toString({
        colors: true
      })
    );
  });
} else {
  let serverControl;
  compiler.watch(
    {
      aggregateTimeout: 300,
      poll: 1000
    },
    (err, stats) => {
      if (serverControl) {
        serverControl.kill();
      }

      if (err) {
        console.error(err);
        return;
      }

      console.log(
        stats.toString({
          colors: true
        })
      );
      // change app.js to the relative path to the bundle created by webpack, if necessary
      serverControl = spawn('node', [
        path.resolve(__dirname, 'lib/server.bundle.js')
      ]);

      serverControl.stdout.on('data', data => console.log(data.toString()));
      serverControl.stderr.on('data', data => console.error(data.toString()));
    }
  );
}

Обратите внимание, что наиболее важной частью является

  1. Добавление webpack-node-externals.Поскольку это сервер node.js, нам не нужно связывать node_modules.
  2. Убедитесь, что whitelist ваш пакет необходим для компиляции / сборки, а также убедитесь, что ваши пакеты включены для компиляции в babel-loader
  • nodeExternal говорит webpack знать, что не нужно связывать ЛЮБЫЕ узлы-модули.
  • whitelist говорит, что мы должны связать пакеты, которые мы перечислили

    externals: [ nodeExternals({ whitelist: [/@mycompany\/.*/] }) ]

  • Эта строка означает исключение всех модулей node_modules EXCEPT @ mycompany / *

    exclude: /node_modules\/(?!(@mycompany)\/).*/,

...