Tanstack Config

作者 tanstack-skills6f5521ecbdfb无许可证35 个星标收录于 2026年10月8日更新于 2026年10月8日仓库8个月前更新

Opinionated toolkit for building, versioning, and publishing high-quality JavaScript/TypeScript packages.

AI 生成的概览

用于构建、版本管理和发布 JavaScript/TypeScript 包的预设工具包,集成 Vite、ESLint 与 Changesets。

功能
提供 JavaScript/TypeScript 包开发的参考配置与搭建说明,涵盖 Vite 构建配置(ESM/CJS 双输出与声明文件)、ESLint 预设、TypeScript 与 Prettier 设置以及 package.json exports 结构。同时说明通过 Changesets 实现语义化版本与变更日志的发布自动化,以及 GitHub Actions 的 CI 与发布工作流和 pnpm/Nx 单仓库配置。产出为配置片段与操作说明,而非可执行脚本。
适用场景
适用于搭建或统一 JavaScript/TypeScript 包或单仓库项目时,尤其是需要 ESM/CJS 双构建、统一 lint 预设或自动化版本管理与 npm 发布。也适合采用 Changesets、pnpm workspace 或 Nx 缓存的团队。
运行要求
需要 Node.js 以及 npm 或 pnpm 等包管理器;涉及 @tanstack/config、Vite、Vitest、ESLint、TypeScript、Prettier、Changesets 和 Nx 等依赖。发布工作流需要 GitHub Actions,并配置 GITHUB_TOKEN 与 NPM_TOKEN 密钥,以及对 npm registry 的网络访问。不附带脚本,仅提供说明。

Overview

TanStack Config provides an opinionated, minimal-configuration toolkit for JavaScript/TypeScript package development. It includes Vite-powered build configuration, ESLint presets, publish automation with semantic versioning, and integrations with TypeScript, Prettier, Changesets, and GitHub Actions. Designed for monorepo workflows with pnpm and Nx.

Package: @tanstack/config Status: Stable

Installation

bash
npm install @tanstack/config --save-dev# orpnpm add @tanstack/config -D

Vite Build Configuration

Basic Setup

