Почему мой Babel-Loader не преобразует код моего поставщика, чтобы он действовал для IE8+?

Я использую последнюю версию Webpack, Babel и Babel-Loader в своем приложении Vue.js.

Я пытаюсь запустить мой код в IE 8, 9 и 10, но это не так.

Проблема в том, что IE10 и под жалуются, что const неверный синтаксис Я вижу, что это исходит от моего vendors~index.bundle.js файл. Этот файл содержит код, который не мой.

В частности, я вижу, что const из аддона Vue, который я использую, называется vue-snotify.

Почему Babel не преобразует код моего поставщика, чтобы он действовал для IE10 и ниже?

.babelrc

{
    "presets": [
        [
            "@babel/preset-env", {
                "useBuiltIns": "entry",
                "shippedProposals": true
            }
        ]
    ]
}

.browserslistrc

ie >= 8

.webpack.config.js

const path = require('path')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
    mode: 'production',
    devtool: false,
    performance: {
        hints: false
    },
    entry: {
        index: './src/ui/index.js',
        style:'./src/ui/app.sass'
    },
    output: {
        path: path.resolve(__dirname, 'build/public/static'),
        filename: 'js/[name].bundle.js',
        chunkFilename: 'js/[name].bundle.js',
        publicPath: 'static/'
    },
    optimization: {
        splitChunks: {
            chunks: 'all'
        }
    },
    module: {
        rules: [
            {
                test: /\.m?js$/,
                exclude: /node_modules/,
                loader: 'babel-loader'
            },
            {
                test: /\.vue$/,
                exclude: '/node_modules/',
                loader: 'vue-loader'
            },
            {
                test: /\.pug$/,
                loader: 'pug-plain-loader'
            },
            {
                test: /\.sass$/,
                use: [
                    'vue-style-loader',
                    'css-loader',
                    {
                        loader: 'sass-loader',
                        options: {
                            indentedSyntax: true
                        }
                    }
                ]
            },
            {
                test: /\.(png|jpg|jpeg|gif)$/,
                loader: 'file-loader',
                options: {
                    name: '[hash].[ext]',
                    outputPath: 'assets/'
                }
            },
            {
                test: /\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/,
                use: 'url-loader?limit=10000'
            }
        ]
    },
    plugins: [
        new VueLoaderPlugin(),
        new CopyWebpackPlugin([
            { from: 'src/server/app', to: '../../app' },
            { from: 'src/server/public', to: '../' },
            { from: 'src/server/vendor', to: '../../vendor' }
        ])
    ],
    resolve: {
        alias: {
            '@components': path.resolve(__dirname, 'src/ui/components'),
            '@store': path.resolve(__dirname, 'src/ui/Store'),
            '@assets': path.resolve(__dirname, 'src/ui/assets')
        },
        extensions: ['.js', '.vue']
    }
}

2 ответа

Решение

Как правило, сопровождающим пакетов рекомендуется упаковывать источники, для которых не требуются дополнительные этапы переноса или инструменты. Вавилон обеспечивает это, не перемещая модули, которые находятся под node_modules/ подпуть (также во избежание введения поддержки или случайного переноса связанных с Бабелем источников).

Это не рабочее решение, но оно должно направить вас в правильном направлении:

{
    test: /\.m?js$/,
    include: [
      path.resolve(__dirname, 'src'),    // Include your sources.
      require.resolve('vue-snotify')     // Include `vue-snotify` main module.
    ],
    loader: 'babel-loader',
    options: {
        // Babel has it's own defaults, so these have to be edited as well.
        include: [
            require.resolve('vue-snotify')
        ]
    }
}

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

DEBUG=babel* webpack

Учитывая ваши настройки прямо сейчас, Babel никогда не должен получать запрос на vue-snotify если вы отлажены. Итак, первым шагом было бы увидеть, что Бабель получает запрос на перенос. vue-snotify а потом дальше настраивать babel-loader не игнорировать его путь.

У меня недавно была похожая проблема. Этот документ может быть полезен.

  1. Так как вы используете "useBuiltIns": "entry" в вашем presets, пытаться import '@babel/polyfill' в вашем файле входа, например main.js, Однако, будьте осторожны, это может добавить неиспользованный полифилл и увеличить размер вашего пакета.

Это импортирует ВСЕ полизаполнения на основе ваших целевых списков браузеров, так что вам больше не нужно беспокоиться о зависимых полизаполнениях, но, скорее всего, увеличите ваш окончательный размер пакета с некоторыми неиспользованными полифилами.

ИЛИ ЖЕ

  1. Пытаться useBuiltIns: "usage" и укажите отсутствующие полифилы, вот так:

    module.exports = { presets: [ ['@vue/app', { useBuiltIns: "usage", polyfills: [ "es6.promise", "es6.symbol" ] }] ] };

ИЛИ ЖЕ

  1. Пытаться useBuiltIns: "usage"

автоматически обнаруживает необходимые заливки на основе языковых функций, используемых в вашем исходном коде. Это гарантирует, что в окончательный комплект входит только минимальное количество полифилов. Однако это также означает, что если к одной из ваших зависимостей предъявляются особые требования к полизаполнениям, по умолчанию Babel не сможет ее обнаружить.

это тот, который получил меня. Поэтому, если зависимость записана в версии ES, которую целевые среды не поддерживают, добавьте эту зависимость к transpileDependencies вариант в vue.config.js, Так vue.config.js будет иметь это

module.exports = {
  transpileDependencies: [
    "vue-snotify"
  ]
}

Что касается IE8, он не поддерживается AFAIK, как на странице vue github.

Другие вопросы по тегам