实现 Rollup 插件alias 并使用单元测试提高开发效率

这篇具有很好参考价值的文章主要介绍了实现 Rollup 插件alias 并使用单元测试提高开发效率。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章是对 实现 Rollup 插件 alias | 使用 TypeScript 实现库的基本流程 | 使用单元测试提高开发效率 的总结。其中涉及到开发一个组件库的诸多知识点。

实现一个经常用的 alias 插件

首先执行 npm init 命令初始化一个 package.json 文件,由于插件使用了 typescript 作为类型校验,需要执行 tsc --init 命令去生成一个ts的配置文件 tsconfig.json,执行完上述的命令之后安装项目依赖。

pnpm i rollup typescript @rollup/plugin-typescript tslib -D

先简单实现一下这个插件,插件要求导出一个方法并且返回一个对象:

// src/index.ts
import { Plugin } from 'rollup'

export function alias(): Plugin {
  return {
    name: 'alias',
    resolveId (source: string, importer: string | undefined) {
      console.log('resolveId', source, importer)
      return source
    }
  }
}

由于 .ts 文件无法直接被运行,接下来需要将 index.ts 编译成可执行的 js 文件,新增一个配置文件rollup.config.js,并指定输入以及输出:

// rollup.config.js
import { defineConfig } from 'rollup'
import typescript from "@rollup/plugin-typescript"

export default defineConfig({
  input: './src/index.ts', // 入口文件
  output: {
    file: './dist/index.js', // 输出文件
    format: 'es'
  },
  plugins: [
    typescript({
      module:'esnext'
    })
  ]
})

package.json 里面新增一条命令,并执行pnpm build

"scripts": {
    "build": "rollup -c rollup.config.js"
  },

一般执行到这里会有一个 CommonJSES module 的类型冲突,如图所示:

实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup
我们只需要在 package.json 指定类型即可:

// package.json
{
    // 省略部分代码
	"type": "module",
}

再次运行 pnpm build 可以发现在 dist 目录下会生成打包完成之后的 index.js 文件。

作为一个 npm 依赖包,当别人去安装的时候需要指定执行的文件在哪,即修改 package.json 里面的 main 字段:

"main": "index.js" ——> "main": "./dist/index.js"

测试开发好的 alias 插件

在根目录下新增一个 example 文件夹并且新增测试文件 index.js、add.js 写入相关的测试代码:

// example/index.js
import { add } from './utils/add.js'
console.log(add(1, 2))

// example/utils/add.js
export function add (a, b) {
  return a + b;
}

example 文件夹下新增配置文件 rollup.config.js,并且补充 build 命令,由于这里使用的是 .js 为测试文件所以不需要使用 typescript 具体操作和上文类似:

// example/rollup.config.js
import { defineConfig } from 'rollup'

export default defineConfig({
  input: 'index.js', // 入口文件
  output: {
    file: './dist/index.js', // 输出文件
    format: 'es'
  }
})

如何在 example 里面引入我们开发的插件呢?在 example 目录下执行如下命令就可以使用我们开发的插件。

// ../上层目录
pnpm i ../ -D

解释下上述代码的含义:

pnpm i ../ -D 是一个命令,它可以将当前项目(即插件开发项目)中的依赖包链接到上层或其他目录的项目中。

假设我们在插件开发时,需要引用某些库,这些库又已经在上层项目中安装过,在不需要重复安装依赖的情况下,可以使用 pnpm i ../ -D 命令将上层项目中的依赖包快速链接到当前开发目录中。

在执行该命令时,会寻找 ../ 目录下的 package.json 文件,然后安装该文件中所包含的依赖包,并在当前项目中创建依赖的符号链接。

  • …/:表示上层目录,也可以是其他目录
  • -D:表示安装依赖包,并将其添加到当前项目的 devDependencies 中

这个命令一般用于本地开发、测试和调试,请注意在发布插件时,依赖的包需要在 package.json 中定义并通过 npm 或相关的包管理工具进行安装和打包。

执行完之后在会 example/package.json 新增如下代码:

