10_webpack_polyfill

 

认识polyfill

polyfill可以帮助我们更好的去使用javascript

比如我们使用了一些语法特性(例如:Promise、Generator、Symbol)等以及实例方法例如(Array.prototype.includes等)

但是某些浏览器压根不认识这些特性,必然会报错;

那么我们就可以使用polyfill来填充或者说打一个补丁,那么就会包含该特性了

 

如何使用polyfill

babel7.4.0之前,可以使用@babel/polyfill的包,但是该包现在已经不推荐使用了

  如果你在旧版本的话就执行npm i @babel/polyfill   这里不要跟-D

babel7.4.0之后,可以通过单独引入core-js和regenerator-runtime来完成polyfill的使用
  npm i core-js regenerator-runtime  注意这里不用加-D

使用:

//bable.config.js
module.exports = {
  presets: [
    ["@babel/preset-env", {
      // false 不使用任何的polyfill
      //以下的两个值可能会发生冲突(加入第三方库如果实现了关于polyfill相关的东西,你再实现 会有冲突的问题),解决:在babel-loader中加入exclude属性
      // usage 根据源代码需要哪些polyfil就引入相关的api
      // entry只要是浏览器需要的polyfill都引入(不是根据源代码应用哪些polyfill)
      useBuiltIns: "usage",
    corejs:"3"
}] ] }

解决冲突

      {
        test: /\.js$/,
        exclude: /node_modules/,//排除哪些东西不使用babel的
        use: {
          loader: 'babel-loader',
        }
      }

需要注意的几个点:

这里需要注意一点的是:useBuiltIns为usage时需要声明core-js的版本为3
因为默认情况下他使用的是2版本的,会报错

useBuiltIns为entry时默认是不给你打补丁的,需要在入口文件中引入下面两个文件
  import 'core-js/stable';
  import 'regenerator-runtime/runtime'

 

认识Plugin-transform-runtime

在前面我们使用的polyfill,默认情况是添加的所有特性都是全局的

  如果我们正在编写一个工具库,这个工具库需要使用polyfill
  别人在使用我们工具时,工具库通过polyfill添加的特性,可能会污染他们的代码
  所以,当编写工具时,babel更推荐我们使用一个插件:@babel/plugin-transform-runtime来完成polyfill的功能

1.安装
npm i @babel/plugin-transform-runtime -D

 

 

 

 npm i @babel/runtime-corejs3

2.应用plugin

babel.config.js

module.exports = {
  presets: [
    "@babel/preset-env"
  ],
  //默认就是usage
  plugins: [
    ["@babel/plugin-transform-runtime", {
      corejs: 3
    }]
  ]
}

 

 

使用ts-loader

npm i ts-loader

局部安装typescript
npm i typescript

初始化一个tsconfig.json
tsc --init

配置ts-loader

 {
        test: /\.ts$/,
        use: 'ts-loader',
        exclude: /node_modules/
      }

ts-loader本质上是依赖于typescript(typescript Compiler)

 

Babel转换TS代码

除了使用ts-loader转换ts代码,还可以使用babel进行转换

babel不依赖typescriptCompiler

我们可以直接使用插件:@babel/transform-typescript;

但是更推荐使用preset:@babel/preset-typescript

安装:@babel/preset-typescript

npm i @babel/preset-typescript -D

配置

{
        test: /\.ts$/,
        //本质上是依赖于typescript(typescript Compiler)
        exclude: /node_modules/,
        use: 'babel-loader'
      },

 

module.exports = {
  presets: [
    ["@babel/preset-env", {
      useBuiltIns: "usage",
      corejs: "3"
    }],
    ["@babel/preset-typescript"]
  ],
}

 

ts-loader和babel-loader选择

babel-loader:优点polyfill,缺点不会对语法进行检查

ts-loader:优点有语法检查,缺点不能应用polyfill填充api

那么到底该如何选择babel呢?

我们可以在package.json中的scripts配置一个脚本如

 "scripts": {"type-check": "tsc --noEmit" //--noEmit对项目进行检测,不需要进行实际的输出(构建)
  },

然后我们的babel依然选择babel-loader

那么我们在构建项目之前可以先使用脚本检测一下代码,再进行构建

 

如果觉得构建之前还需要进行检测麻烦的话也可以这样子配置

  "scripts": {
    "build": "tsc --noEmit&webpack --config ./wp.config.js"
  },

 

或者也可以在参数后面加上watch
检测的时候 实时的监听源代码,如果发生改变会重新检测源代码

  "scripts": {
    "build": "webpack --config ./wp.config.js",
    "type-check": "tsc --noEmit --watch"
  },
posted @ 2022-04-18 23:12  Mr-Hou88888  阅读(138)  评论(0编辑  收藏  举报