vue3+ts+vite自定义组件上传npm流程

1. 创建项目

npm create vite

这里踩坑点:

运行vite生成的vue项目时报错"SyntaxError: Unexpected token '??=' at " 是因为node版本过低

电脑为windows11系统,我当时使用的版本node版本是14.21.3,如下图,后边安装了nvm版本管理,现在使用的node版本为16.20.1,运行项目正常

2.写组件

这里为个人组件内容

breadcrumb/index.ts

TypeScript 复制代码
import type {App} from 'vue'
import Breadcrumb from './Breadcrumb.vue';
Breadcrumb.install=(app:App)=>{
    app.component(Breadcrumb.__name as string,Breadcrumb);
}
export default Breadcrumb;

index.ts

TypeScript 复制代码
import type {App} from 'vue'
import Breadcrumb from './breadcrumb'

const components=[
    Breadcrumb
];

const install=(app:App):void=>{
    components.forEach(component=> app.component(component.__name as string,component))
}
export {
    Breadcrumb
}

const viteVueNode={install};
export default viteVueNode

3.vite.config.ts配置

TypeScript 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {resolve} from 'path';
export default defineConfig({
  plugins: [vue()],
  css:{
    preprocessorOptions:{
      less:{

      }
    }
  },
  build:{
    lib:{
      entry:resolve(__dirname,'packages/index.ts'),
      name:'ViteVueNode',
      fileName:'vite-vue-node',
    },
    rollupOptions:{
      external:['vue'],
      output:{
        format:'umd',
        exports:'named',
        globals:{
          vue:'Vue'
        },
      },
    },
    minify:'terser',
    terserOptions: {
      compress: {
        drop_console: true, // 生产环境下去除console
        drop_debugger: true, // 生产环境下去除debugger
      }
    }
  },
})

4.package.json配置

TypeScript 复制代码
{
  "name": "vite-project",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "files": [
    "dist"
  ],
  "scripts": {
    "dev": "vite",
    "build": "npm run build-only  && vue-tsc --emitDeclarationOnly && npm run config && npm run publish ",
    "config": "node ./config/index.ts",
    "build-only": "vite build",
    "types": "vue-tsc ",
    "preview": "vite preview",
    "publish":"cd dist && npm publish"
  },
  "dependencies": {
    "vue": "^3.3.11"
  },
  "devDependencies": {
    "@types/node": "^20.10.5",
    "@vitejs/plugin-vue": "^4.5.2",
    "less": "^4.2.0",
    "npm-run-all": "^4.1.5",
    "terser": "^5.26.0",
    "typescript": "^5.2.2",
    "vite": "^5.0.8",
    "vue-tsc": "^1.8.25"
  }
}

5.tsconfig.json中配置

TypeScript 复制代码
{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": false,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": false,
    "jsx": "preserve",
    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "declaration": true,
    "outDir": "dist",
    // "outFile":"dist/vite-vue-node.d.ts"  整合到一个声明文件中
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue","packages/*.ts"],
  "references": [{ "path": "./tsconfig.node.json" }],
  "exclude": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue","packages/**/*.vue"],
}

6.config文件内容

config文件是为了在dist中添加readme.md和package.json

config/index.ts文件

TypeScript 复制代码
const fs=require("fs");
const path=require("path")
function mkPackageJson(){
    var templatePath = path.resolve(__dirname, './package.json');
    var needPath=path.resolve(__dirname, '../dist/package.json');
    var isExistCopyFile=fs.existsSync(needPath);
    if(!isExistCopyFile){
        fs.copyFileSync(templatePath,needPath);
    }
}
function mkReadMe(){
    var templatePath = path.resolve(__dirname, './README.md');
    var needPath=path.resolve(__dirname, '../dist/README.md');
    var isExistCopyFile=fs.existsSync(needPath);
    if(!isExistCopyFile){
        fs.copyFileSync(templatePath,needPath);
    }
}
mkPackageJson();
mkReadMe();

最后 运行 npm run build 执行构建

npm run build 中做的主要是vite构建、tsc自动生成声明文件、npm publish上传包(前提你有npm账号并且npm login)

相关推荐
孟陬5 小时前
Foobar 技术周刊#160:大模型让大规模形式化软件验证成为现实丨AI写C++代码之后会发生什么?丨我们真的需要alpha() 函数吗丨重试,有时会让故障更
前端·后端·typescript
AI开源软件19 小时前
SpringBoot3+Vue3 财务管理系统如何设计:从业务单据到总账的模块划分
spring boot·vue3·领域建模·会计凭证·ruoyi office·业财协同·财务系统设计
螺丝钉tina1 天前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
华玥作者1 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app
Momo__2 天前
你写的 import 重试,从来没生效过
前端·javascript·typescript
怒放的生命19912 天前
本地用 pnpm 省磁盘,团队继续用 npm:极简实践
前端·npm·node.js
长不大的杨瑞杰3 天前
OpenCode v2 Custom Tools 实战:开发数据库、工单与发布工具
人工智能·typescript·开发工具·opencode·custom tools
shmily麻瓜小菜鸡3 天前
TypeScript 知识点补充(第三部分:工程化与高级类型)
前端·javascript·typescript
腾科IT教育4 天前
TypeScript 泛型(Generics):类型占位符实现复用与安全
安全·typescript·泛型
猫头_4 天前
MCP 开发实战:把你自己的后端 API 接入 Agent
人工智能·typescript·mcp