Использование @ babel / регистрация для приложения React в Node v13 - PullRequest
1 голос
/ 17 января 2020

У меня есть приложение, созданное с использованием create-react-app, и у него есть точка входа, которая использовала что-то вроде этого -

require('babel-register')({
  ignore: [/(node_modules)/],
  presets: ['es2015', 'react-app'],
  plugins: [
    'syntax-dynamic-import',
    'dynamic-import-node',
    'react-loadable/babel'
  ]
});
require('./index');

Я нахожусь в процессе обновления Node (с v8 до v13.5) и решил обновить тоже Бабель. Используя Babel 7, приведенный выше фрагмент кода был переписан как -

require('@babel/register')({
  ignore: [/(node_modules)/],
  presets: ['@babel/preset-env', 'react-app'],
  plugins: [
    '@babel/plugin-syntax-dynamic-import',
    'dynamic-import-node',
    'react-loadable/babel'
  ],
});
require('./index');

Теперь, когда я запускаю это, я получаю ошибку -

internal/modules/cjs/loader.js:1160
      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /my-app/node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js
require() of ES modules is not supported.
require() of /my-app/node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js from /my-app/server/controllers/index.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename asyncToGenerator.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /my-app/node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/package.json.

Я предполагаю, что это потому, что preset-env использует поддержку модулей, так как обнаруживает ее в моей версии Node (v13.6.0). Если это то, как я могу решить эту проблему, как заставить его использовать пресет es2015? Они давно устарели в пользу preset-env.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

Вы можете либо перейти на Node v10, либо добавить его к существующему

  "start": "node --experimental-modules src/index.mjs "
0 голосов
/ 12 марта 2020

Я наткнулся на этот комментарий на трекер проблем проекта Babel, который говорит, что BABEL_ENV должен быть установлен на test для переноса модулей.

Соответствующий код из связанного комментария: здесь -

[
    isEnvTest && [
        // ES features necessary for user's Node version
        require('@babel/preset-env').default,
        {
            targets: {
                node: 'current',
            },
        },
    ],
    (isEnvProduction || isEnvDevelopment) && [
        // Latest stable ECMAScript features
        require('@babel/preset-env').default,
        {
            // Allow importing core-js in entrypoint and use browserlist to select polyfills
            useBuiltIns: 'entry',
            // Set the corejs version we are using to avoid warnings in console
            // This will need to change once we upgrade to corejs@3
            corejs: 3,
            // Do not transform modules to CJS
            modules: false,
            // Exclude transforms that make all code slower
            exclude: ['transform-typeof-symbol'],
        },
    ]
]

Установка BABEL_ENV в test устраняет мою проблему.

0 голосов
/ 17 февраля 2020

Если вы используете библиотеку geolib. Пожалуйста, попробуйте обновить вашу зависимость от geolib до 3.2.x. Флаг "type": "module" был удален из 3.1.x -> 3.2.x

или попробуйте изменить версию узла на 12.11.1, 12.12.0

. См. Обсуждение здесь https://github.com/manuelbieh/geolib/issues/208

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...