Jest 无法识别 ES modules 问题及解决方式

阅读时长 6 分钟读完

在前端开发中,我们经常会使用 Jest 来进行单元测试。然而,在实际使用过程中,我们可能会遇到 Jest 无法识别 ES modules 的问题。

问题描述

Jest 是基于 CommonJS 模块系统来工作的。在 ES modules 中,我们可能使用了 import/export 来进行模块化。当我们在 Jest 中使用 ES modules 时,就会出现以下报错:

这是因为 Jest 默认情况下无法识别 ES modules 的语法,而只识别 CommonJS 模块。因此,需要对 Jest 进行配置,才能让其正确识别 ES modules。

解决方式

方案一:使用 Babel 转换 ES modules

我们可以使用 Babel 来将 ES modules 转换成 CommonJS 模块。这个方案需要安装 @babel/preset-env@babel/plugin-transform-modules-commonjs 两个依赖包。

在项目的根目录下创建 .babelrc 文件,输入以下配置:

可以看到,我们使用了 @babel/preset-env 来转换所有的现代 JavaScript 语法(包括 ES6)为 ES5,以使其能够在更旧的浏览器上运行。同时,我们还使用了 @babel/plugin-transform-modules-commonjs 来将 ES modules 转换成 CommonJS 模块。

完成以上的配置后,我们还需在 Jest 的配置文件中,添加对 Babel 配置文件的引用。在 jest.config.js 或者 package.json 中添加以下代码:

这样,当我们在运行 Jest 的时候,就会性正确解析 ES modules 的语法。

方案二:使用 Jest 的 esModules 选项

如果你不想使用 Babel,我们还可以使用 Jest 内置的 esModules 选项来解决这个问题。

我们来看一个 Vue 项目中的配置:

-- -------------------- ---- -------
-
  ------- -
    ------------------- -
      ----------- ------------------
    --
    ----------------------- -
      -----
      -------
      -----
    --
    ------------ -
      ------------ ------------------------------------
      -------------- ---------------------------------
    --
    ------------------ -----
    ---------------------- -
      --------------------
      ---------------
      ---------------------
    --
    ---------------------- -
      --------------------------------------------
    --
    ------------ -
      ------------------------------------------------
    --
    ---------- --------------------
    ---------- -----
    ---------- -
      ----------- -
        ------------ ----
      -
    -
  -
-
展开代码

可以看到,我们在 globals 选项中使用了 esModules 来开启 Jest 的 ES modules 解析选项。这样,我们在运行 Jest 时,就可以正常解析 ES modules 的语法。

总结

Jest 无法识别 ES modules 的问题,可以使用 Babel 的配置来解决问题,也可以直接使用 Jest 的 esModules 选项来解决问题。不管使用哪种方式,都十分简单易懂。希望这篇文章可以帮助大家更好地使用 Jest 进行单元测试。

示例代码

-- -------------------- ---- -------
-- -------
-- --------
------ -------- ----- -
  ------ ------ -------
-

-- --
------ - --- - ---- ----------
-------------------

-- ----------------------------
-- --------
-- --------------
-------------- - -
  ---------- -
    ------------------------- -----------------------------------
  --
  ------------------------ ----------------------------------------------------
  ------ ------------------
  --------------------- ------ ------ ----- ------ ------- -------
--

-- ----------------------------
-- --------
-- --------------
-------------- - -
  ---------- -
    ------------------------- ------------
  --
  ----------------- -
    ----------- ------------------
  --
  --------------------- ------ ------ ------- -------
  ---------- -
    -------------------------------------------------------------------------------
  --
  -------- --------------------
  -------- -
    ----------- -
      ------------ ----
    -
  -
--
展开代码

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65b8ddf9add4f0e0ff16e2e0

纠错
反馈

纠错反馈