"scripts": {
  "build": "rollup -c rollup.config.js"
},
"devDependencies": {
  "rollup": "^3.26.2",
  "rollup-alias": "link:.." //  新增的依赖
}

实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup
example/rollup.config.js 里面引入我们编写的 alias 插件,完整的代码如下:

import { defineConfig } from 'rollup'
import { alias} from 'rollup-alias'

export default defineConfig({
  input: 'index.js',
  output: {
    file: './dist/index.js',
    format: 'es'
  },
  plugins: [
    alias()
  ]
})

在此执行 pnpm build 可以发现已经成功的打印出了 log

实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup

为插件添加TS类型提示

首先补充插件的参数类型提示并且完善一下插件逻辑:

// rollup.config.js
import { Plugin } from 'rollup'

interface AliasOptions {
  entries: { [key: string]: string }
}

export function alias(options: AliasOptions): Plugin {
  const { entries } = options
  return {
    name: 'alias',
    resolveId(source: string, importer: string | undefined) {
      console.log('resolveId', source, importer)

      const key = Object.keys(entries).find((e) => {
        return source.startsWith(e)
      })
      if (!key) return source
      return source.replace(key, entries[key]) + '.js'
    }
  }
}

执行 build 之后在我们会发现 alias 插件在传参的时候并没有对应的参数类型提示:

实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup
可以进行如下修改以完善 ts 类型提示:

  • 需要在根目录下的 tsconfig.json 文件中开启 "declaration": true 功能
  • 同时设置 "outDir": "./dist"
  • 在根目录下的 package.json 里面添加 "types": "./dist/index.d.ts"
  • 执行完上述操作之后再次执行 pnpm build

实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup
再次使用插件的时候就可以看到相应的提示
实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup

补充单元测试

安装 pnpm i vitest -D,补充单元测试文件 index.spec.ts,添加测试命令:

// src/index.spec.ts
import { describe, it, expect } from 'vitest'
import { alias } from '.'

describe('alias', () => {
  it('should replace when match successful', () => {
    const aliasObj:any = alias({
      entries: {
        '@': './utils'
      }
    })
    expect(aliasObj.resolveId('@/add')).toBe('./utils/add.js')
  })

  it('should not replace when match fail', () => {
    const aliasObj: any = alias({
      entries: {
        '@': './utils'
      }
    })
    expect(aliasObj.resolveId('!/add')).toBe('!/add')
  })
})

补充测试命令:

"scripts": {
  +   "test": "vitest"
  },

同时,我们需要在 build 的时候排除掉我们的测试文件在根目录下的 tsconfig.json 补充如下代码 "exclude": ["./src/*.spec.ts"]
然后执行pnpm test 可以看到这里的测试用例是通过的也可以证明我们写的代码是没问题的。

实现 Rollup 插件alias 并使用单元测试提高开发效率,rollup

entries 支持数组格式

这里直接贴完成之后的代码:

// rollup.config.js
import { Plugin } from 'rollup'

interface AliasOptions {
  entries: { [key: string]: string } | { find: string, replacement: string }[]
}

export function alias(options: AliasOptions): Plugin {
  const entries = normalizeEntries(options.entries)
  return {
    name: 'alias',
    resolveId(source: string, importer: string | undefined) {
     
      console.log('resolveId', source, importer)
      const entry = entries.find((e) => e.match(source))

      if (!entry) return source

      return entry.replace(source)
    }
  }
}

function normalizeEntries(entries: AliasOptions["entries"]) {
  if (Array.isArray(entries)) {
    return entries.map(({ find, replacement }) => {
      return new Entry(find, replacement)
    })
  } else {
    return Object.keys(entries).map((key) => {
      return new Entry(key, entries[key])
    })
  }
}

class Entry {
  constructor(private find: string, private replacement: string) { }
  match(filePath: string) {
    return filePath.startsWith(this.find)
  }
  replace(filePath: string) {
    return filePath.replace(this.find, this.replacement)
  }
}

以上就简单的实现了一个 rollup 插件开发的大致流程。文章来源地址https://www.toymoban.com/news/detail-576875.html

