工作中遇到一个需求,要将一个非常复杂的项目,改成插件并发布到npm,供其他同事使用。该组件是基于vue-cli 4.x脚手架搭建的(vue-cli 3.x同样适用)。具体方法如下:
一、调整项目结构
1、用 vue-cli 创建一个 default 项目(由于是将项目改造成插件,这一步已经在项目开始时做过了)
当前的项目目录是这样的:
2、将 src 改为插件名称,如 yx-form-create,将里面的 App.vue 重命名,如 yx-form-create.vue,将之前的main.js中引入的插件,统统移入到这个文件内,因为main.js将用来编写插件的install方法,同时将 name 值改成插件名(很重要),类似下面的代码:
3、修改main.js代码,导出插件:
// 导入单个组件 import yxFormCreate from "./yx-form-create.vue"; // 定义 install 方法 const install = function(Vue) { if (install.installed) return; install.installed = true; // 遍历并注册全局组件 Vue.component(yxFormCreate.name, yxFormCreate); }; if (typeof window !== "undefined" && window.Vue) { install(window.Vue); } export default { // 导出的对象必须具备一个 install 方法 install, yxFormCreate };
4、新建 test 文件夹,作为测试使用,在 test 下分别新建 main.js 和 App.vue
最终目录结构如下:
test/main.js代码:
import Vue from "vue"; import App from "./App.vue"; // 引入自定义的插件 import yxFormCreate from "../yx-form-create/main"; Vue.use(yxFormCreate); new Vue({ render: h => h(App) }).$mount("#app");
App.vue代码:
<template> <div id="app"> <!--使用自定义的插件--> <yx-form-create /> </div> </template> <script> export default { name: "App" }; </script>
二、修改配置
启动项目的时候,默认入口文件是 src/main.js
将 src 目录改为 test 之后,就需要重新配置入口文件
在根目录下找到 vue.config.js 文件(没有就创建它):
// vue.config.js module.exports = { // 将 test 目录添加为新的页面 pages: { index: { // page 的入口 entry: 'test/main.js' } } }
完成这一步之后,运行 npm run serve 启动它进行测试插件是否有问题
三、打包组件
vue-cli 3.x、4.x 提供了构建库的命令,所以这里不需要再为 yx-form-create 目录配置 webpack,主要需要四个参数:
target: 默认为构建应用,改为 lib 即可启用构建库模式
name: 输出文件名
dest: 输出目录,默认为 dist
entry: 入口文件路径,默认为 src/App.vue,这里改为 yx-form-create/main.js
基于此,在 package.json 里的 scripts 添加一个 lib 命令
// pageage.json { "scripts": { "lib": "vue-cli-service build --target lib --name yx-form-create --dest dist yx-form-create/main.js" } }
然后执行 npm run lib 命令,编译组件
四、准备发布
首先需要在 package.json 添加组件信息
name: 包名,该名不能和已有的名称冲突;
version: 版本号,不能和历史版本号相同;
description: 简介;
main: 入口文件,应指向编译后的包文件;
keyword:关键字,以空格分割;
author:作者;
private:是否私有,需要修改为 false 才能发布到 npm;
license:开源协议
然后创建 .npmignore 文件,设置忽略文件
该文件的语法和 .gitignore 的语法一样,设置发布到 npm 时忽略哪些目录或文件
.DS_Store node_modules/ examples/ packages/ public/ vue.config.js babel.config.js *.map *.html # local env files .env.local .env.*.local # Log files npm-debug.log* yarn-debug.log* yarn-error.log* # Editor directories and files .idea .vscode *.suo *.ntvs* *.njsproj *.sln *.sw*
五、发布到 npm
如果以前改过 npm 的镜像地址,比如使用了淘宝镜像,就先改回来
npm config set registry http://registry.npmjs.org
如果没有 npm 账户,可以通过 npm adduser 命令创建一个账户,或者到 npm 官网注册
如果在官网注册的账户,或者以前就有账户,就使用 npm login 命令登录
在发布之前,一定要确保组件已经编译完毕,而且 package.json 中的入口文件(main)的路径正确
一切就绪,发布组件:
npm publish