Объедините JS с rollup и Babel для использования в IE11

#javascript #internet-explorer #module #babeljs #rollupjs

#javascript #internet-explorer #модуль #babeljs #rollupjs

Вопрос:

Я пытаюсь объединить два модуля JavaScript, чтобы результирующий код работал в IE11. Для этого я настроил проект yarn / npm, который используетrollup.js для объединения и Babel для переноса. Все работает нормально, пока я не добавлю зависимость (не от разработчика) core-js .

Вот подробности:

1 Настройка перед добавлением core-js

Файлы JS

  • src/main.js
  • src/utils.js

Конфигурационные файлы

package.json

 {
  "name": "rollup_for_ie",
  "devDependencies": {
    "@babel/core": "^7.11.1",
    "@babel/preset-env": "^7.11.0",
    "@rollup/plugin-babel": "^5.2.0",
    "@rollup/plugin-node-resolve": "^9.0.0",
    "rollup": "^2.24.0"
  },
}
  

rollup.config.js

 import resolve from '@rollup/plugin-node-resolve';
import babel from '@rollup/plugin-babel';

export default {
  input: 'src/main.js',
    output: {
        file: 'dist/main.js',
        format: 'iife'
    },
  plugins: [
    resolve({
      browser: true
    }),
    babel({
        exclude: "node_modules/**", // only transpile our source code
        babelHelpers: 'bundled'
    })
  ]
};
  

babel.config.js

 module.exports = {
  presets: [
    [
      "@babel/preset-env",
      {
        targets: {
          browsers: "> 0.5%, ie >= 11"
        },
        modules: false,
        spec: true,
        useBuiltIns: "usage",
        forceAllTransforms: true,
        corejs: 3
      }
    ]
  ],
};
  

При запуске rollup -c я получаю предупреждения о неразрешенных зависимостях, но создается объединенный файл dist/main.js с (используемым) материалом из каталога src. Результирующий файл работает даже в современных браузерах, таких как Chrome. Пока все хорошо.

Проблемы после добавления core-js

Однако связанный файл еще не готов для IE11: в IE я получаю ошибки типа Объект не поддерживает свойство или метод ‘getOwnPropertySymbols’. Итак, необходимо добавить полизаполнения из core-js.

Для этого я устанавливаю core-js в качестве зависимости от продукта. Теперь rollup -c не выдает мне предупреждений, но результирующий dist/main.js начинается как

 (function (exports) {
  'use strict';

  var $ = require('../internals/export');
.
.
.
  

который в качестве скрипта не могут выполнить ни Chrome, ни IE! Похоже, что каким-то образом наличие библиотеки core-js отключает rollup bundler.

Как я могу исправить свою настройку, чтобы результирующий dist/main.js скрипт работал как немодульный в Chrome и IE11?

Комментарии:

1. Можете ли вы точно сказать, что вы сделали при добавлении core-js? Вы имели в виду, добавляя corejs опцию в свой файл babel.config?

2. @tmhao2005 Я имею в виду, что я добавил core-js в качестве зависимости от продукта к модулям npm. Я сделал это с yarn add core-js . Конфигурация babel не изменилась.

3. Можете ли вы также поделиться минимальным кодом, который привел к ошибке? Пакет json и основная точка входа содержат ошибку

4. @tmhao2005 Ты имеешь в виду ошибку в браузере? После добавления core-js я получаю «требуется неопределенный». rollup -c Команда завершается в обоих случаях без ошибок. В первом случае я получаю предупреждения типа «(!) Неразрешенные зависимости».

5. Я понял тебя. Я собираюсь попытаться воспроизвести ваш код, содержащий проблему, затем попытаться собрать и просмотреть связанный файл. Имеет ли это смысл?

Ответ №1:

Я думаю, поскольку вы включили опцию, useBuiltIns: "usage" это означает, что она будет добавлять код из corejs в файлы вашего модуля, который написан в cjs стиле. Итак, вам нужно добавить этот плагин @rollup/plugin-commonjs для обратного преобразования в esm , тогда он будет работать:

 import commonjs from '@rollup/plugin-commonjs';

export default {
  // ...
  plugins: [
    // ...
    commonjs(),
  ]    
};
  

Комментарии:

1. Имеет полный смысл, когда вы объясняете это так — но я бы никогда до этого не додумался! Протестируем его в IE в понедельник.

2. Ха-ха 🙂 хорошо, тогда дайте мне знать результат

3. Отлично работает в IE. Еще раз спасибо @tmhao2005! 🙂