到了这里,关于实现 Rollup 插件alias 并使用单元测试提高开发效率的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Maven】单元测试、统计、覆盖率相关插件使用介绍

    maven-surefire-plugin 是 maven 执行单元测试的插件,不显性配置也可以直接使用。 这个插件的 surefire:test 命令会默认绑定 maven 执行的 test 阶段。 执行结束后,默认在 target/surefire-reports 目录下会生成 txt 和 xml 两种格式的结果,不利于直观展示,需要结合其它插件一起使用。 如果

    2024年02月08日
    浏览(39)
  • Springboot 使用插件 自动生成Mock单元测试 Squaretest

    很多公司对分支单测覆盖率会有一定的要求,比如 单测覆盖率要达到 60% 或者 80%才可以发布。 有时候工期相对紧张,就优先开发功能,测试功能,然后再去补单元测试。 但是编写单元测试又比较浪费时间,有没有能够很大程度上自动化生成单元测试的插件,自己改下就行

    2023年04月08日
    浏览(51)
  • 编程辅助插件BitoAI使用指南(以VSCode开发环境为例安装并使用BitoAI插件从而提高生产效率)

    2023年是AI爆发元年,已经被各种AI工具、新闻轰炸了几个月,只有一种感觉:时间不够用! 本插件使用与ChatGPT相同的模型!目前免费,且拥有强大的辅助能力,可以数倍提升程序开发能力,并大大提高开发效率。 Bito AI使编写代码、理解语法、编写测试用例、解释代码、评论

    2023年04月25日
    浏览(69)
  • 5个编写技巧,有效提高单元测试实践

    “在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类、抽象类、或者派生类中的方法。

    2023年04月26日
    浏览(43)
  • 什么是 Jest ? Vue2 如何使用 Jest 进行单元测试?Vue2 使用 Jest 开发单元测试实例

    Jest 是一个流行的 JavaScript 测试框架,由 Facebook 开发并维护,专注于简单性和速度。它通常用于编写 JavaScript 和 TypeScript 应用程序的单元测试、集成测试和端到端测试。 特点: 简单易用: Jest 提供简洁的 API 和易于理解的语法,使得编写测试用例变得简单快捷。 零配置:

    2024年01月25日
    浏览(53)
  • 插件自动单元测试,起飞

     安装完重启生效    补充:推荐插件 TestMe插件,结合junit+mockito 更多请参考:(5条消息) Mockito的使用案例_ldj2020的博客-CSDN博客

    2024年02月16日
    浏览(25)
  • 使用机器学习实现自动化测试:提高效率和准确性

    在软件开发的过程中,测试是一个至关重要的环节。传统的手动测试往往耗时耗力,而且存在人为疏漏的可能。为了解决这些问题,许多团队开始将机器学习应用于自动化测试,以提高测试效率和准确性。 本文将介绍如何使用机器学习技术来实现自动化测试,从而显著提升软

    2024年02月15日
    浏览(54)
  • 【Java设计模式 规范与重构】 二 重构的保障:单元测试,以及如何提高代码可测试性

    其实之前的工作中强调过很多次自己做测试的重要性,例如讲单元测试的: 【C#编程最佳实践 一】单元测试实践 ,讲单元测试规范的 【阿里巴巴Java编程规范学习 四】Java质量安全规约 ,讲接口测试的: 【C#编程最佳实践 十三】接口测试实践 ,这里旧事重提就不再详细展开

    2023年04月25日
    浏览(64)
  • 几款提高开发效率的Idea 插件

    开发代码过程中经常会有一些需要提交到代码仓库的文件,比如java文件生成的.class、.jar 等,如果将编译后的文件都提交到代码库那么代码库会很大,关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到代码仓库的问题。 提供Spring环境下的

    2024年01月16日
    浏览(57)
  • idea中用不了test单元测试插件

    这是因为你没有安装test相关的插件,我们需要下载一个插件,   首先打开idea--File--setting--plugins(如下图) 搜索Junit,然后安装第一个插件,重启应用即可使用。 注意:在实际程序应用中,我们输入@test后,还要Alt+Enter进行导包。 安装好插件后就可操作了,

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包