使用vite打包可以按需引入的组件库 (rollup)

package.json

{
  "name": "...",
  "private": false,
  "version": "0.1.9",
  "main": "./lib/index.umd.js",
  "module": "./lib/index.es.js",
  "types": "./lib/index.d.ts",
  "author": {
    "name": "zh"
  },
  "keywords": [
    "elememt-plus",
    "ts",
    "vue3"
  ],
  "files": [
    "lib",
    "README.md"
  ],
  "license": "",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview",
    "bulid:components": "node ./src/scripts/build.js",
    "lib": "npm version prerelease && npm run bulid:components && cp package.json && cp index.d.ts && npm publish"
  }
}

/src/scripts/build.js

const path = require('path')
const fsExtra = require('fs-extra')
const fs = require('fs')
const { defineConfig, build } = require('vite')
const vue = require('@vitejs/plugin-vue')
const vueJsx = require('@vitejs/plugin-vue-jsx')


const entryDir = path.resolve(__dirname, '../components')
const outputDir = path.resolve(__dirname, '../../lib')


const baseConfig = defineConfig({
  configFile: false,
  publicDir: false,
  plugins: [vue(), vueJsx()]
})

const rollupOptions = {
  external: ['vue', 'vue-router'],
  output: {
    globals: {
      vue: 'Vue'
    }
  }
}

//全量构建
const buildAll = async () => {
  await build(defineConfig({
    ...baseConfig,
    build: {
      rollupOptions,
      lib: {
        entry: path.resolve(entryDir, 'index.ts'),
        name: 'index',
        fileName: 'index',
        formats: ['es', 'umd']
      },
      outDir: outputDir
    }
  }))
}


const buildSingle = async (name) => {
  await build(defineConfig({
    ...baseConfig,
    build: {
      rollupOptions,
      lib: {
        entry: path.resolve(entryDir, name),
        name: 'index',
        fileName: 'index',
        formats: ['es', 'umd']
      },
      outDir: path.resolve(outputDir, name)
    }
  }))
}

// 生成组件的 package.json 文件
const createPackageJson = (name) => {
  const fileStr = `{
  "name": "${name}",
  "version": "0.0.0",
  "main": "index.umd.js",
  "module": "index.es.js",
  "style": "style.css"
}`

  fsExtra.outputFile(
    path.resolve(outputDir, `${name}/package.json`),
    fileStr,
    'utf-8'
  )
}


const declareFileStr = `
import { App } from 'vue';
declare const _default: {
  install(app: App): void
}
export default _default`;


const createDeclare = (name) => {
  fsExtra.outputFile(
    path.resolve(outputDir, `${name}/index.d.ts`),
    declareFileStr,
    'utf-8'
  )
}




const buildLib = async () => {
  await buildAll()
  // 获取组件名称组成的数组
  const components = fs.readdirSync(entryDir).filter(name => {
    const componentDir = path.resolve(entryDir, name)
    const isDir = fs.lstatSync(componentDir).isDirectory()
    return isDir && fs.readdirSync(componentDir).includes('index.ts')
  })

  fsExtra.outputFile(
    path.resolve(outputDir, `index.d.ts`),
    declareFileStr,
    'utf-8'
  )

  

  // 循环一个一个组件构建
  for (const name of components) {
    // 构建单组件
    await buildSingle(name)

    // 生成组件的 package.json 文件
    createPackageJson(name)

    // 生成组件的 index.d.ts
    createDeclare(name)
  }
}

buildLib()

src/index.d.ts

import { App } from 'vue';
declare const _default: {
    install(app: App): void
}

export default _default

env.d.ts

/// <reference types="vite/client" />

declare module '*.vue' {
  import { DefineComponent } from 'vue'
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
  const component: DefineComponent<{}, {}, any>
  export default component
}

组件结构如是:
在这里插入图片描述
index.ts
加上这个让每一个组件都可以被单独的注册

import { App } from 'vue'
import form from './src/index.vue'

// 让这个组件可以通过use的形式使用
export default {
  install(app: App) {
    app.component('m-form', form)
  }
}

打包后生成的目录结构:

在这里插入图片描述

完成!
直接运行 npm run lib 命令即可

你可以按照以下步骤使用 Rollup 打包 Vue 3 Vite 项目: 1. 首先,确保你已经安装了 Rollup 和相关的插件。可以使用以下命令进行安装: ```shell npm install --save-dev rollup rollup-plugin-vue@next rollup-plugin-terser ``` 2. 在项目根目录下创建一个 `rollup.config.js` 文件。 3. 在 `rollup.config.js` 文件中,导入必要的插件和模块: ```javascript import { defineConfig } from 'rollup'; import vue from 'rollup-plugin-vue'; import { terser } from 'rollup-plugin-terser'; ``` 4. 定义 Rollup 配置: ```javascript export default defineConfig({ input: 'src/main.js', // 入口文件路径 output: { file: 'dist/bundle.js', // 输出文件路径 format: 'iife', // 输出模块格式 name: 'MyApp', // 全局变量名称(可选) }, plugins: [ vue(), // 处理 .vue 单文件组件 terser(), // 压缩代码(可选) ], }); ``` 这里的 `input` 配置应该指向你项目中的入口文件,一般是 `main.js` 或者 `index.js`。`output` 配置指定了打包后的输出文件路径和格式,这里使用了立即执行函数(IIFE)格式,你可以根据要选择其他格式。`name` 可选,它指定了全局变量名称,如果你希望在浏览器中直接引入打包后的文件,可以设置该值。 5. 在项目的 `package.json` 文件中添加一个脚本命令以运行 Rollup: ```json { "scripts": { "build": "rollup -c" } } ``` 6. 运行以下命令进行打包: ```shell npm run build ``` 打包完成后,你将在 `dist` 目录下找到打包后的文件。 这样,你就可以使用 Rollup 打包 Vue 3 Vite 项目了。如果要更详细的配置,可以参考 Rollup 和相关插件的文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值