【umi】 非现代浏览器的兼容

也是在umi 社区看到一个比较有意思的事情,记录下

说到高级语法,不得不看下,目前tc 39更新ECAMSCript到哪里了,于是我翻了下finished-proposals , 好家伙, es2024(es15)出来了,

由于是新出来的API,浏览器支持的版本自然会比新。 一般Chrome和Firefox会比较快更新,但是Safari就比较慢了。

所以我们需要做兼容,通常是用babel转换语法,使用[polyfill]来兼容新的API,比如corejs

其他现代浏览器支持

一个用babel 支持 es6语法转发的webpack配置

ts 复制代码
const path = require("path");

module.exports = {
  entry: ["./src/index.js"],
  output: {
    filename: "main.js",
    path: path.resolve(__dirname, "dist"),
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: [
              [
                "@babel/preset-env",
                {
                  useBuiltIns: "usage",
                  corejs: 3,
                },
              ],
            ],
          },
        },
      },
    ],
  },
};

在umi中,不会用babel对node_modules 进行转换, 如果已经某些特定产物的是es6的产物的话,那么可以通过extraBabelIncludes来编译npm包或目录

arduino 复制代码
// .umirc.ts
 export default {
  extraBabelIncludes: ['monaco-editor'],
  }

对应的输出的webpack配置

json 复制代码
    {
        "test": {},
        "include": [
          [
            "/node_modules/.pnpm/registry.npmjs.org+monaco-editor@0.44.0/node_modules/monaco-editor",
            null
          ]
        ],
        "use": [
          {
            "loader": "/node_modules/.pnpm/registry.npmjs.org+@umijs+bundler-webpack@4.0.89_typescript@5.3.2_webpack@5.89.0/node_modules/@umijs/bundler-webpack/compiled/babel-loader/index.js",
            "options": {
              "sourceType": "unambiguous",
              "babelrc": false,
              "configFile": false,
              "cacheDirectory": false,
              "browserslistConfigFile": false,
              "targets": { "chrome": 80 },
              "presets": [
                [
                  "/node_modules/.pnpm/registry.npmjs.org+@umijs+babel-preset-umi@4.0.89/node_modules/@umijs/babel-preset-umi/dist/index.js",
                  {
                    "presetEnv": {},
                    "presetReact": { "runtime": "automatic" },
                    "presetTypeScript": {},
                    "pluginTransformRuntime": {},
                    "pluginLockCoreJS": {},
                    "pluginDynamicImportNode": false,
                    "pluginAutoCSSModules": true
                  }
                ]
          }
        ],
        "resolve": { "fullySpecified": false }
      },

umi对应的源码位置

之前运行 umi build,非常慢,如果添加多个extraBabelIncludes那就死翘翘了

umi4压缩js,默认使用的是esbuild ,据说会将es5->es6 ,但是我没真的试过,所以面对低版本的浏览器,即使配置targets也没用,必须要需要一起改压缩器, 听说 umi5(用rust写) 会去掉esbuild

umi4给出jsMinifiter(webpack)有多种压缩方式, esbuild是默认值

jsMinifier (webpack)

  • 类型:string,可选值 esbuild, terser, swc, uglifyJs, none
  • 默认值:esbuild

配置构建时压缩 JavaScript 的工具;none表示不压缩。

示例:

css 复制代码
{
  jsMinifier: 'esbuild'
}

jsminifieroptions

  • 类型:object
  • 默认值:{}

jsMinifier 的配置项;默认情况下压缩代码会移除代码中的注释,可以通过对应的 jsMinifier 选项来保留注释。

示例:

js 复制代码
{
  jsMinifier: 'esbuild',
  jsMinifierOptions: {
    minifyWhitespace: true,
    minifyIdentifiers: true,
    minifySyntax: true,
  }
}

配置项需要和所使用的工具对应,具体参考对应文档:

设置tragets

targets

  • 类型:object
  • 默认值:{ chrome: 80 }

配置需要兼容的浏览器最低版本。Umi 会根据这个自定引入 polyfill、配置 autoprefixer 和做语法转换等。

示例,

js 复制代码
// 兼容 ie11
targets: {
  ie: 11,
}

好奇这个自定引入 polyfill、配置 autoprefixer 是怎么做的,预计源代码

生成polyfill.ts

注意:从Babel 7.4.0开始,@babel/polyfill已被弃用,建议直接包含所需的core-js版本和regenerator-runtime/runtime,具体配置可以参考Babel官方文档。

IE支持

leagcy

1、 开启 legacy 参数

css 复制代码
legacy: {}

开启这个参数,无疑会增加构建时间,因为他会对node_modules进行转化, 一般不这么做

2、legacy mode

这种方式你要知道哪些包只提供es6的包

dart 复制代码
// .umirc.ts

export default {
  legacy: {
    nodeModulesTransform: false
  },
  extraBabelIncludes: [
    'some-es6-pkg',
    /@scope//
  ]
}

3、 提高兼容的鲁棒性

arduino 复制代码
// .umirc.ts

export default {
  headScripts: [
    'http://polyfill.alicdn.com/v3/polyfill.min.js' // or https://polyfill.io/v3/polyfill.min.js
  ],
  legacy: {}
}
  • 人工core-js

利用 core-js 系工具,如通过 core-js-builder 构建自己需要的 polyfill 产物,再以 前置 script 脚本 形式引入项目。

源码位置legacy

相关推荐
zqx_71 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己1 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称2 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色2 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2342 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河2 小时前
CSS总结
前端·css
BigYe程普3 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
余生H3 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
程序员-珍3 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
axihaihai3 小时前
网站开发的发展(后端路由/前后端分离/前端路由)
前端