Rob*_*QSS 10 javascript babel webpack babel-polyfill npm-scripts
我得的WebPack与巴贝尔工作,包括@通天塔/填充工具,还试图使用时IE11仍是投掷SCRIPT438错误.forEach上NodeList.
这是我的 package.json
{
...
"scripts": {
"build:js": "webpack --config ./_build/webpack.config.js"
},
...
"browserslist": [
"IE 11",
"last 3 versions",
"not IE < 11"
],
"babel": {
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage"
}
]
]
},
"devDependencies": {
"@babel/core": "^7.1.6",
"@babel/preset-env": "^7.1.6",
"babel-loader": "^8.0.4",
"webpack": "^4.25.1",
"webpack-cli": "^3.1.2"
},
"dependencies": {
"@babel/polyfill": "^7.0.0"
}
}
Run Code Online (Sandbox Code Playgroud)
我的webpack.config.js:
const path = require('path');
const webpack = require('webpack');
module.exports = (env, argv) => {
const javascript = {
test: /\.js$/,
use: {
loader: 'babel-loader'
}
};
// config object
const config = {
entry: {
main: './_src/js/main.js',
},
devtool: 'source-map',
output: {
path: path.resolve(__dirname, '../js'),
filename: '[name].js',
},
module: {
rules: [javascript]
}
}
return config;
}
Run Code Online (Sandbox Code Playgroud)
最后/_src/main.js,我正在通过webpack和babel运行:
const testList = document.querySelectorAll('.test-list li');
testList.forEach(item => {
console.log(item.innerHTML);
})
Run Code Online (Sandbox Code Playgroud)
https://babeljs.io/docs/en/babel-polyfill上的文档说您不需要import或require polyfill通过Webpack加载它时useBuiltIns: "usage".但即使我删除该选项并手动导入整个polyfill顶部main.js(使我的捆绑巨大),它仍然在IE11中出错.
那么......我做错了什么?
con*_*exo 27
babel-polyfill不会填充缺少的Web API /原型方法 core-js.
另请注意,您的问题标题具有误导性,因为@babel/polyfill它不是ES6功能.core-js可迭代收集目前只是候选推荐(截至2018年8月).
只需在Javascript的顶层包含您自己的polyfill:
if (window.NodeList && !NodeList.prototype.forEach) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
Run Code Online (Sandbox Code Playgroud)
一旦core-js 3稳定,这可能会改变:https://github.com/zloirock/core-js/issues/329
如果您开始采用ES6中使用的常用模式,您也可以不使用任何polyfill:
const testList = [...document.querySelectorAll('.test-list li')];
Run Code Online (Sandbox Code Playgroud)
要么
const testList = Array.from(document.querySelectorAll('.test-list li'));
Run Code Online (Sandbox Code Playgroud)
您拥有的另一个选择是使用forEach:
const lis = document.querySelectorAll('.test-list li');
for (const li of lis) {
// li.addEventListener(...) or whatever
}
Run Code Online (Sandbox Code Playgroud)
最后,您还可以采用常见的ES5模式:
var testList = document.querySelectorAll('.test-list li');
Array.prototype.forEach.call(testList, function(li) { /*whatever*/ });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5666 次 |
| 最近记录: |