如果你遇到了构建相关的问题,可以参考当前文档进行排查。
Modern.js 内部基于 Rsbuild 封装了自身的构建工具,因此你可以直接参考 Rsbuild 的 FAQ 文档:
默认情况下,Modern.js 的 webpack 编译缓存生成在 ./node_modules/.cache/webpack
目录下。
如果需要清空本地的编译缓存,可以执行以下命令:
Modern.js 提供 inspect 命令 用于查看项目最终生成的 Modern.js 配置以及 webpack / Rspack 配置。
如果编译时出现以下报错,通常是由于项目中安装了错误的 webpack 版本,或者安装了多个 webpack 版本引起:
webpack 版本问题有以下几种情况:
如果是第一种情况,建议从项目的 package.json 中移除 webpack 依赖。因为 Modern.js 默认封装了 webpack 相关能力,并且会在 tools.webpack 配置项中传入 webpack 对象。因此在大多数情况下,不建议在项目中额外安装 webpack 依赖。
如果是第二种情况,建议看看能否升级某个 npm 包,使其依赖的 webpack 版本范围与 Modern.js 保持一致。也可以通过包管理器的能力来手动统一版本,比如使用 yarn resolutions 或 pnpm overrides。
如果是第三种情况,可以使用第二种情况中提到的两种方法,也可以尝试删除 lock 文件后重新安装来解决。
删除 lock 文件会使项目中的依赖版本自动升级到指定范围下的最新版,请进行充分的测试。
出于编译性能的考虑,默认情况下,Modern.js 不会编译 node_modules
下的文件,也不会编译当前工程目录外部的文件。
因此,当你引用其他子项目的源代码时,可能会遇到类似 You may need an additional loader to handle the result of these loaders.
的报错。
这个问题有以下解决方法:
source.include
配置项,指定需要额外进行编译的目录或模块,参考 source.include 用法介绍。如果编译正常,但是打开页面后出现 exports is not defined
报错,通常是因为在项目中使用 Babel 编译了一个 CommonJS 模块,导致 Babel 出现异常。
在正常情况下,Modern.js 是不会使用 Babel 来编译 CommonJS 模块的。如果项目中使用了 source.include 配置项,则可能会把一些 CommonJS 模块加入到 Babel 编译中。
该问题有两种解决方法:
sourceType
配置项设置为 unambiguous
,示例如下:将 sourceType
设置为 unambiguous
可能会产生一些其他影响,请参考 Babel 官方文档。