一文学会 ts 构建工具 —— tsup

在这里插入图片描述

文章目录

  • 能打包什么?
  • 安装
  • 用法
    • 自定义配置文件
    • 条件配置
    • 在 package.json 中配置
    • 多入口打包
    • 生成类型声明文件
    • sourcemap
    • 生成格式
    • 自定义输出文件
    • 代码分割
    • 产物目标环境
    • 支持 es5
    • 编译的环境变量
    • 对开发命令行工具友好
    • 监听模式 watch
    • 提供成功构建的钩子 onSuccess
    • 压缩产物 minify
    • 自定义 loader
    • Tree shaking
    • 类型检查
    • 支持 CSS (实验性功能)
    • 元数据文件 metafile
    • 自定义 esbuild 插件和配置
    • 注入 cjs 和 esm shims (垫片)
    • 复制文件到输出目录
    • 在项目中使用 tsup
  • 常见问题
    • error: No matching export in "xxx.ts" for import "xxx"

tsup

Bundle your TypeScript library with no config, powered by esbuild.

tsup 号称不用配置文件,打包 ts 库。底层为 esbuild。tsup 这么宣传,说明它肯定做了很多预设封装,不需要太多配置,开箱即用。

rollup 已经是牛夫人了。

能打包什么?

node.js 支持的都能打包,.js, .json, .mjs.。加上 ts 相关的 .ts, .tsx。

安装

npm i tsup -D
# Or Yarn
yarn add tsup --dev
# Or pnpm
pnpm add tsup -D

用法

tsup [...files]

默认打包到 ./dist
能自动排除 node_modules 。
默认打包为 es5,CommonJS,

eg:

tsup src/index.ts src/cli.ts

生成 dist/index.js 和 dist/cli.js

自定义配置文件

可选的文件:

  • tsup.config.ts
  • tsup.config.js
  • tsup.config.cjs
  • tsup.config.json

–config 配置项可指定配置文件。

import { defineConfig } from 'tsup'

export default defineConfig({
  entry: ['src/index.ts'],
  splitting: false,
  sourcemap: true,
  clean: true,
})

条件配置

导出一个函数,tsup cli 会执行这个函数。

import { defineConfig } from 'tsup'

export default defineConfig((options) => {
  return {
    minify: !options.watch,
  }
})

在 package.json 中配置

{
  "tsup": {
    "entry": ["src/index.ts"],
    "splitting": false,
    "sourcemap": true,
    "clean": true
  },
  "scripts": {
    "build": "tsup"
  }
}

多入口打包

export default defineConfig({
  // Outputs `dist/a.js` and `dist/b.js`.
  entry: ['src/a.ts', 'src/b.ts'],
  // Outputs `dist/foo.js` and `dist/bar.js`
  entry: {
    foo: 'src/a.ts',
    bar: 'src/b.ts',
  },
})

生成类型声明文件

tsup index.ts --dts

sourcemap

tsup index.ts --sourcemap

生成格式

支持 esm,cjs (默认) 和 iife。

tsup src/index.ts --format esm,cjs,iife
dist
├── index.mjs         # esm
├── index.global.js   # iife
└── index.js          # cjs

如果 package.json 的 type 字段为 module。命名会变成:

dist
├── index.js          # esm
├── index.global.js   # iife
└── index.cjs         # cjs

自定义输出文件

export default defineConfig({
  outExtension({ format }) {
    return {
      js: `.${format}.js`,
    }
  },
})

代码分割

默认支持 esm ,并且默认开启。CJS 需要 --splitting 手动开启。

产物目标环境

target 选项配置构建产物的目标环境,默认是 node16。

可支持:

  • chrome
  • edge
  • firefox
  • hermes
  • ie
  • ios
  • node
  • opera
  • rhino
  • safari

target 也可以指定 js 版本,比如 es2020,es5。

支持 es5

esbuild 是不支持 es5 的。tsup 是怎么做到的?

tsup 会先打包成 es2020,然后通过 SWC 转成 es5。

编译的环境变量

tsup src/index.ts --env.NODE_ENV production

对开发命令行工具友好

