Прозрачная вложенная ES6-зависимость node_modules верхнего уровня node_modules зависимости - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть зависимость в моих node_modules в формате ES6, и у него есть свои вложенные node_modules зависимости, это также формат ES6.

Мне удалось как включить зависимость верхнего уровня, например dependencyA в конфигурацию babel и перенести ее как код проекта. Но как это сделать, если эта зависимость имеет другие зависимости в формате ES6? Итак: как настроить babel / webpack для переноса вложенной зависимости node_modules ?

Вот структура

Project (Babel/Webpack/Typescript)
 - node_modules
   - dependencyA (ES6) // ok, added top level ES6 dep to babel transpilation
     - node_modules
       - nested_dependency (ES6) // what to do with that?

Должен ли я go глубже и вручную включить такой вложенный пакет node_modules?

например. babel.config. js

const path = require('path');
module.exports = function (api) {
  api.cache(true);
  return {
    sourceMaps: true,

    include: [
      path.resolve('src'),
      path.resolve('node_modules/dependencyA'), // ok, added top level ES6 dep

      path.resolve('node_modules/dependencyA/node_modules/nested_dependency'), // should I do that?
    ],
    presets: [
      '@babel/preset-env',
      '@babel/preset-react',
      '@babel/preset-flow',
      '@babel/preset-typescript',
    ],
  .....

выглядит немного избыточно. Есть ли способ справиться с этим? Спасибо за любую помощь!

1 Ответ

1 голос
/ 24 апреля 2020

Есть крутой способ сделать это, используя регулярное выражение отрицательный взгляд на голову.

Синтаксис: X(?!Y), это означает «поиск X, но только если за ним не следует Y».

Допустим, вы знаете, какие узлы-модули deps (на первом уровне) вы хотите перенести.

Вы можете указать это регулярное выражение /(dep1|dep2)[\\/](?!.*node_modules)/.

const PATH_DELIMITER = '[\\\\/]'; // match 2 antislashes or one slash
const safePath = (module) => module.split('/').join(PATH_DELIMITER);

const generateIncludes = (modules) => {
  return [
    new RegExp(`(${modules.map(safePath).join('|')})$`),
    new RegExp(`(${modules.map(safePath).join('|')})${PATH_DELIMITER}(?!.*node_modules)`)
  ];
};

const generateExcludes = (modules) => {
  return [
    new RegExp(
      `node_modules${PATH_DELIMITER}(?!(${modules.map(safePath).join('|')})(${PATH_DELIMITER}|$)(?!.*node_modules))`
    )
  ];
};

Этот код взят из next-transpile-modules .

Эти 2 функции должны вызываться с массивом модулей, которые вам нужно перенести, и передать его include & exclude

...