reactjs - 适用于 Internet Explorer 9 的 React、Webpack 和 Babel

标签 reactjs internet-explorer-9 webpack babeljs

尝试支持 IE 9 for React。升级为 Webpack 使用 babel 6.3.26babel-preset-es2015babel-preset-react。但是,当在 IE 9 中加载该文件时,会出现语法错误。

webpack.config.js

/* eslint-env node */
var path = require('path');
var packageJson = require('./package.json');
var _ = require('lodash');
var webpack = require('webpack');

var context = process.env.NODE_ENV || 'development';

var configFunctions = {
    development: getDevConfig,
    production: getProdConfig,
    test: getTestConfig
};

var config = configFunctions[context]();

console.log('Building version %s in %s mode', packageJson.version, context);

module.exports = config;

function getLoaders() {
    if (context.indexOf('test') === -1) {
        return [
            {
                test: /\.js?$/,
                exclude: /(test|node_modules|bower_components)/,
                loader: 'babel-loader',
                query: {
                    presets: ['react', 'es2015'],
                    plugins: ['transform-runtime']
                }
            }
        ]
    } else {
        return [
            {
                test: /\.js?$/,
                exclude: /(node_modules)/,
                loader: 'babel-loader',
                query: {
                    presets: ['react', 'es2015'],
                    plugins: ['transform-runtime']
                }
            }
        ]
    }
}

function getBaseConfig() {
    return {
        context: __dirname + "/src",
        output: {
            path: path.join(__dirname, 'dist'),
            filename: 'bundle.js',
            publicPath: '/static/'
        },
        stats: {
            colors: true,
            reasons: true
        },
        resolve: {
            extensions: ['', '.js', '.jsx']
        },
        module: {
            loaders: _.union(
                getLoaders(),
                [
                    {
                        test: /\.scss$/,
                        loader: 'style!css!sass'
                    },
                    {
                        test: /\.eot$|\.svg$|\.woff$|\.ttf$/,
                        loader: 'url-loader?limit=30000&name=fonts/[name]-[hash:6].[ext]'
                    },
                    {
                        test: /\.(png|.jpe?g|gif)$/,
                        loader: 'url-loader?limit=5000&name=img/[name]-[hash:6].[ext]'
                    },
                    {
                        test: /\.mp4$/,
                        loader: 'url-loader?limit=5000&name=videos/[name]-[hash:6].[ext]'
                    }
                ]
            )
        }
    };

}

function getDevConfig() {
    return _.merge({}, getBaseConfig(), {
        devtool: 'cheap-module-eval-source-map',
        entry: [
            'babel-polyfill',
            'webpack-hot-middleware/client',
            './App'
        ],
        plugins: [
            new webpack.optimize.OccurenceOrderPlugin(),
            new webpack.HotModuleReplacementPlugin(),
            new webpack.NoErrorsPlugin()
        ],
        eslint: {
            emitError: false,
            failOnError: false,
            failOnWarning: false,
            quiet: true
        }
    });
}

function getProdConfig() {
    return _.merge({}, getBaseConfig(), {
        devtool: 'source-map',
        entry: [
            'babel-polyfill',
            './App'
        ],
        plugins: [
            new webpack.optimize.DedupePlugin(),
            new webpack.optimize.UglifyJsPlugin({
                minimize: true,
                compress: {
                    warnings: false
                }
            })
        ],
        eslint: {
            emitError: true,
            failOnError: true
        }
    })
}

function getTestConfig() {
    return _.merge({}, getBaseConfig(), {})
}

检查 bundle.js 中的违规行会发现使用了 const,它不是 ES5。我在这里错过了什么吗?我是否需要将 ES6 代码转换为 ES5 以供生产使用?

最佳答案

IE9 不兼容 ES6,所以,是的,您必须将 ES6 代码转换为 ES5。我相信问题是你没有告诉 babel 使用 reactes2015 预设。我确信您已将它们安装在您的计算机上,但 babel 加载器只会执行您告诉它的操作。

getLoaders() 函数中,将预设添加到 babel loader 配置查询中:

query: {
  plugins: ['transform-runtime'],
  presets: ['react', 'es2015']
}

希望这对您有用。

babel/babel-loader reference

关于reactjs - 适用于 Internet Explorer 9 的 React、Webpack 和 Babel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34650799/

相关文章:

javascript - 在 React 中使用 map 从数组渲染时出现错误渲染

javascript - 用于用户身份验证的 Azure AD B2C REST API 终结点

javascript - 在 Internet Explorer 9 中禁用 F5

reactjs - 如何使用 webpack 使库真正实现 tree-shaking?

javascript - 如何在 ReactJS 中预览视频

javascript - 使用 Spread Operator 更改数组中的属性返回对象而不是数组

javascript - awesome-typescript-loader 无法加载 ts 文件

javascript - 来自另一个js的全局变量

jquery - IE9浏览器检测显示IE8

css - 自动检查 IExplorer CSS3 兼容性