当入口文件如 src/cli.ts 包含 hashbang(即 #!/bin/env node)时,tsup 会自动使输出文件可执行,因此您无需运行 chmod +x dist/cli.js 来手动设置可执行权限。

监听模式 watch

tsup src/index.ts --watch

可选择忽视监听的文件:

tsup src src/index.ts --watch --ignore-watch folder1 --ignore-watch folder2

提供成功构建的钩子 onSuccess

这在监听模式下非常有用。

import { defineConfig } from 'tsup'

export default defineConfig({
  async onSuccess() {
    // Start some long running task
    // Like a server
    const server = http.createServer((req, res) => {
      res.end('Hello World!')
    })
    server.listen(3000)
    return () => {
      server.close()
    }
  },
})

压缩产物 minify

tsup src/index.ts --minify

默认是用 esbuild 压缩,也可以用 terser 代替。前提必须安装 terser。

npm install -D terser

tsup src/index.ts --minify terser

在 tsup.config.js 中,您可以传递 terserOptions,这些选项将原封不动地传递给 terser.minify。

自定义 loader

esbuild 提供这些 loader:

type Loader =
  | 'js'
  | 'jsx'
  | 'ts'
  | 'tsx'
  | 'css'
  | 'json'
  | 'text'
  | 'base64'
  | 'file'
  | 'dataurl'
  | 'binary'
  | 'copy'
  | 'default'

会发现上面没有图片的 loader,但我们可以指定 loader 去处理某些后缀的图片。

import { defineConfig } from 'tsup'

export default defineConfig({
  loader: {
    '.jpg': 'base64', 
    '.webp': 'file',
  },
})

Tree shaking

esbuild 默认开启了 tree shaking。但它的 tree shaking 可能有问题,所以 tsup 允许你选择 rollup 的 tree shaking 去替代 esbuild。

import { defineConfig } from 'tsup'

export default defineConfig({
  treeshake: true, // 使用 rollup tree shaking
}

类型检查

esbuild 之所以快,就是因为它不会执行 ts 类型检查。你应该依靠 IDE 在完成类型检查。
如果你就想在构建时,执行类型检查,可以开启 --dts。
它会生成类型声明文件,自然也会进行类型检查。

支持 CSS (实验性功能)

元数据文件 metafile

传递 --metafile 标志,告诉 esbuild 以 JSON 格式生成一些关于构建的元数据。您可以将输出文件提供给像 bundle buddy 这样的分析工具,以可视化您的包中的模块以及每个模块占用多少空间。

生成的文件格式为:metafile-{format}.json。eg:metafile-cjs.json

自定义 esbuild 插件和配置

import { defineConfig } from 'tsup'

export default defineConfig({
  esbuildPlugins: [YourPlugin],
  esbuildOptions(options, context) {
    options.define.foo = '"bar"'
  },
})

注入 cjs 和 esm shims (垫片)

shims 本意为垫片,类似于补丁的意思

启用此选项将在构建 esm/cjs 项目时填充一些代码以使其工作。

例如 __dirname 仅在 cjs 模块中可用,而 import.meta.url 仅在 esm 模块中可用。打完补丁后,esm 中就也能用 __dirname 了。

import { defineConfig } from 'tsup'

export default defineConfig({
  shims: true,
})

打的补丁具体是什么样的?

CJS 项目会添加如下代码:

// import.meta.url:
(import.meta.url as typeof document) === "undefined"
    ? new URL("file:" + __filename).href
    : (document.currentScript && document.currentScript.src) || new URL("main.js", document.baseURI).href;

esm 项目会添加如下代码:

// __dirname
path.dirname(fileURLToPath(import.meta.url))

vite 早期配置中就得使用这段代码。现在可以直接使用 __diranme 了。看来也是把这段代码作为了补丁,默认提供。

复制文件到输出目录

使用 --publicDir 将 ./public 文件夹内的文件复制到输出目录。
您还可以使用 --publicDir [dir] 来选择一个自定义目录。

在项目中使用 tsup

tsup 提供了 js API,可以在 js 中使用。

import { build } from 'tsup'

await build({
  entry: ['src/index.ts'],
  sourcemap: true,
  dts: true,
})

常见问题

error: No matching export in “xxx.ts” for import “xxx”

当您在 tsconfig 中启用了emitDecoratorMetadata时,通常会发生这种情况。
在这种模式下,我们使用 SWC 将装饰器转换为 JavaScript,因此导出的类型将被消除,这就是为什么 esbuild 无法找到相应的导出。
您可以通过将 import 语句从 import {SomeType}更改为import {type SomeType}import type {SomeType}来修复此问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题:计数质数

给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出:0示例 3&#…

Vue 指令、计算属性、侦听器

目录 指令 指令修饰符 按键修饰符 ​编辑 v-model修饰符 事件修饰符 v-bind对于样式操作的增强 操作class 对象 数组 操作style v-model应用于其他表单元素 computed计算属性 概念 基础语法 ​编辑 计算属性vs方法 computed计算属性 作用 语法 缓存特性 m…

【Linux 杂货铺】进程间通信

1.进程为什么要通信呢? ①🍎 为了进程之间更好的协同工作,举个例子,在学校,学院的管理人员给教师安排课程的时候,必须事先知道该教师平常的上课情况,不然会将教师的课程安排到一起造成麻烦&…

YetnotherrokenKeoard

问题描述: 思路:用vector存储数据,一个l用来存放小写的部分的下标,一个u来存放大写的部分的下标,删的时候删除下标即可,然后按照顺序输出即可 #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; in…

Linux驱动开发——(一)设备树的基本属性及其应用

目录 一、常见基本属性 1.1 compatible属性 1.2 status属性 1.3 reg属性 1.4 #address-cells属性和#size-cells属性 二、基本属性在设备树的表现 三、基本属性在驱动代码的表现 3.1 驱动代码 3.2 驱动代码中的OF函数 3.2.1 of_find_node_by_path 3.2.2 of_find_prope…

nginx反向代理.NetCore开发的基于WebApi创建的gRPC服务

一、本文中使用的工具: Vs2022使用.NET 8.0开发基于ASP.NET Core WebApi的gRPC服务; Nginx:1.25.5,下载地址:http://nginx.org/en/download.html 二、gRPC介绍: 由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在vs2022中可以直接创建gRP…

随机森林(Random Forests)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个随机森林&#xff08;Random Forests&#xff09;模型程序,最后打印5个条件分别的影响力。 ChatGPT 下面是一个使…

数据赋能(63)——要求:IT部门职责

“要求&#xff1a;IT部门职责”是作为标准的参考内容编写的。 在数据赋能中&#xff0c;IT部门职责在于以提供原始数据核心&#xff0c;确保提供原始数据是真实、及时和完整性&#xff0c;以支持业务赋能的实现。 在数据赋能中&#xff0c;IT部门职责涉及多个方面&#xff0c…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 一、简单介绍 二、简单人脸检测添加戴眼镜效…

【Linux学习】Linux编辑器vim的配置

文章目录 &#x1f526;vim的配置&#x1f526;vim的配置文件&#x1f526;添加配置的方法&#x1f526;手动添加相关特性配置&#xff1a;&#x1f526;自动化配置 &#x1f526;vim的配置 &#x1f526;vim的配置文件 在目录 /etc/ 下面&#xff0c;有个名为vimrc的文件&…

SpringMVC Controller 层没有使用 @ResponseBody 注解引发的血案(api访问404)

问题现象&#xff1a; 项目组的一个同事发现在请求该接口时候&#xff0c;总是报 404 错误&#xff0c;又找不到错误日志&#xff0c;一时之间不知道该如何去着手解决问题&#xff0c;我帮他排查问题的时候&#xff0c;发现该接口两次经过拦截器的 preHandle 方法&#xff0c;…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求&#xff0c;返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析&#xff0c;…

目标检测算法演变:从R-CNN到Faster R-CNN【AI写作一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用&#xff1a; 数据交换 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xf…

车载以太网DoIP 协议,万字长文详解

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

欢迎大家光临成都市

我现在就在家里&#xff0c;刚刚理个发&#xff0c;洗个澡 爸妈也在家里&#xff0c;一切正常&#xff0c;但是QQ上不了&#xff0c;哎呀,又长胖了&#xff0c;不好意思

Next App Router(上)

目录 1. 文件系统&#xff08;file-system&#xff09; 2. 从 Pages Router 到 App Router 3. 使用 App Router 4. 定义页面&#xff08;Pages&#xff09; 路由&#xff08;Router&#xff09;是 Next.js 应用的重要组成部分。在 Next.js 中&#xff0c;路由决定了一个页面…

适合各大资源网投稿html源码

源码介绍 适合各大资源网投稿html源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码下载 适合各大资源…

书生·浦语大模型实战训练营--第二期第六节课--Lagent AgentLego 智能体应用搭建--notebook

一、 大模型的局限性 大模型本身存在下面的几个问题&#xff1a;幻觉&#xff08;虚假信息&#xff0c;不符合实际&#xff09;、时效性&#xff08;训练数据过时&#xff0c;不能实时更新&#xff09;、可靠性&#xff08;对于复杂任务&#xff0c;可能错误输出&#xff09; …

Spring AOP(面向切面编程)

1.Spring AOP 简介 1.1 AOP概述 AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程, 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是Spring框架中的一个重要内容&#xff0c;是函数式编程的一…