我正在使用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
};
};
答案 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规范。