logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      渲染预处理 (Render Preprocessing)
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      进阶功能
      使用 Rspack
      使用 BFF
      基础用法
      运行时框架
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页提升构建性能下一页配置底层工具

      #浏览器兼容性

      #Browserslist 配置

      Modern.js 支持通过三种方式来设置 Web 应用需要兼容的浏览器范围。

      #方式一:通过.browserslistrc 文件配置

      Modern.js 支持设置 Web 应用需要兼容的浏览器范围,你可以在 .browserslistrc 文件里设置 Browserslist 的值。

      当你创建一个新的 Modern.js 项目时,默认会包含一份 .browserslistrc 配置,这表示 JavaScript 代码会被编译至 ES6 格式。

      .browserslistrc
      chrome >= 51
      edge >= 15
      firefox >= 54
      safari >= 10
      ios_saf >= 10

      当项目中未指定 overrideBrowserslist 配置时,该 .browserslistrc 文件会默认生效。

      #方式二:通过 package.json 配置

      你也可以在 package.json 文件中设置 browserslist 字段来配置 browserslist:

      package.json
      {
        "browserslist": [
          "chrome >= 51"
          // 其他浏览器的配置...
        ]
      }

      #方式三:通过 output.overrideBrowserslist 配置

      你也可以在 modern.config.js 文件中设置 output.overrideBrowserslist 字段来配置 browserslist:

      modern.config.js
      export default {
        output: {
          overrideBrowserslist: [
            'chrome >= 51',
            // 其他浏览器的配置...
          ],
        },
      };

      #配置优先级

      overrideBrowserslist 配置的优先级高于项目中的 .browserslistrc 配置文件和 package.json 中的 browserslist 字段。

      大多数场景下,推荐优先使用 .browserslistrc 文件,而不是使用 overrideBrowserslist 配置。因为 .browserslistrc 文件是官方定义的配置文件,通用性更强,可以被社区中的其他库识别。

      Tip

      请查看 Rsbuild - 设置浏览器范围 来了解更多内容。

      #Polyfill

      #编译时 Polyfill

      Modern.js 在编译时默认通过 core-js 引入对应的 Polyfill 代码。

      默认情况下会根据项目 Browserslist 的设置情况引入所需的 Polyfill 代码, 这样基本不用再担心项目源码和第三方依赖的 Polyfill 问题了,但是因为包含了一些没有用到的 Polyfill 代码,所以最终的包大小可能会有所增加。

      Info

      对于明确第三方依赖不需要 Polyfill 的场景,可以设置 output.polyfill 为 usage, 这样 Babel 编译时只会根据代码中使用到的语法引入 Polyfill 代码。

      #运行时按需 Polyfill

      Modern.js 中还提供了基于浏览器 UA 信息的运行时按需 Polyfill 方案,相比于 Babel 优势如下:

      • 不会插入到代码中,只根据访问页面的设备,按需下发 Polyfill 代码 ,减少整体代码体积。
      • 相同浏览器会公用一份 Polyfill 代码。因此,随着项目越来越多,基于 UA 的 Polyfill 代码下发速度会越来越快,综合速度超过常规方案。

      可以通过微生成器开启该功能:

      ? 请选择你想要的操作 启用可选功能
      ? 请选择功能名称 启用「基于 UA 的 Polyfill」功能

      执行命令后,在 modern.config.ts 中注册 Polyfill 插件:

      modern.config.ts
      import { polyfillPlugin } from '@modern-js/plugin-polyfill';
      
      export default defineConfig({
        plugins: [..., polyfillPlugin()],
      });

      配置 output.polyfill 为 ua 并且执行 pnpm run build && pnpm run serve 启动服务器后,访问页面可以看到 HTML 产物中包含如下脚本:

      <script src="/__polyfill__" crossorigin></script>

      在 Chrome 51 下访问页面可以看到 http://localhost:8080/__polyfill__ 返回内容如下:

      ua-polyfill

      注意

      该功能只有在使用 Modern.js 内置的 Web Server 时才会生效。

      如果有自定义模版的需求,请参考 HTML 模板。通过 html.template 或 tools.html 手动修改模版时,可能会导致该功能无法正确生效。