前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【架构师(第三十六篇)】 业务组件库开发之发布到 NPM

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

作者头像
一尾流莺
发布2022-12-10 13:46:46
7420
发布2022-12-10 13:46:46
举报

组件库 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 的版本不一致,真实的场景下不会出现这个问题,因为真实情况下组件库用的是上级的依赖。

image.png
image.png

解决这个问题,可以把组件库的 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"
  },

发布完成

这样就是发布完成了。

image.png
image.png

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

添加单元测试工具

代码语言: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"
  },
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组件库 package.json 配置
  • 使用 npm link 本地测试组件库
  • Rollup 插件开发的简单原理
  • npm 简介和 package.json 的设置
    • npm 的主要功能
      • npm 常用命令
        • 语义化版本 semver
          • 上传文件 files
          • 使用 npm publish 发布业务组件库
            • 发布前打包
              • 发布完成
              • 给业务组件库添加测试用例
              • 发布前检查代码质量和测试结果
              相关产品与服务
              命令行工具
              腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档