首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第三十六篇)】 业务组件库开发之发布到 NPM


组件库 package.json 配置

添加两种规范以及 ts 的入口文件

代码语言:javascript
复制
  "main": "dist/lego-component.umd.js",
  "module": "dist/lego-component.esm.js",
  "types": "dist/index.d.ts",

使用 npm link 本地测试组件库

先进入需要被本地 link 的目录中,执行

代码语言:javascript
复制
npm link

然后进入到使用这个库的目录中,执行

代码语言:javascript
复制
npm link lego-component

引入本地组件库

代码语言:javascript
复制
import LegoComponents from 'lego-Component';
app.use(LegoComponents);

结果发现这一行 Ts 报错了,原因是 vue 的版本不一致,真实的场景下不会出现这个问题,因为真实情况下组件库用的是上级的依赖。

解决这个问题,可以把组件库的 vue 版本 link 成为别的项目的版本。执行

代码语言:javascript
复制
npm link ../lego-fe/node_modules/vue

这样两个项目就使用了同样的版本,错误也就消失了。

Rollup 插件开发的简单原理

Rollup 插件的作用就是将各种各样的文件转化成 Rollup 认识的 esm 的代码。

代码语言:javascript
复制
import { dataToEsm } from '@rollup/pluginutils'

// 插件就是一个返回特定对象的函数
function exPlugin() {
  return {
    name: "my-plugin",
    buildStart(options) {
      console.log('🚀🚀 buildStart ~ options', options);
    },
    load(id) {
      console.log('🚀🚀 load ~ id', id);
      return null
    },
    transform(code, id) {
      console.log('🚀🚀 transform ~ id', id);
      console.log('🚀🚀 transform ~ code', code);
      if (id.slice(-5) !== '.json') {
        return null
      }
      try {
        const parsed = JSON.parse(code)
        const afterCode = dataToEsm(parsed)
        console.log('🚀🚀 transform ~ afterCode', afterCode);
        return {
          code: afterCode
        }
      } catch (error) {
        console.log('🚀🚀 ~ error', error);

      }
    },
    buildEnd(error) {
      console.log('🚀🚀 buildEnd ~ error', error);
    }
  }
}
代码语言:javascript
复制
export default {
  input: "package.json",
  output: {
    name,
    file: file('esm'),
    format: "es"
  },
  plugins: [
    exPlugin()
  ],
}

npm 简介和 package.json 的设置

npm 的主要功能

  • npm 下载别人编写的第三方包到本地,比如 vue
  • npm 下载并安装别人编写的命令行工具到本地,比如 vue-cli
  • 将自己编写的包或命令行工具上传到 npm 供别人使用

npm 常用命令

代码语言:javascript
复制
// 查看登录状态 没有登录就会提示错误 登录了就会显示用户名
npm whoami
// 查看一些配置信息,尤其是 registry ,仓库的源
npm config ls
// 登录 npm 账号 ,除了用户名,密码,邮箱外 还需要填写一个验证码
npm login
// 发布包到 npm ,包名不能重复,必须是 npm 官方源
npm bublish

语义化版本 semver

  • 主版本号:当你做了不向下兼容的 API 修改
  • 次版本号:当你做了向下兼容的功能新增
  • 修订号:当你做了向下兼容的问题修正

上传文件 files

  • 指示 npm publish 的时候需要上传的内容
  • 默认忽略掉 .gitignore 中的文件,上传其余文件
  • 无论怎样配置 package.json/README.md/CHANGELOG.md/LICENSE 都会被包含在其中

使用 npm publish 发布业务组件库

发布前打包

使用 prepublishOnly 钩子,让组件库在发布之前进行一次打包,就不用我们手动执行 npm run build 了。

代码语言:javascript
复制
  "scripts": {
    "prepublishOnly": "npm run build"
  },

发布完成

这样就是发布完成了。

给业务组件库添加测试用例

添加单元测试工具

代码语言:javascript
复制
vue add unit-jest

LText.spec.ts

代码语言:javascript
复制
import { shallowMount } from '@vue/test-utils';
import LText from '@/components/LText';
import { textDefaultProps } from '../../src/defaultProps';

describe('LText.vue', () => {
  it.only('default LText render', async () => {
    // 传入组件的属性
    const msg = 'test';
    const props = {
      ...textDefaultProps,
      text: msg,
    };
    // 获取组件
    const wrapper = shallowMount(LText, { props });
    // 文本正确
    expect(wrapper.text()).toBe(msg);
    // 标签正确
    expect(wrapper.element.tagName).toBe('DIV');
    const style = wrapper.attributes().style;
    // 包含指定类名
    expect(style.includes('font-size')).toBeTruthy();
    // 不包含指定类名
    expect(style.includes('actionType')).toBeFalsy();
  });
});

发布前检查代码质量和测试结果

代码语言:javascript
复制
  "scripts": {
    "serve": "vue-cli-service serve",
    "clean": "rimraf ./dist",
    "build": "npm run clean && npm run build:esm && npm run build:umd",
    "build:esm": "rollup --config rollup.esm.config.js",
    "build:umd": "rollup --config rollup.umd.config.js",
    "test:watch": "vue-cli-service test:unit --watch",
    "test": "vue-cli-service test:unit",
    "lint": "vue-cli-service lint --max-warnings 5",
    "prepublishOnly": "npm run lint && npm run test && npm run build"
  },
下一篇
举报
领券