Webpack、IE8 和 ES6 模块
Webpack, IE8 and ES6 modules
最新版本的 webpack 不支持 IE8。我已经尝试使用 1.12.12(我认为这是支持 IE8 的最后一个版本),但仍然会从不可调整的 Object.defineProperty
.
中得到错误
https://github.com/webpack/webpack/issues/2085
上一个支持IE8的webpack版本是什么?它曾经与 ES6 模块一起工作吗?
webpack.config.js:
var webpack = require("webpack");
var es3ifyPlugin = require('es3ify-webpack-plugin');
var productionPlugin = new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify('production')
}
});
var devPlugin = new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify("dev")
}
});
module.exports = {
entry: {
assessment: "./src/aaa/app.js"
},
//devtool: "source-map",
output: {
path: "../AAA/wwwroot/js",
filename: "[name].bundle.js",
publicPath: "/"
},
resolve: {
extensions: ["", ".js"]
},
module: {
preLoaders: [
{
test: /\.js$/,
loader: "eslint-loader",
exclude: "node_modules"
}
],
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
},
{
// todo: move less compiling to web project
test: /\.less$/,
loader: "style-loader!css-loader!less-loader",
exclude: "node_modules"
},
]
},
devServer: {
historyApiFallback: true,
inline: true,
proxy: {
"/api": {
"target": {
host: "localhost",
protocol: "http:",
port: "58211",
},
changeOrigin: true,
pathRewrite: { "^/api": "" }
}
},
publicPath: "/assets/"
},
plugins: [
new es3ifyPlugin(),
new webpack.optimize.CommonsChunkPlugin({
name: "vendor",
minChunks: isExternal
}),
productionPlugin
//devPlugin
]
}
function isExternal(module) {
var userRequest = module.userRequest;
if (typeof userRequest !== "string") {
return false;
}
return userRequest.indexOf("node_modules") >= 0;
}
转译后的代码如下所示:
exports.test = '123';
webpackJsonp([1, 0], [
function (module, exports, __webpack_require__) {
'use strict';
var _imported = __webpack_require__(1);
alert('test ' + _imported.test);
function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var test = exports.test = 123;
}
]);
问题是babel默认是怎么翻译ES2015代码的。在默认(非松散)模式下它 uses Object.defineProperty
,但这可以通过使用松散模式进行配置。
// webpack.config.js
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: [ ['es2015', {"loose": true}] ]
}
}
]
}
这导致以下编译代码:
/* 0 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _imported = __webpack_require__(1);
var _imported2 = _interopRequireDefault(_imported);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log('test ' + _imported2.default);
/***/ },
/* 1 */
/***/ function(module, exports) {
"use strict";
exports.__esModule = true;
var test = 123;
exports.default = test;
/***/ }
/******/ ])
旧答案
来自讨论,因为这已经解决了您的问题:
1.13.0 于 2016 年 4 月 15 日发布。看来这应该可行。您确定您没有在自己的应用程序代码中使用 getters/setters 吗?也许您可以仅使用 hello world 示例代码创建一个超级简单的示例,并尝试使用 1.13 版本创建构建。我猜这样创建的代码不应该使用 Object.defineProperty
。
最新版本的 webpack 不支持 IE8。我已经尝试使用 1.12.12(我认为这是支持 IE8 的最后一个版本),但仍然会从不可调整的 Object.defineProperty
.
https://github.com/webpack/webpack/issues/2085
上一个支持IE8的webpack版本是什么?它曾经与 ES6 模块一起工作吗?
webpack.config.js:
var webpack = require("webpack");
var es3ifyPlugin = require('es3ify-webpack-plugin');
var productionPlugin = new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify('production')
}
});
var devPlugin = new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify("dev")
}
});
module.exports = {
entry: {
assessment: "./src/aaa/app.js"
},
//devtool: "source-map",
output: {
path: "../AAA/wwwroot/js",
filename: "[name].bundle.js",
publicPath: "/"
},
resolve: {
extensions: ["", ".js"]
},
module: {
preLoaders: [
{
test: /\.js$/,
loader: "eslint-loader",
exclude: "node_modules"
}
],
loaders: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
},
{
// todo: move less compiling to web project
test: /\.less$/,
loader: "style-loader!css-loader!less-loader",
exclude: "node_modules"
},
]
},
devServer: {
historyApiFallback: true,
inline: true,
proxy: {
"/api": {
"target": {
host: "localhost",
protocol: "http:",
port: "58211",
},
changeOrigin: true,
pathRewrite: { "^/api": "" }
}
},
publicPath: "/assets/"
},
plugins: [
new es3ifyPlugin(),
new webpack.optimize.CommonsChunkPlugin({
name: "vendor",
minChunks: isExternal
}),
productionPlugin
//devPlugin
]
}
function isExternal(module) {
var userRequest = module.userRequest;
if (typeof userRequest !== "string") {
return false;
}
return userRequest.indexOf("node_modules") >= 0;
}
转译后的代码如下所示:
exports.test = '123';
webpackJsonp([1, 0], [
function (module, exports, __webpack_require__) {
'use strict';
var _imported = __webpack_require__(1);
alert('test ' + _imported.test);
function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var test = exports.test = 123;
}
]);
问题是babel默认是怎么翻译ES2015代码的。在默认(非松散)模式下它 uses Object.defineProperty
,但这可以通过使用松散模式进行配置。
// webpack.config.js
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: [ ['es2015', {"loose": true}] ]
}
}
]
}
这导致以下编译代码:
/* 0 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _imported = __webpack_require__(1);
var _imported2 = _interopRequireDefault(_imported);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log('test ' + _imported2.default);
/***/ },
/* 1 */
/***/ function(module, exports) {
"use strict";
exports.__esModule = true;
var test = 123;
exports.default = test;
/***/ }
/******/ ])
旧答案
来自讨论,因为这已经解决了您的问题:
1.13.0 于 2016 年 4 月 15 日发布。看来这应该可行。您确定您没有在自己的应用程序代码中使用 getters/setters 吗?也许您可以仅使用 hello world 示例代码创建一个超级简单的示例,并尝试使用 1.13 版本创建构建。我猜这样创建的代码不应该使用 Object.defineProperty
。