js 兼容性处理

Posted shanlu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 兼容性处理相关的知识,希望对你有一定的参考价值。

js 兼容性处理:babel-loader  @babel / core

npm install --save-dev babel-loader @babel/core

index.js 中,使用了箭头函数的语法,打包编译后同样也是箭头函数,这在 chrome中没有任何问题,正常输出7,但在 IE 中打开,会有语法错误,

 IE浏览器并不支持箭头函数语法,所以需要 用 babel 做兼容性处理,webpack中就是 babel-loader

1,基本 js 兼容性 处理:@babel / preset-env,只能转换基本语法,promise 高级语法不能转换

npm install --save-dev  @babel/preset-env 

const {resolve} = require(\'path\')
const htmlWebpackPlugin = require(\'html-webpack-plugin\')

module.exports={
    entry:\'./src/index.js\',
    output:{
        filename:\'bundle.js\',
        path:resolve(__dirname,\'build\')
    },
    module:{
        rules:[
            {
                test: /\\.js$/,  //js兼容性处理,用到babel-loader @babel/core
                exclude:/node_modules/,
                loader:\'babel-loader\',
                options: {
                    presets: [\'@babel/preset-env\'] //预设:指示babel做怎么样的兼容性处理(基本处理)
                }
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:\'./src/index.html\'
        })
    ],
    mode:\'development\'
}

IE 中正常打印:

  

 处理后的 bundle.js中,const 变成了var,箭头函数也变成了普通函数,将 es6以上的语法都处理为 es6以下的语法

    

 但不能解决 promise 等高级语法的兼容性问题:

 

 

2,全部 js 兼容性处理:@babel / polyfill,只要解决部分兼容性问题,却要将所有兼容性代码全部引入,体积太大

  npm install --save-dev  @babel/polyfill 

  直接在 index.js 中引入即可:

import \'@babel/polyfill\'
const add = (x, y) => {
  return x + y;
};
console.log(add(2, 5));

const p = new Promise((resolve,reject)=>{
  resolve(\'执行promise\')
})
p.then(res=>{
  console.log(res)
})

  webpack编译后,IE浏览器正常兼容 promise,但bundle.js 体积变化太大:

  

  

3,需要做兼容性处理的就做处理,按需加载,core-js

npm install --save-dev  core-js

const {resolve} = require(\'path\')
const HtmlWebpackPlugin = require(\'html-webpack-plugin\')

module.exports={
    entry:\'./src/index.js\',
    output:{
        filename:\'bundle.js\',
        path:resolve(__dirname,\'build\')
    },
    module:{
        rules:[
            {
                test: /\\.js$/,  //js兼容性处理,用到babel-loader @babel/core
                exclude:/node_modules/,
                loader:\'babel-loader\',
                options: {
                    presets: [[\'@babel/preset-env\', { //预设:指示babel做怎么样的兼容性处理(基本处理)
                        useBuiltIns: \'usage\',   // 按需加载
                        corejs: {  // 指定core-js版本
                            version: 3
                        },             
                        targets: { // 指定兼容性做到哪个版本浏览器
                            chrome: \'60\',
                            firefox: \'60\',
                            ie: \'9\',
                            safari: \'10\',
                            edge: \'17\'
                        }
                    }]] 
                
                }
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:\'./src/index.html\'
        })
    ],
    mode:\'development\'
}

 打包后的文件轻了不少:

 

 

 

  

 

以上是关于js 兼容性处理的主要内容,如果未能解决你的问题,请参考以下文章

如何在多片段活动中处理 onContextItemSelected?

前端程序员的蜕变——JS的 event 对象属性使用实例兼容性处理(极大提高代码效率减少代码量)

30秒就能看懂的JavaScript 代码片段

几个非常实用的JQuery代码片段

兼容ie8,firefox,chrome浏览器的代码片段

js学习总结----DOM2兼容处理顺序问题