使用webpack5+TypeScript+npm发布组件库

一、前言

        作为一只前端攻城狮,没有一个属于自己的组件库,那岂不是狮子没有了牙齿,士兵没有了武器,姑娘没有了大宝SOD蜜,你没有了我....

        言归正传,下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM平台。

二、思路

        1、通过webpack5初始化一个typescript环境

        2、使用typescript编写一个组件库

        3、通过webpack5进行编译

        4、配置package.json,通过npm发布编译后的组件库

        5、在项目中的引用

三、实现

1、webpack5初始化环境

【1】创建一个名为simple-js的项目

npm init

【2】安装webpack相关的包

npm install webpack webpack-cli --save-dev

【3】使用webpack进行配置

npm webpack-cli init
或
.\node_modules\.bin\webpack-cli init
  • 是否使用webpack-dev-server(进行测试)
  • 是否创建html 在仓库里(htmlWebpackPlugin会把打包好的js文件,自动绑到html 文件)
  • 是否需要pwa

   自动生成文件:

  • tsconfig  (ts配置文件)
  • postcss.config
  • webpack.config (webpack配置文件)

【4】配置文件详情

        1、tsconfig.json

{"compileOnSave": false,"compilerOptions": {"outDir": "./dist/",// 打包到的目录"sourceMap": false,// 是否生成sourceMap(用于浏览器调试)"noImplicitAny": false,"noUnusedLocals": true,"noUnusedParameters": true,"declaration": true,// 是否生成声明文件(重要配置,便于查看方法类型)"declarationDir": "./dist/types/",// 声明文件打包的位置"declarationMap": false,// 是否生成声明文件map文件(便于调试)"moduleResolution": "node","module": "esnext","target": "es5",// 转化成的目标语言"baseUrl": "./","types": ["node"],"typeRoots": ["./node_modules/@types"],"lib": ["dom","es2015"],"jsx": "react","allowJs": false},"include": ["src/**/*.ts","typings.d.ts", "src/main.js",],// 要打包的文件"exclude": ["node_modules","*.test.ts"] 
}

        2、webpack.config.js

// Generated using webpack-cli https://github.com/webpack/webpack-cli
const path = require('path');
//clean-webpack-plugin: 实现每次编译时先清理上次编译结果
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');const isProduction = process.env.NODE_ENV == 'production';const config = {entry: './src/index.ts',output: {path: path.resolve(__dirname, 'dist'),filename: 'main.js', // 输出文件名library: 'SimpleJS', // 库的名称 -全局引入时可以使用libraryTarget: 'umd', // 支持的模块系统// umdNamedDefine: true // 会为 UMD 模块创建一个命名的 AMD 模块},devServer: {open: true,host: 'localhost',},plugins: [new HtmlWebpackPlugin({template: 'index.html',}),new CleanWebpackPlugin()],module: {rules: [{test: /\.ts$/i,loader: 'ts-loader',exclude: ['/node_modules/'],},{test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,type: 'asset',}]},resolve: {extensions: ['.tsx', '.ts', '.jsx', '.js', '...'],},
};module.exports = () => {if (isProduction) {config.mode = 'production';} else {config.mode = 'development';}return config;
};

2、使用typescript编写一个组件库(simple-js)

      simple-js组件库中集成算法、类型判断等常用的公共方法。

【1】方法文件

        src\algorithm\index.ts

import { StorageCapacityUnit } from './algorithm-types';// @params - str: 文本
// @params - showTotal: 显示文本的总个数
// 功能描述:截断文本,中间出现省略号
const truncateText = (str: string, showTotal: number): string => {if (str.length > showTotal) {const prefixNum = Math.floor(showTotal / 2);const suffixNum = showTotal - prefixNum;return `${str.slice(0, prefixNum)}...${str.slice(-suffixNum)}`;}return str;
}// @params1 - value: 需要转换的值
// @params2 - sourceUnit: 转换前单位
// @params3 - sourceUnit: 转换后单位
// @params4 - base: 转换进制
// 功能描述:存储单位的转换,
const unitSwitchForStorageCapacity = (value: number, sourceUnit: StorageCapacityUnit, targetUnit: StorageCapacityUnit, base = 1024): number => {const unitList = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];const sourceUnitIndex = unitList.findIndex(ele => ele === sourceUnit);const targetUnitIndex = unitList.findIndex(ele => ele === targetUnit);if (sourceUnitIndex === -1 || targetUnitIndex === -1) {console.error('转换失败,sourceUnit或者targetUnit不再转换列表')return value;}const exponent = sourceUnitIndex - targetUnitIndex;const resValue = value * Math.pow(base, exponent);return Number.isInteger(resValue) ? resValue : Number(resValue.toFixed(2));
}

