Vue Cli 3 搭建一个可按需引入组件的组件库架子

2020-04-13 18:31:39 浏览数 (1)

Ant-design、Element 这些框架都有按需引入组件的功能。需要使用哪个组件,就引入哪个组件,这样那些没必要的组件就不会打包到我们的项目里了。跟着我下边的步骤,相信大家也能搭建出一个按需引入的组件库。

创建一个 Vue 项目

代码语言:javascript复制
vue create ui-demo

使用默认配置安装就 OK ?

安装 babel-plugin-component

代码语言:javascript复制
npm i babel-plugin-component -D

babel-plugin-component 就是 Element UI 用来实现组件按需加载的一个 babel 插件。我们把它用到我们的组件库上,就不需要重新造一个轮子出来了。?

配置 .babelrc

在项目的根目录下创建一个 .babelrc 的文件,配置可以参照下面的代码进行更改。

代码语言:javascript复制
{
  "plugins": [
    [
      "component",
      {
        // 组件库的名字,需要和 package.json 里的 name 相同
        "libraryName": "ui-demo",
        // 存放组件的文件夹,如果不想配置此项,默认文件夹的名字为 lib
        "libDir": "components",
      }
    ]
  ]
}

创建一个存放组件的文件夹

既然我们刚刚已经配置了存放组件的文件夹,下一步肯定就是创建这么一个文件夹了。由于我配置了的文件夹名为 components,所以我们的文件夹名字就是 components

上面的操作完成后,我们的项目目录就基本搭建好了,如下:

image

写组件

终于到了写组件的时候了,在 components 文件夹下新建一个 Component1 的文件夹来存放我们的第一个组件。

Component1 文件夹里有一个 Component1.vue 的文件和一个 index.js 文件。目录如下:

image

Component1 -> Component1.vue 代码:

代码语言:javascript复制
<template>
  <h1 class="component1">component1</h1>
</template>

<script>
export default {
  name: 'Component1'
}
</script>

<style>
.component1 {
  color: green;
}
</style>

Component1 -> index.js代码:

代码语言:javascript复制
import Component1 from './Component1.vue';

Component1.install = function (Vue) {
  Vue.component(Component1.name, Component1);
}

export default Component1;

index.js 中的主要功能就是以插件的形式注册一个全局组件,不懂的小伙伴可以照猫画虎,微调一下就好了。想了解的可以去这个链接看一下:

第二个组件代码就不发出来了,复制一份,给个 css 样式就好了。

components 文件夹根目录下创建一个 index.js 用来整合所有组件。

components -> index.js 代码:

代码语言:javascript复制
import Compontent1 from './Component1/index'
import Compontent2 from './Component2/index'

const components = [
  Compontent1,
  Compontent2,
]

function install (Vue) {
  components.map = (component => {
    Vue.component(component.name, component)
  })
}

if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue);
}

export default {
  install,
  Compontent1,
  Compontent2,
}

稍微提醒,需要把 install 也一起导出,观察不细心的可能会不注意就写漏了。?

修改或添加 package.json 中的配置

script 中添加一条命令:

代码语言:javascript复制
"lib": "vue-cli-service build --target lib --name index --dest package components/index.js"

最后面的 components/index.js 是我们存放组件文件夹根目录的 index.js 文件,记得根据你的情况修改。这个命令执行后,会打包生成一个 package 的文件夹。

添加 files 白名单,打包上传哪些文件到 npm 上:

代码语言:javascript复制
"files": [
    "components",
    "package"
]

components 是我们存放组件的文件夹,packagelib 命令打包后生成的文件夹,我们只要把这两个文件夹发布就 OK 了。

添加 style,设置样式路径:

代码语言:javascript复制
"style": "package/index.css"

路径就是我们打包出来的 package 中的 index.css 文件。

添加 main,设置入口:

代码语言:javascript复制
"main": "components/index.js"

路径是存放组件的 components 文件夹下的 index.js 文件。

private 设置为 false

代码语言:javascript复制
"private": false

设置此项目不是私有项目之后,才能发布好 npm 上。

下面的是完整的 package.json 文件配置:

代码语言:javascript复制
{
  "name": "ui-demo",
  "version": "0.1.0",
  "private": false,
  "main": "components/index.js",
  "style": "package/index.css",
  "files": [
    "components",
    "package"
  ],
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "lib": "vue-cli-service build --target lib --name index --dest package components/index.js"
  },
  "dependencies": {
    "core-js": "^2.6.5",
    "vue": "^2.6.10"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.7.0",
    "@vue/cli-plugin-eslint": "^3.7.0",
    "@vue/cli-service": "^3.7.0",
    "babel-eslint": "^10.0.1",
    "babel-plugin-component": "^1.1.1",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "vue-template-compiler": "^2.5.21"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {},
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}

打包我们的代码

在控制台执行 npm run lib 进行文件打包,打包完成后会多一个 package 文件夹。文件目录就变成如下的了:

image

发布 npm

代码语言:javascript复制
# 这是登录,前提是你已经在 npm 注册了账号
npm login
# 发布到 npm
npm publish

由于名字已经被占用,演示就用我最近在写的那个项目进行演示了。

安装库

代码语言:javascript复制
npm i vue95-ui

main.js 文件中引入这个库。

代码语言:javascript复制
import Vue from 'vue'
import App from './App.vue'
// 全局注册
// import vue95 from 'vue95-ui'
// Vue.use(vue95);

// 按需引入
import { Button95, Bar95 } from 'vue95-ui'

Vue.use(Button95);
Vue.use(Bar95);

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

这样我们就可以使用我们自己的 UI 库了。

0 人点赞