前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Webpack组件库打包超详细指南

Webpack组件库打包超详细指南

作者头像
luciozhang
发布于 2023-04-22 08:21:38
发布于 2023-04-22 08:21:38
3.3K11
代码可运行
举报
文章被收录于专栏:前端lucio前端lucio
运行总次数:1
代码可运行

本文介绍了从零开始,用Webpack打包一个组件库的过程。

1. 初始化项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vue init webpack-simple tip-components

优化目录结构

修改一下项目结构,下面的目录结构是比较清晰合理的。

我们新建了build用于打包配置,doc存放文档,lib存放打包输出文件。

2. 打包配置

不同需求的打包配置,放在不同文件中,是很好的做法。

我们的打包配置有一个基类文件,并根据不同的打包需求,有不同子类文件——完整组件库打包、单个组件打包、打包示例工程。

通过在npm的script中配置脚本,简化打包命令。

打包命令

(命令具体做了什么,选择哪个配置文件,看package.json)

运行示例工程 npm run test

打包完整组件库 npm run build

打包单个组件 npm run build:components

生成组件文档 npm run build:doc

*任意打包命令加:analyze,启用webpack-bundle-analyzer插件,打包完成后会打开bundle分析页面。

我们主要来看下三个打包配置文件。

webpack.base.js

通用的webpack配置,包括rules配置模块的读取和解析规则,以及webpack-bundle-analyzer插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//webpack.base.js
var path = require('path')
var webpack = require('webpack')
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin

module.exports = {
  module: {
    rules: [
    //……
    ]
  }
}

if (process.env.npm_config_report) {
  module.exports.plugins = (module.exports.plugins || []).concat([new BundleAnalyzerPlugin()])
}

webpack.prod.js

继承自webpack.base.js,完整组件库的打包配置,输出文件为tip-components.min.js,包含所有组件。模块化格式为umd,适用各种引入方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//webpack.prod.js
var path = require('path')
var webpack = require('webpack')
const merge = require('webpack-merge');
const webpackBaseConfig = require('./webpack.base.js');

const basePath = path.resolve(__dirname, '../')

module.exports = merge(webpackBaseConfig, {
  entry: path.join(basePath, 'src', 'enter.js'),
  output: {
    path: path.resolve(__dirname, '../lib'),
    publicPath: '/lib/',
    filename: 'tip-components.min.js',  // 输出文件名
    library: 'tip-components', // 组件库名称
    libraryTarget: 'umd',  //模块化格式
    umdNamedDefine: true
  },
  externals: {
    vue: {  //将vue依赖 "外部化",不打包进组件库
      root: 'Vue',
      commonjs: 'vue',
      commonjs2: 'vue',
      amd: 'vue'
    }
  },
});

这里打包的入口文件是src/enter.js,我们来看下这个入口文件做了什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
enter.js
import dialog from './component/dialog/dialog.js'
import marquee from './component/marquee/main.js'
import toast from './component/toast/toast.js'
//……

const components = {
    dialog,
    marquee,
    toast,
    //……
}

export default components

这里只是简单的引入所有的组件,放到components里面,再export出来。

我们在package.json文件里面添加一个打包命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"build": "webpack --config build/webpack.prod.js --progress --hide-modules",

运行npm run build,打包整个组件库,完成!

最后要提的配置文件是webpack.component.js,用于打包单个组件,我们放在下一节。

3. 分块打包配置

一般情况下,我们只需要用组件库中的一两个组件,引入整个组件库显然是不合理的。我们实现按需加载,按需加载的前提就是,我们的组件是支持一个一个单独打包的。

我们先新建一个components.json文件,用于配置哪些组件需要单独打包,以及组件的路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//components.json
{
    "marquee": "component/marquee/main.js",
    "toast": "component/toast/toast.js",
    "dialog": "component/dialog/dialog.js",
    //……
}

webpack.component.js

继承自webpack.base.js,打包单个组件。

相比webpack.prod.js,我们把entry配置为多个入口,遍历components.json来填充组件的名称和路径信息。output只需要指定一个,用占位符确保输出文件位组件的名称。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var path = require('path')
var webpack = require('webpack')
const merge = require('webpack-merge');
const components = require('./components.json')
const webpackBaseConfig = require('./webpack.base.js');

const basePath = path.resolve(__dirname, '../')
let entries = {}
Object.keys(components).forEach(key => {
  entries[key] = path.join(basePath, 'src', components[key])
})

module.exports = merge(webpackBaseConfig, {
  entry: entries,
  output: {
    path: path.resolve(__dirname, '../lib'),
    publicPath: '/lib/',
    filename: '[name].js',
    chunkFilename: '[id].js',
    library: '[name]', // 指定的就是你使用require时的模块名
    libraryTarget: 'umd',
    umdNamedDefine: true // 会对 UMD 的构建过程中的 AMD 模块进行命名。否则就使用匿名的 define
  },
  externals: {
    vue: {
      root: 'Vue',
      commonjs: 'vue',
      commonjs2: 'vue',
      amd: 'vue'
    }
  }
});

