#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! 🙂