【2】接口文件

        src\algorithm\algorithm-types.ts

export type StorageCapacityUnit = 'B'| 'KB'| 'MB'| 'GB'| 'TB'| 'PB'| 'EB'| 'ZB' | 'YB';

【3】主文件

         主文件中是simple-js的导出模块的入口:

import { truncateText, unitSwitchForStorageCapacity } from './algorithm/index';
import { isObject, isEmptyObject, isNullOrUndefined } from './type/index';export {truncateText,unitSwitchForStorageCapacity,isObject,isEmptyObject,isNullOrUndefined
} 

  3、通过webpack5进行编译

   编译:

npm run build

编译后文件目录:

main.js:组件库的主代码文件

index.d.ts:组件库的类型文件入口

  4、配置package.json,通过npm发布编译后的组件库

{"name": "simple-js-zyk", //npm平台的包"version": "1.0.0","description": "工具包",//包的描述说明"main": "./dist/main.js", // 组件库的入口文件"types": "./dist/types/index.d.ts", // 组件库中类型的文件入口"files": ["dist"], //npm发布的目录"scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "webpack --mode=production --node-env=production","build:dev": "webpack --mode=development","build:prod": "webpack --mode=production --node-env=production","watch": "webpack --watch","serve": "webpack serve"},"author": "","license": "ISC","devDependencies": {"@webpack-cli/generators": "^3.0.7","clean-webpack-plugin": "^4.0.0","html-webpack-plugin": "^5.6.0","simple-js-zyk": "^1.0.0","ts-loader": "^9.5.1","typescript": "^5.4.5","webpack": "^5.91.0","webpack-cli": "^5.1.4"}
}

  npm发布流程见:npm发布Vue组件_vue 发布组件-CSDN博客

5、在项目中的引用

【1】在普通js项目中的使用

        1)安装simple-js-zyk包

npm install --save-dev simple-js-zyk

        2)项目中在index.html引入

script type="text/javascript" src="./node_modules/simple-js-zyk/dist/main.js"></script>

        3) 使用

<script type="module">console.log(SimpleJS.truncateText('xxxxxxxssssss', 4));console.log(SimpleJS.unitSwitchForStorageCapacity(100, 'MB', 'KB'))</script>

【2】在vue项目中使用 

 1)安装simple-js-zyk包

npm install --save-dev simple-js-zyk

  2)vue项目tsconfig.json文件中引入simple-js-zyk的文件类型

{..."compilerOptions": {"types": ["node_modules/base-tool-zyk/dist/types"]}...
}

3)在vue模块文件中使用

import * as SimpleJS from 'simple-js-zyk';
console.log(SimpleJS.algorithm.truncateText('asxasxsaasss', 3))

 结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c 语言】声明了一个指针,会给指针分配内存吗?

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

租用境外服务器,越南服务器的优势有哪些

自从中国加入世界贸易组织之后&#xff0c;国内经济增加速度非常快&#xff0c;同时越来越多的人选择去东南亚国家发展&#xff0c;因为当地的中国人很多&#xff0c;所以中国企业在当地面临着更小的文化差异。东南亚地区也是最新的经济体&#xff0c;互联网正处于蓬勃发展的阶…

docker服务无法启动

背景&#xff1a;断电重启经常会导致磁盘io错误&#xff0c;甚至出现磁盘坏块 这时可以使用xfs_repair来修复磁盘&#xff0c;但是修复过程可能会导致部分数据丢失 xfs_repair -f -L /dev/sdc问题一&#xff1a; Apr 15 19:27:15 Centos7.6 systemd[1]: Unit docker.service e…

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架&#xff0c;目前行业里最流行的orm框架非Mybatis莫属了&#xff0c;而Mybatis框架本身没有提供api实现&#xff0c;所以市面上推出了Mybatis plus系列框架&#xff0c;plus版是mybatis增强工具&#xff0c;用于简化My…

嵌入式系统及应用-1.1嵌入式

嵌入式系统 定义&#xff1a;看不见的计算机&#xff0c;一般不能被用户编程&#xff0c;它有一些专用的I/O设备&#xff0c;对用户的接口是应用专用的 通常将嵌入式计算机系统简称为嵌入式系统。 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础、软件硬件可裁剪、…

记录一下如何腾讯云服务器用客户端连MySQL

