如何将Babel转换为es5而不是es5.1

时间:2018-02-15 08:55:27

标签: javascript npm webpack babel

我正在使用npm,webpack和babel在es6中编写我的库并进行转换+缩小。但结果转换为使用Object(Object.defineProperty)的ecmaScript 5.1,但我的目标是不支持Object的ecmaScript 5,或者如果发现其他限制则降低ecmaScript。 (我需要的javascript版本是Rhino中使用的版本。) (我的目标是Rhino 1.7R3

我的问题是,如何配置babel来做呢? 我发现了polyfill,但我不知道如何使用它来实现我的目标。

babelrc

{  "presets": ["env"]  }

webpack.config

    module.exports = function(env, argv) {
    env = env || {};

    const webpack = require('webpack');
    const UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;

    let libraryName = 'jsgmc';
    let plugins = [], outputFile;

    if (env.prod) {
        plugins.push(new UglifyJsPlugin({minimize: true}));
        outputFile = libraryName + '.min.js';
    } else {
        outputFile = libraryName + '.js';
    }

    return {
        entry: __dirname + '/src/jsgmc.js',
        devtool: 'source-map',
        output: {
            path: __dirname + '/dist',
            filename: outputFile,
            library: libraryName,
            libraryTarget: 'this'
        },
        module: {
            rules: [
                {
                    test: /\.js$/,
                    exclude: /(node_modules|bower_components)/,
                    use: {
                        loader: 'babel-loader',
                        options: {
                            presets: ['babel-preset-env'],
                            plugins: [require('babel-plugin-add-module-exports')]
                        }
                    }
                }
            ]
        },
        plugins: plugins
    };

};

2 个答案:

答案 0 :(得分:3)

使用babel-preset-env时,您可以使用配置选项指定要支持的浏览器版本。

不幸的是,无法指定Rhino,但您可以尝试定位一个非常旧的浏览器,例如Internet Explorer 7正常运行。

.babelrc

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["ie < 8"]
      }
    }]
  ]
}

使用名为browserslist的模块解析配置选项。

您可以在线here尝试 browserslist 查询。

另一个可以帮助您的有用工具是compatibility table

有趣的是,这表明Rhino 1.7支持Object.defineProperty

答案 1 :(得分:0)

正如帕特里克所说,Rhino 1.7及更低版本不支持Object.defineProperty。 对我来说合适的解决方案是使用这个简单的polyfil。请注意,此解决方案是可行的,因为我正在构建的库将不具有高级功能。否则,其他功能必须用例如具有高度实验性的ssham es5 polyfill进行多填充。 (它的等效垫片es5不包含例如对象特征)

无法透露到javascript的子版本。这是5.1或什么都没有。也可以使用闭包编译器(已经是旧工具)转换到以前的主要版本es3,但它可能会导致一些重大问题,因为现在这是非常古老的js规范。