从0到1开发一个Vue组件库,配置rollup打包esm

626 阅读2分钟

基础环境

Vue 2.6.10

vue-cli

1. 增加一个最简易的组件

packages/components/chart/src/chart.vue

<template>
    <div class="title">封装图表组件</div>
</template>

<script>
    export default {
        name: 'MyChart',
        props: {}
    }
</script>

<style lang="less" scoped>
    .title {
        font-size: 2rem
    }
</style>

2. 导出MyChart组件

import MyChart from './src/chart';

MyChart.install = function(Vue) {
    Vue.component(MyChart.name, MyChart) // 添加全局组件MyChart
}

export default MyChart;

3. 入口文件, 实现按需引用和全局引用

packages/index.js

import RmChart from './components/chart/index.js';

const components = [
    RmChart
]

// 通过插件,全局注册组件
const install = function(Vue, opts = {}) {
    components.forEach(component => {
        Vue.component(component.name, component)
    })
}

export default {
    install, 
    RmChart
}

export {
    RmChart
}

4. package.json文件新增打包命令

"build:lib": "vue-cli-service build --target lib --name testCompontent packages/index.js --dest lib"

上述命令可以打包为umd和common。

5. 修改package.json中的入口文件

"main": "lib/testComponent.umd.js",
"module": "packages/index.js"

知识延伸: package.json中的module字段

package.json文件中的module字段提供符合ESM规范的模块入口。

6. 使用yarn link模拟yarn包发布

yarn link

yarn unlink 删除

7. 在另一个项目中引入该库并使用

yarn link testComponent
<template>
    <div>
        <my-chart></my-chart>
    </div>
</template>

<script>
import { MyChart } from 'testComponent';

export default {
    data() {
        return {}
    },
    components: {
        MyChart
    }

}
</script>

将vue依赖包放在peerDependencies中

"vue": "2.6.10",
"vue-template-compiler": "2.6.10"

使用rollup打包成esm

1. 安装rollup

yarn add rollup@^3.0.0

实际安装的版本为3.29.4。

2. 安装rollup-plugin-node-resolve,解决导入语句不能省略文件扩展名

相应报错: Rollup Error: Could not resolve "./src/chart"

安装命令: `yarn add rollup-plugin-node-resolve --dev`

插件配置如下:
const resolve = require('rollup-plugin-node-resolve')

plugins: [
    resolve({
        extensions: ['.vue']
    })
]

3. 安装rollup-plugin-vue,处理vue文件

相应报错:Rollup Error:Unexpected token(Note that you need plugins to import files that not JavaScript)

安装命令:

yarn add vue@2.6.10 vue-template-compiler@2.6.10 
yarn add rollup-plugin-vue@^5.1.9 --dev

插件rollup-plugin-vue依赖vue-template-compiler, 所以安装了vue和vue-template-compiler。

插件配置如下:

const resolve = require('rollup-plugin-vue')

plugins: [
   vue()
]

报错:(plugin vue) TypeError: Cannot read properties of undefined(reading ‘styles’)

这个报错是因为安装的rollup-plugin-vue插件版本高了。

⚠️ vue2和vue3项目所用的rollup-plugin-vue版本不一样,vue的编译器也不一样。

  • vue2:rollup-plugin-vue^5.1.9 + vue-template-compiler
  • vue3:rollup-plugin-vue^6.0.0 + @vue/compiler-sfc

ps:rollup-plugin-vue插件中已经集成了less、less-loader

4. 安装rollup-plugin-alis,处理路径别名

起因:import *** from '@/**' 这个语句导入的文件没有打包最终的js文件中

安装命令:yarn add rollup-plugin-alis --dev

插件配置如下:

const alis = require('rollup-plugin-alias')

plugins: [
    alis({
        entries: [
            {
                find: '@',
                replacement: path.resolve(__dirname, 'src')
            }
        ],
        resolve: ['.vue', '.js'] // 这里必须要加上,不加的话resolve的默认值为['.js'],rollup-plugin-alis插件会将所有的import文件都当成js文件,遇到vue文件也会再在后面加上.js
    })
]

5. 到此,rollup可以正常打包成esm了。

6. 优化:安装rollup-plugin-css-only,将css打包到单独的css文件中

安装命令:yarn add rollup-plugin-css-only --dev

插件配置如下:

const css = require('rollup-plugin-css-only')

plugins: [
    css({
        output: 'riskMonitorComponent.css'
    }),
    vue({
        css: false
    })
]

7. 优化:安装rollup-plugin-terser,压缩js文件

安装命令:yarn add rollup-plugin-terser --dev

插件配置如下:

const { terser } = require('rollup-plugin-terser')

plugins: [
    output: [
        {
            file: 'esm/testComponent.esm.js',
            format: 'esm'
        },
        {
            file: 'esm/testComponent.esm.min.js',
            format: 'esm',
            plugins: [ tserser() ]
        }
    ]
]