我一般喜欢用IDEA连数据库&#xff0c;别问我为啥&#xff08;就喜欢用一个软件解决所有问题&#xff09; 当然写SQL语句个人还是觉得sqlyog体验最佳&#xff01;

【C/C++】什么是内存泄漏?如何检测内存泄漏?

一、内存泄漏概述 1.1 什么是内存泄漏 内存泄漏是在没有自动 gc 的编程语言里面&#xff0c;经常发生的一个问题。 自动垃圾回收&#xff08;Automatic Garbage Collection&#xff0c;简称 GC&#xff09;是一种内存管理技术&#xff0c;在程序运行时自动检测和回收不再使用…

MySQL8.0.36-社区版:错误日志(3)

mysql有个错误日志&#xff0c;是专门记录错误信息的&#xff0c;这个功能默认是开启的 一般都是在/var/log/mysqld.log 日志中存放 1.错误日志的位置 首先我们使用命令去查看一下&#xff0c;这个错误日志文件究竟在哪 进入到mysql中&#xff0c;使用命令 show variables…

FME学习之旅---day24

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 高级地理数据库 教程&#xff1a;地理数据库转换 上述教程包括 如何使用 Esri 模板地理数据库 该内容在FME学习之旅day19 已经学习过 使用地理数据库属性域&#xff1a;编写编码属性域 属…

机器学习实训 Day1(线性回归练习)

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

古月·ROS2入门21讲——学习笔记(一)核心概念部分1-14讲

讲解视频地址&#xff1a;1.ROS和ROS2是什么_哔哩哔哩_bilibili 笔记分为上篇核心概念部分和下篇常用工具部分 下篇&#xff1a;古月ROS2入门21讲——学习笔记&#xff08;二&#xff09;常用工具部分15-21讲-CSDN博客 目录 第一讲&#xff1a;ROS/ROS2是什么 1. ROS的诞生…

Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

海外代理IP在跨境电商中发挥什么作用?

在我国跨境电商的发展中&#xff0c;海外代理IP的应用日益广泛&#xff0c;它不仅帮助商家成功打入国际市场&#xff0c;还为他们在多变的全球电商竞争中保持优势。下面是海外代理IP在跨境电商中五个关键的应用场景。 1、精准的市场分析 了解目标市场的消费者行为、产品趋势以…

金蝶云星空与泛微OA对接案例-实现流程一体化

摘要&#xff1a;在企业数字化中&#xff0c;集成内部各业务系统以实现数据共享与流程协同&#xff0c;已成为提升运营效率、优化决策的重要选择。本文将以某企业成功实现金蝶云星空与泛微OA系统对接为例&#xff0c;详细解析双方在人员信息、组织架构、销售合同、付款申请、报…

快速探索随机树-RRT

文章目录 简介原理算法运动规划的变体和改进简介 快速探索随机树(RRT)是一种算法,旨在通过随机构建空间填充树来有效搜索非凸高维空间。该树是从搜索空间随机抽取的样本中逐步构建的,并且本质上偏向于向问题的大型未搜索区域生长。RRT 由 Steven M. LaValle 和 James J. K…

面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

时间片 超线程 上下文切换 切换查看 线程调度 引起线程上下文切换的因素 由于现在大多计算机都是多核CPU&#xff0c;多线程往往会比单线程更快&#xff0c;更能够提高并发&#xff0c;但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、…

python数据结构与算法之线性表

1、线性表 是一种由n个元素&#xff08;n> 0 &#xff09;数据元素组成的有限序列&#xff0c;所包含的元素数量通常被称为表的长度 n 0 的表被称为空表&#xff0c;线性表的数据元素可以单一也可以复杂&#xff0c;可以是整数&#xff0c;字符串&#xff0c;也可以是由几…

进程间通信--管道

1.有名管道 管道的分类:有名管道和无名管道 有名管道也成为命名管道.区别:有名管道在任意两个进程之间通信,无名管道在父子进程之间通信. 1.创建有名管道使用命令:mkfifo 2.打开管道:open(); 关闭管道:close(); 读数据:read(); 写入数据:write(); 2.有名管道来演示进程间通信:…

高光谱遥感数据处理与机器学习深度应用

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xff0c;…

将自己的项目上传至Git

一、安装Git 官网:Git (git-scm.com) 二、注册gitee 官网:工作台 - Gitee.com 进入“我的”出现以下界面 三、创建仓库 点击加号&#xff0c;新建仓库 根据自己的需求取名&#xff0c;描述仓库&#xff0c;开源还是私有&#xff0c;点击创建即可&#xff0c;点击我的即可…