热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

八、使用模块别名增强Jest配置

八、使用模块别名增强Jest配置JavaScript社区中的模块管理器(主要是ES模块

八、使用模块别名增强 Jest 配置

Javascript 社区中的模块管理器(主要是 ES 模块和 CommonJS)不支持基于项目的路径。它们只支持我们自己模块的相对路径和node_modules文件夹的路径。随着项目的发展,通常会看到以下路径:

import SomeComponent from "../../../../components/SomeComponent";

幸运的是,我们有不同的方法来处理这个问题,我们可以定义文件夹相对于项目根目录的别名,因此我们可以按如下方式编写前一行:

import SomeComponent from "@/components/SomeComponent";

这里,@是定义根项目的任意字符。但是,您可以定义自己的。让我们看看有什么解决方案可以应用模块别名。让我们从最后一章(中结束的地方开始 https://github.com/alexjoverm/vue-testing-series/tree/test-slots )。

网页包别名

网页包别名(https://webpack.js.org/configuration/resolve/#resolve-别名的设置非常简单。您只需要在您的网页包配置中添加一个resolve.alias属性。如果您查看build/webpack.base.conf.js,它已经定义了:

module.exports = {
// ...
resolve: {
extensions: [".js", ".vue", ".json"],
alias: {
vue$: "vue/dist/vue.esm.js"
}
}
};

以此为入口点,我们可以添加一个指向src文件夹的简单别名,并将其用作根目录:

module.exports = {
// ...
resolve: {
extensions: [".js", ".vue", ".json"],
alias: {
vue$: "vue/dist/vue.esm.js",
"@": path.join(__dirname, "..", "src")
}
}
};

仅此一项,我们就可以访问任何内容,将根项目作为@符号。让我们转到src/App.vue并更改对这两个组件的引用:

import MessageList from "@/components/MessageList";
import Message from "@/components/Message";
// ...

如果我们运行npm start并在localhost:8080打开浏览器,这应该是现成的。

然而,如果我们试图通过运行npm t来运行测试,我们将看到 Jest 没有找到模块。我们还没有配置 Jest 来执行此操作。因此,让我们转到 Jest 配置所在的package.json,并将"@/([^\\.]*)$": "/src/$1"添加到moduleNameMapper

{
"jest": {
"moduleNameMapper": {
"@(.*)$": "/src/$1",
"^vue$": "vue/dist/vue.common.js"
}
}
}

下面是对前面代码段的解释:


  • @(.*)$:which 以“@”开头,并以字面上的 which((.*)$)继续,直到字符串的末尾,使用括号将其分组。

  • /src/$1是一个特殊的玩笑词,意思是根目录。然后,我们将其映射到src并使用$1附加(.*)语句中的 whatever 子句。

例如,当您从srctest文件夹导入时,@/components/MessageList将映射到../src/components/MessageList

就是这样。现在,您甚至可以更新您的App.test.js文件以使用别名,因为它可以在测试中使用:

import { shallowMount } from "@vue/test-utils";
import App from "@/App";
// ...

此外,它还适用于.vue.js文件。

多个别名

通常,为了方便起见,会使用多个别名,因此,您可以使用多个别名,而不是仅使用一个@来定义根文件夹。例如,假设您有一个actions文件夹和一个models文件夹。如果为每个文件夹创建别名,然后移动文件夹,则只需更改别名,而不是更新代码库中对它的所有引用。这就是模块别名的威力——它们使您的代码库更易于维护和清理。

现在,让我们为build/webpack.base.conf.js添加一个components别名:

module.exports = {
// ...
resolve: {
extensions: [".js", ".vue", ".json"],
alias: {
vue$: "vue/dist/vue.esm.js",
"@": path.join(__dirname, "..", "src"),
components: path.join(__dirname, "..", "src", "components")
}
}
};

然后,我们也只需要将其添加到package.json中的 Jest 配置中:

{
"jest": {
"moduleNameMapper": {
"@(.*)$": "/src/$1",
"components(.*)$": "/src/components/$1",
"^vue$": "vue/dist/vue.common.js"
}
}
}

就这么简单。现在,我们可以在App.vue中尝试使用两种形式:

import MessageList from "components/MessageList";
import Message from "@/components/Message";

停止并重新运行测试,这样应该可以工作。你也可以跑npm start试试。

其他解决方案

我看过巴别塔插件网页包别名(https://github.com/trayio/babel-plugin-webpack-alias ),特别用于摩卡(等其他测试框架 https://mochajs.org/ ),它没有模块映射器。

我自己也没有试过,因为 Jest 已经提供给你了,但是如果你已经试过,或者想试一下,请分享一下它是如何进行的。

收工

添加模块别名非常简单,可以使代码库更干净,更易于维护。玩笑也使定义它们变得非常容易;你只需要保持与网页别名的同步,你就可以说再见点地狱参考。

您可以在GitHub(上找到与本章相关的工作代码 https://github.com/alexjoverm/vue-testing-series/tree/Enhance-Jest-configuration-with-Module-Aliases )。


推荐阅读
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
  • Vue CLI 初始化 Webpack 项目时,main.js 文件是如何被调用的? ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
author-avatar
xi曦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有