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

这篇具有很好参考价值的文章主要介绍了使用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:组件库的类型文件入口

使用webpack5+TypeScript+npm发布组件库,工具,npm,前端,typescript,webpack

  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))

 结果:

使用webpack5+TypeScript+npm发布组件库,工具,npm,前端,typescript,webpack文章来源地址https://www.toymoban.com/news/detail-853094.html

到了这里,关于使用webpack5+TypeScript+npm发布组件库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 Vue3 + Webpack5 + Element Plus Table 二次构建表格组件

    基于 Vue3 + Webpack5 + Element Plus Table 二次构建表格组件,开箱即用 A Vue 3.x Table Component built on Webpack 5 该组件库可供学习、参考和用于二次开发。 1.基于 Webpack 5 构建 2.全面支持 Vue 3 3.支持 JSON 序列化表格快速配置 4.已内置 Pagination 分页 5.支持自定义 prop 列名 6.支持单元格内容自

    2024年04月13日
    浏览(83)
  • 《基于 Vue 组件库 的 Webpack5 配置》3.将 CSS 提取到单独的文件

    使用 webpack 插件 mini-css-extract-plugin 需要额外安装 npm i mini-css-extract-plugin@latest -D ; 同时打包 js 和 css 文件时,可参考 entry 高级用法; package.json 的配置如下

    2024年02月11日
    浏览(44)
  • 《基于 Vue 组件库 的 Webpack5 配置》7.路径别名 resolve.alias 和 性能 performance

    路径别名 resolve.alias 性能 performance

    2024年02月11日
    浏览(44)
  • 《基于 Vue 组件库 的 Webpack5 配置》1.模式 Mode 和 vue-loader

    一定要配置 模式 Mode,这里有个小知识点,环境变量 process.env.NODE_ENV 一定要配置 vue-loader Vue Loader v15 现在需要配合一个 webpack 插件才能正确使用; 一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件; vue-loader 和 vue-template-compiler 要一起安装,以保

    2024年02月11日
    浏览(42)
  • 《基于 Vue 组件库 的 Webpack5 配置》9.module.exports 可为数组类型且注意编译顺序

    module.exports 常见是对象类型,其实也可用数组类型; 注意编译顺序, 从后往前 编: 也就是说先编 another.js ,再编 index.js ; 所以 代码第 9 行 不能设置为 true ,仅在第一次,也就是 代码第19行 设置 一次 即可清空整个 output 文件夹; 如果 代码第 9 行 设置为 true ,则在编 i

    2024年02月08日
    浏览(48)
  • Webpack5 基本使用 - 2

    loader 是辅助打包工具。 webpack 默认只能打包 js 文件,打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。 loader 可以将文件从不同的语言转换为 JavaScript 。 一类文件如果需要多个 loader 处理, loader 的执行顺序是从后往前。 打包样式文件 打包 css css 文件需要

    2024年01月24日
    浏览(41)
  • Webpack5 基础使用笔记

    [webpack中文文档](概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)): 本质上, webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具 。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的

    2024年02月08日
    浏览(36)
  • Webpack5入门到原理2:基本使用

    Webpack 是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件,就可以在浏览器段运行了。 我们将 Webpack 输出的文件叫做 bundle。 Webpack 本身功能是有限的: 开发模式:

    2024年01月22日
    浏览(43)
  • 《基于 Vue 组件库 的 Webpack5 配置》6.将字体库和图片等静态资料,编译后打包至指定文件夹

    参考 Rule.generator.filename package.json 的配置如下

    2024年02月11日
    浏览(77)
  • 【快速搞定Webpack5】介绍及基本使用(一)

    他会以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件,就可以在浏览器端运行了。 我们将 webpack 输出的文件叫做 bundle 。 (将浏览器不识别的语法编译成识别的语法) webpack 本身功能是有限的:

    2024年02月21日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包