我们在package.json文件里面添加一个打包命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"build:components": "webpack --config build/webpack.component.js --progress --hide-modules",

运行npm run build:components,单独打包组件们,完成!

4. 按需引入组件

既然实现了单个组件的打包,我们当然不会每次都引入整个的组件库,在我们把组件库发布到tnpm后,为了引入单个组件,我们可以这样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import dom2image from "@tencent/tip-components/lib/dom2image";

但路径太长,太麻烦了。

babel-plugin-import

我们可以用babel-plugin-import插件,对路径做一个转换。

安装插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install babel-plugin-import --save-dev

在babel.config.js添加配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//babel.config.js
plugins: [["import", {
    "libraryName": "@tencent/tip-components",
  "libraryDirectory": "lib",  // default: lib
}]]

于是,我们可以直接这样用,默认去找到lib文件下的单个组件,美滋滋。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { dom2image } from "@tencent/tip-components";

5. 示例工程

为了方便在开发过程中调试组件,我们可以添加一个入口,用于拉起一个html页面进行调试。这与我们创建一个普通vue页面的操作是一样的,具体配置可以看webpack.demo.js。

我们添加一个打包命令,用webpack-dev-server跑一个示例页面的服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"test": "webpack-dev-server --config build/webpack.demo.js --open --hot",

需要注意的是,由于我们一开始是创建的webpack-simple,不是完整版的webpack模版,需要主动在html文件里面引入打包输出的js文件dist/main.js,如果你的示例页面一片空白,请检查一下输出文件是否正确引入。

6. 文档生成

jsdoc

这里选择用jsdoc来自动生成文档(后续发现,这里直接用jsdoc生成的文档比较不好看,示例不能清楚说明用法,缺少图片和GIF演示,jsdoc做为及时更新的API文档是够用的,但为了让库的用户更方便入手,建议自己组织组件的文档)。

为了vue组件能更好得用注释生成文档,我们还用了jsdoc-vuejs插件。

配置文件,看doc.conf.json。

在package.json新增一条生成文档的命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"build:doc": "jsdoc -c ./build/doc.conf.json ./src/*"

npm run build:doc 就能生成文档。

0. 参考文章

如何打造一套vue组件库

