vite 创建一个 library 库

1. vite library库配置

1.1 创建一个空项目

npm init -y
// package.json
{
  "name": "vite-lib",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "devDependencies": {
    "vite": "^5.4.8"
  }
}

1.2. 安装vite

pnpm add -D vite

1.3. 参考构建生产版本 | Vite 官方中文文档 (vitejs.cn)创建 vite.config.js 文件

import { resolve } from "path";
import { defineConfig } from "vite";

// vite.config.js
export default defineConfig({
  build: {
    lib: {
      entry: resolve(__dirname, "src/index.ts"),
      name: "minIM",
      fileName: "index",
    },
    rollupOptions: {
      // https://rollupjs.org/guide/en/#big-list-of-options
    },
  },
  resolve: {
    alias: {
      "@": resolve(__dirname, "src"),
    },
  },
});

1.4. 安装 typescript 并创建 tsconfig.json

pnpm add typescript -D
tsc --init
{
  "compilerOptions": {
    "outDir": "./dist",                 // 输出目录
    "target": "ESNext",                 // 编译的 JavaScript 版本
    "module": "ESNext",                 // 模块系统
    "strict": true,                     // 启用所有严格类型检查选项
    "esModuleInterop": true,            // 允许对CommonJS的默认导出进行esModule的interop操作
    "moduleResolution": "node",  
    "skipLibCheck": true,               // 跳过声明文件的类型检查
    "forceConsistentCasingInFileNames": true,  // 对文件名进行大小写检查
    "baseUrl": "./",                    // 基础路径
    "paths": {
      "@/*": ["src/*"]                  // 配置路径别名
    },
    "declaration": true,                // 生成声明文件
    "declarationDir": "./types",
    "sourceMap": true                   // 生成 source map 文件
  },
  "include": ["src/**/*"],              // 包含的文件
  "exclude": ["node_modules", "dist", "types"]   // 排除的文件或目录
}

1.5. 创建源文件 src/index.ts

// src/index.ts
/**
 * 冒泡排序
 * */  
 export function bubbleSort(arr: number[]): number[] {
    const n = arr.length;
    // 遍历数组
    for (let i = 0; i < n - 1; i++) {
      // 从0到n-i-1,因为最后的i个元素已经是排好序的了
      for (let j = 0; j < n - i - 1; j++) {
        // 如果当前元素比下一个元素大,则交换它们
        if (arr[j] > arr[j + 1]) {
          const temp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = temp;
        }
      }
    }
    return arr;
  }


/**
 * 二分查找
 * */   
  function binarySearch(arr: number[], target: number): number {
    let left = 0;
    let right = arr.length - 1;
  
    while (left <= right) {
      const mid = Math.floor((left + right) / 2);
  
      if (arr[mid] === target) {
        // 找到目标值,返回索引
        return mid;
      } else if (arr[mid] < target) {
        // 目标值在中间元素的右侧,调整左边界
        left = mid + 1;
      } else {
        // 目标值在中间元素的左侧,调整右边界
        right = mid - 1;
      }
    }
  
    // 未找到目标值,返回-1
    return -1;
  }
  

  export default {
    bubbleSort,
    binarySearch
  }
  • 实现两个方法并导出

1.6 修改package.json

{
  "name": "vite-lib",
  "type": "module",
  "version": "1.0.0",
  "files": [
    "dist",
    "types"
  ],
  "main": "./dist/index.umd.cjs",
  "module": "./dist/index.js",
  "types": "./types/index.d.ts",
  "exports": {
    ".": {
      "types": "./types/index.d.ts",
      "import": "./dist/index.js",
      "require": "./dist/index..umd.cjs"
    }
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint:watch": "eslint . --watch",
    "lint": "eslint ./src",
    "format": "prettier --write .",
    "build": "tsc && vite build"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "devDependencies": {
    "typescript": "^5.6.3",
    "vite": "^5.4.8"
  }
}

  • 增加 "build": "tsc && vite build", 作为lib库生成脚本
  • main,module,types,exports 指示导出文件位置

企业微信截图_17287188397972.png

编译之后得到index.js,index.umd.cjs,index.d.ts

  • index.js 作为 ESM 模块 使用文件
  • index.umd.cjs 作为 CommonJS 模块 使用
  • index.d.ts 作为 typescript 类型文件

2. 新增eslint

2.1 根据命令添加eslint

npm init @eslint/config@latest
企业微信截图_17306917535805.png
  • 根据自己的需要生成 eslint.config.mjs
import globals from "globals";
import pluginJs from "@eslint/js";
import tseslint from "typescript-eslint";
import pluginVue from "eslint-plugin-vue";


/** @type {import('eslint').Linter.Config[]} */
export default [
  {files: ["**/*.{js,mjs,cjs,ts,vue}"]},
  {languageOptions: { globals: globals.browser }},
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  ...pluginVue.configs["flat/essential"],
  {files: ["**/*.vue"], languageOptions: {parserOptions: {parser: tseslint.parser}}},
];

2.2. 调整 package.json

{
  "name": "vite-lib",
  "type": "module",
  "version": "1.0.0",
  "files": [
    "dist",
    "types"
  ],
  "main": "./dist/index.umd.cjs",
  "module": "./dist/index.js",
  "types": "./types/index.d.ts",
  "exports": {
    ".": {
      "types": "./types/index.d.ts",
      "import": "./dist/index.js",
      "require": "./dist/index..umd.cjs"
    }
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "lint:watch": "eslint . --watch",
    "lint": "eslint ./src",
    "format": "prettier --write .",
    "build": "tsc && vite build"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "devDependencies": {
    "@eslint/js": "^9.14.0",
    "eslint": "^9.14.0",
    "eslint-plugin-vue": "^9.30.0",
    "globals": "^15.11.0",
    "typescript": "^5.5.4",
    "typescript-eslint": "^8.12.2",
    "vite": "^5.4.8"
  }
}
  • "type": "module"
  • 调整 main, module, types
  • 新增编译脚本 "build": "vite build && npm run declarations"

此时可以使用 npm run build 得到打包后文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容