实现 Rollup 插件alias 并使用vitest提高开发效率

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

本篇文章是对 实现 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 并使用vitest提高开发效率,rollup,vitest
我们只需要在 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 并使用vitest提高开发效率,rollup,vitest
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 并使用vitest提高开发效率,rollup,vitest

为插件添加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 并使用vitest提高开发效率,rollup,vitest
可以进行如下修改以完善 ts 类型提示:

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

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

补充单元测试

安装 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 并使用vitest提高开发效率,rollup,vitest

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-610803.html

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

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

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

相关文章

  • AI开发助手TalkX:提高编码效率和质量的IDEA插件

    编程领域的巨大进步一直以来都在推动着技术的革新与演进,但令程序员们苦恼的问题之一是如何在繁琐的编码过程中提高效率和质量。然而,随着科技的发展,AI如洪水猛兽般席卷整个互联网,一款全新的智能AI开发助手在这样的大环境下应运而生:TalkX——专为技术开发群

    2024年02月05日
    浏览(57)
  • 【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率

    前言 ReferenceFinder 是一个比较小众的插件

    2024年02月16日
    浏览(45)
  • vue数组对象快速获取最大值和最小值(linq插件各种常用好用方法),提高开发效率

    需求:因后端传入的数据过多,前端需要在数组中某一值的的最大值和最小值计算,平常用的最多的不就是遍历之后再比对吗,或者用sort方法等实现,同事交了我一招, 一句话就可以获取到数组对象中最大值和最小值 ,那就是用 linq插件 ,确实好用,用法也很简单,故而分

    2024年02月16日
    浏览(65)
  • 【Unity 实用工具篇】✨| ReferenceFinder 引用查找插件,提高引擎查找使用效率

    前言 ReferenceFinder 是一个比较小众的插件

    2024年02月14日
    浏览(61)
  • 从0开始搭建前端项目:使用ChatGPT实现高自动化完成率,提高开发效率并掌握最新前端技术

    大家好,我是老李,我很高兴向您介绍我即将发布的一系列关于前端项目开发的文章。在这个系列中,我将借用 ChatGPT 的帮助,从零开始搭建一个前端项目,并尝试达到 70% 以上的自动化完成率。 这个系列的文章将带您从搭建项目的基础开始,一步步实现一个完整的前端项目

    2024年02月06日
    浏览(81)
  • 如何优雅地使用Low Code提高开发效率

    2023年,低代码热度有,但是在企业内部核心场景的落地比例不高,推进进展也没有想象中快。就算是这样,低代码赛道也在“暗流涌动”。 数字化趋势下,很多企业想要以数字化的手段进行降本增效 。很多企业希望以低代码的模式,搭建符合自身业务需求的应用。 现在国内

    2024年02月09日
    浏览(66)
  • 使用vscode进行python的单元测试,提高开发效率

    单元测试在我们的开发过程中非常有必要,它可以验证实现的一个函数是否达到预期。以前在学校写代码时,都是怼一堆代码,然后直接运行,如果报错再一步步调试,这样大部分时间都浪费在调试工作上。工作后发现大家都使用单元测试,这样做其实更规范,也提高了开发

    2024年02月03日
    浏览(61)
  • curl+postman 在java开发中的使用(提高效率)

    curl 是一个常用的命令行工具,用于发送各种类型的 HTTP 请求,包括 GET、POST、PUT、DELETE 等。它也可以用来下载文件、上传文件、设置 cookie、发送 multipart/form-data 等等。 实际中的接口: 分析 --location:此选项用于启用HTTP重定向的自动处理 --request POST:指定请求方法为POST --

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

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

    2024年02月15日
    浏览(54)
  • 全文高能!提高工作效率的9个VS Code扩展插件

    1/ Path Intellisense 这个扩展会自动补全文件名。就像在 HTML 中使用标签一样,它会自动补全标签。 2/ Live Server 这个扩展允许你在浏览器上启动本地项目并进行实时重载,这样你就不必在每次更改后不停地刷新了。 3/ CodeGeeX CodeGeeX 是一个使用AI技术的辅助编程工具,帮助开发人员

    2024年02月11日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包