VueJS文档生成

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
1 条评论
热度
最新
如果想要 发布组件库的发布cdn资源,需要怎么做。 比如打包发布toast组件,可以通过cdn链接访问到单个组件资源 https://cdn.com/toast.1.3.3.js
如果想要 发布组件库的发布cdn资源,需要怎么做。 比如打包发布toast组件,可以通过cdn链接访问到单个组件资源 https://cdn.com/toast.1.3.3.js
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
​(非软文)Webpack从入门到实战搭建Vue脚手架(一万字总结)
安装依赖包 (-D 将依赖记录成开发依赖, 只是开发中需要用的依赖, 实际上线不需要的)
Vam的金豆之路
2021/12/01
1.3K0
组件库构建过程
最近在项目内部创建了一个vue组件库,希望通过组件库的形式,统一项目中组件的逻辑和样式,让代码的复用性更强。
Keller
2021/12/14
5580
组件库构建过程
前端性能优化——包体积压缩82%、打包速度提升65%
压缩项目打包后的体积大小、提升打包速度,是前端性能优化中非常重要的环节,笔者结合工作中的实践总结,梳理出一些 常规且有效 的性能优化建议
@超人
2023/05/12
2.9K0
前端性能优化——包体积压缩82%、打包速度提升65%
webpack从零搭建开发环境
为了方便也可以这么写,使用 npm run 命令这个命令执行的时候默认会把 node_modules 的.bin 文件放到全局上,执行之后销毁npm run buildnpm run dev
小丑同学
2020/09/21
1.3K0
webpack5构建一个通用的组件库
webpack5官方支持ts编写配置环境,不过需要安装几个插件支持,参考官网configuration-languages[1],我们今天使用ts配置webpack。
Maic
2022/07/28
8400
webpack5构建一个通用的组件库
Webpack4 搭建 Vue 项目
由于 Parcel 打包工具的影响,webpack4 也追求零配置搭建项目。而前阵子出现的 vue-cli 3.0也是基于 webpack4 零配置的思想创建的。对于一些习惯webpack3 的开发者难免有些不习惯。本文就带你绕过 vue-cli,用 webpack4 一步步搭建 vue 项目。
小皮咖
2019/11/05
1.1K0
从 Element UI 源码的构建流程来看前端 UI 库设计
由于业务需要,近期团队要搞一套自己的UI组件库,框架方面还是Vue。而业界已经有比较成熟的一些UI库了,比如ElementUI、AntDesign、Vant等。
前端森林
2020/06/28
2.1K0
Webpack5构造React多页面应用
来源 | https://github.com/zhedh/react-multi-page-app/
winty
2021/01/07
3.8K0
从0到1 Webpack搭建Vue3开发、生产环境
起步 创建项目目录 mkdir webpack-vue3-demo 初始化 package.json npm init -y 参考文档 安装 webpack webpack-cli webpack-dev-server webpack-merge npm install webpack webpack-cli webpack-dev-server webpack-merge --save-dev 创建配置文件 mkdir build cd build touch webpack.b
peng_tianyu
2022/12/15
1.2K0
从0到1 Webpack搭建Vue3开发、生产环境
element-ui 简单二次开发
当前项目为vue 2.6 + element-ui 2.14.1, 我们需要开发一个类似表格的表单组件, 可以看到除了表格样式以外,我们还需要嵌套各种表单组件,而组件功能基本与框架功能一致,如果对每个组件都做独立开发,显然是不现实的。所以我们的目标一定是尽量使用原组件
copy_left
2020/12/17
1.9K0
Vue+ElementUI项目使用webpack输出MPA
为另一个项目提供可嵌入的功能单页,大部分页面使用时都是独立功能页,个别页面带有左侧边栏(相当于3-4个页面的整合形态),由于资源定位地址的限定,每个页面打包为单页后,入口html文件需要定制命名,且脚本和样式文件需要放在指定的路径下,公共资源地址也必须替换成特殊字符以适配母系统的调用逻辑(比如下面结构中应用jquery.min.js的路径可能是{{publicRoot}}/{{publicLib}}/jquery.minjs)。假设原工程中拥有AB这2个旧页面,现在需要开发CDE这3个页面,目录结构要求如下:
大史不说话
2019/08/27
1.3K0
Vue+ElementUI项目使用webpack输出MPA
【Webpack】320- Webpack4 入门手册(共 18 章)(下)
最近和部门老大,一起在研究团队【EFT - 前端新手村】的建设,目的在于:帮助新人快速了解和融入公司团队,帮助零基础新人学习和入门前端开发并且达到公司业务开发水平。
pingan8787
2019/08/20
2.4K0
【Webpack】320- Webpack4 入门手册(共 18 章)(下)
用 webpack 4.0 撸单页/多页脚手架 (jquery, react, vue, typescript)
首先来简单介绍一下webpack:现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部构建一个会映射项目所需的每个模块 的依赖图(dependency graph),并生成一个或多个 bundle。webpack4.0出现之后,我们可以不用再引入一个配置文件来打包项目,并且它仍然有着很高的可配置性,可以很好满足我们的需求。 在开始正文之前,首先先来看看我们要实现的成果:
徐小夕
2019/08/08
2.4K0
用 webpack 4.0 撸单页/多页脚手架 (jquery, react, vue, typescript)
浅析组件库实现按需引入的几种方式
按需加载是所有组件库都会提供的一个基础能力,本文会分析ElementUI、Vant及varlet几个组件库的实现并进行相应实践,帮助你彻底搞懂其实现原理。
街角小林
2022/03/21
3.3K0
浅析组件库实现按需引入的几种方式
从零开始,手摸手搭建前端组件库
https://majunchang.github.io/mi.vant/#/quickStart
念念不忘
2019/11/11
2.9K1
从零打造组件库
业内优秀的组件库比如 Antd Design 和 Element UI,大大节省了我们的开发时间。那么,做一套组件库,容易吗?
leocoder
2022/03/09
1.8K0
从零打造组件库
搭建webpack项目框架
随着业务发展和前端人员的增加,搭建一个通用框架以及制定统一规范就成了必然。对于选型这方面,一开始好像就没考虑其他框架,直接选了webpack。webpack的优点就不多说了,可扩展性,强大的npm插件库,说干就干。
jojo
2019/03/12
2.4K0
搭建webpack项目框架
vue3+webpack项目搭建实验
在 postcss.config.js中配置 autoprefixer用于给css加前缀, cssnano用于压缩优化css
治电小白菜
2020/08/25
2.7K2
webpack系列---webpack介绍&基本使用
2.安装到项目依赖 有时候我们的项目要依赖webpack,可以运行npm i webpack --save-dev
切图仔
2022/09/08
5970
webpack系列---webpack介绍&基本使用
【xingorg1-ui】基于vue3.0从0-1搭建组件库 (八) 组件库打包环境配置
no-clean表示打包时不删除build文件夹(https://cli.vuejs.org/zh/config/#outputdir) 作用就是为了后边的按需打包,下表。
xing.org1^
2020/11/24
1.7K0
【xingorg1-ui】基于vue3.0从0-1搭建组件库 (八) 组件库打包环境配置
推荐阅读
相关推荐
​(非软文)Webpack从入门到实战搭建Vue脚手架(一万字总结)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验