typescript
// vite.config.tsimport { defineConfig, mergeConfig } from 'vitest/config'import { tanstackViteConfig } from '@tanstack/config/vite'
const config = defineConfig({  // Your custom Vite config})
export default mergeConfig(  config,  tanstackViteConfig({    entry: './src/index.ts',    srcDir: './src',    exclude: ['./src/__tests__'],  }))

Multiple Entry Points

typescript
import { tanstackViteConfig } from '@tanstack/config/vite'
export default tanstackViteConfig({  entry: [    './src/index.ts',    './src/adapters.ts',    './src/utils.ts',  ],  srcDir: './src',})

Build Options

typescript
tanstackViteConfig({  entry: './src/index.ts',  srcDir: './src',  exclude: ['./src/__tests__', './src/**/*.test.ts'],  // Generates ESM and CJS outputs  // Generates .d.ts declaration files  // Handles tree-shaking configuration})

ESLint Configuration

Basic Setup

javascript
// eslint.config.jsimport { tanstackEslintConfig } from '@tanstack/config/eslint'
export default tanstackEslintConfig

Extending the Config

javascript
// eslint.config.jsimport { tanstackEslintConfig } from '@tanstack/config/eslint'
export default [  ...tanstackEslintConfig,  {    rules: {      // Custom overrides      '@typescript-eslint/no-explicit-any': 'warn',    },  },]

Publishing

Publish Configuration

typescript
// publish.config.ts or used via CLIimport { tanstackPublishConfig } from '@tanstack/config/publish'
export default tanstackPublishConfig({  // Publint-compliant defaults  // Semantic versioning automation  // Changelog generation})

Package.json Setup

json
{  "name": "@myorg/my-package",  "version": "0.0.0",  "type": "module",  "main": "dist/cjs/index.cjs",  "module": "dist/esm/index.js",  "types": "dist/esm/index.d.ts",  "exports": {    ".": {      "import": {        "types": "./dist/esm/index.d.ts",        "default": "./dist/esm/index.js"      },      "require": {        "types": "./dist/cjs/index.d.cts",        "default": "./dist/cjs/index.cjs"      }    }  },  "files": ["dist", "src"],  "scripts": {    "build": "vite build",    "lint": "eslint .",    "test": "vitest"  }}

TypeScript Configuration

tsconfig.json

json
{  "compilerOptions": {    "strict": true,    "target": "ES2020",    "module": "ESNext",    "moduleResolution": "bundler",    "declaration": true,    "declarationMap": true,    "sourceMap": true,    "outDir": "./dist",    "rootDir": "./src",    "esModuleInterop": true,    "skipLibCheck": true,    "forceConsistentCasingInFileNames": true  },  "include": ["src"],  "exclude": ["node_modules", "dist"]}

Changesets Integration

Setup

bash
npx changeset init

Creating a Changeset

bash
npx changeset# Interactive prompt: select packages, bump type, summary

Changeset Config

json
// .changeset/config.json{  "$schema": "https://unpkg.com/@changesets/[email protected]/schema.json",  "changelog": "@changesets/cli/changelog",  "commit": false,  "fixed": [],  "linked": [],  "access": "public",  "baseBranch": "main",  "updateInternalDependencies": "patch"}

GitHub Actions Workflow

CI/CD Pipeline

yaml
# .github/workflows/ci.ymlname: CI
on:  push:    branches: [main]  pull_request:    branches: [main]
jobs:  build:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: pnpm/action-setup@v2      - uses: actions/setup-node@v4        with:          node-version: 20          cache: 'pnpm'      - run: pnpm install      - run: pnpm build      - run: pnpm lint      - run: pnpm test

Publish Workflow

yaml
# .github/workflows/publish.ymlname: Publish
on:  push:    branches: [main]
jobs:  publish:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: pnpm/action-setup@v2      - uses: actions/setup-node@v4        with:          node-version: 20          registry-url: 'https://registry.npmjs.org'      - run: pnpm install      - run: pnpm build      - name: Create Release Pull Request or Publish        uses: changesets/action@v1        with:          publish: pnpm publish -r        env:          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

Monorepo Setup (pnpm + Nx)

Workspace Configuration

yaml
# pnpm-workspace.yamlpackages:  - 'packages/*'  - 'examples/*'

Nx Configuration

json
// nx.json{  "tasksRunnerOptions": {    "default": {      "runner": "nx/tasks-runners/default",      "options": {        "cacheableOperations": ["build", "lint", "test"]      }    }  },  "targetDefaults": {    "build": {      "dependsOn": ["^build"]    }  }}

Prettier Configuration

json
// .prettierrc{  "semi": false,  "singleQuote": true,  "trailingComma": "all",  "printWidth": 80}

EditorConfig

ini
# .editorconfigroot = true
[*]indent_style = spaceindent_size = 2end_of_line = lfcharset = utf-8trim_trailing_whitespace = trueinsert_final_newline = true

Best Practices

  1. Use the Vite config for builds - handles ESM/CJS dual output and declarations
  2. Use publint-compliant exports in package.json for compatibility
  3. Use Changesets for version management in monorepos
  4. Set "type": "module" in package.json for ESM-first packages
  5. Include both src and dist in files for source map debugging
  6. Use Nx caching for faster builds in monorepos
  7. Always generate declaration files (.d.ts) for TypeScript consumers
  8. Use the ESLint config as a consistent baseline across packages
  9. Automate publishing with GitHub Actions and Changesets

Common Pitfalls

  • Missing exports field in package.json (breaks modern bundlers)
  • Not setting "type": "module" (causes ESM import issues)
  • Forgetting declaration files in build output
  • Not excluding test files from the build
  • Publishing without running publint validation first
  • Not configuring moduleResolution: "bundler" in tsconfig
  • Inconsistent versioning across monorepo packages (use Changesets linked)

来源与署名

来源:tanstack-skills/tanstack-skills位于plugins/tanstack-config/skills/tanstack-config提交6f5521e

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架