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

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

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

Проблема в том, что IE10 и under жалуются на то, что 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 ]

0 голосов
/ 14 декабря 2018

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

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

{
    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, если вы отладили.Поэтому первым шагом было бы увидеть, что Babel получает запрос на передачу vue-snotify, а затем дополнительно настроить babel-loader, чтобы не игнорировать его путь.

0 голосов
/ 14 декабря 2018

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

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

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

ИЛИ

Попробуйте useBuiltIns: "usage" и укажите отсутствующие полифилы, например:

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

ИЛИ

Try useBuiltIns: "usage"

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

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

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

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

...