webpack4从0搭建组件库的实现


Posted in Javascript onNovember 29, 2020

代码分离

代码分离方法有三种:

  • 入口起点:使用 entry 配置手动地分离代码。
  • 防止重复:使用 SplitChunksPlugin 去重和分离 chunk。
  • 动态导入:通过模块中的内联函数调用来分离代码。

动态导入(dynamic imports)

  • import()
  • require.ensure

预取/预加载模块(prefetch/preload module)

webpack v4.6.0+ 添加了预取和预加载的支持。

在声明 import 时,使用下面这些内置指令,可以让 webpack 输出 "resource hint(资源提示)",来告知浏览器:

  • prefetch(预取):将来某些导航下可能需要的资源
  • preload(预加载):当前导航下可能需要资源

配置项重点详解

(1)mode: "pruduction"
启用 minification(代码压缩) 和 tree shaking (usedExports:true)
自动指定DefinePlugin:process.env.NODE_ENV === 'production'

(2)devtool
source map 简介

生产环境:source-map
开发环境:inline-source-map

(3)optimization
splitChunks

splitChunks: {
 chunks: 'all', // 提取公共模块 loadash
 // 将第三方库(library)(例如 lodash 或 react)提取到单独的 vendor chunk 文件中,是比较推荐的做法
 // 利用 client 的长效缓存机制,命中缓存来消除请求,并减少向 server 获取资源,同时还能保证 client 代码和 server 代码版本一致。
 cacheGroups: {
  vendor: {
   test: /[\\/]node_modules[\\/]/,
   name: 'vendors',
   chunks: 'all'
  }
 }
},

runtimeChunk

runtimeChunk: 'single' // 提取引导模板 将 runtime 代码拆分为一个单独的 chunk

(5)output

// filename: '[name].[contenthash].js', // content hash 内容变化才会变化
filename: 'webpack-numbers.js', 
path: path.resolve(__dirname, 'dist'),

// 暴露 library 这是库名称 import from 'webpackNumbers'
library: 'webpackNumbers', 
libraryTarget: 'umd'

(6)plugins

HashedModuleIdsPlugin

const { HashedModuleIdsPlugin } = require('webpack');

plugins: [
  // 不会因模块增加和减少导致的模块内容变化,增加长缓存命中机制
  new HashedModuleIdsPlugin()
],

BundleAnalyzerPlugin

分析打包代码

const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');

plugins: [
  new BundleAnalyzerPlugin()
]

到此这篇关于webpack4从0搭建组件库的实现的文章就介绍到这了,更多相关webpack4搭建组件库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Flash对联广告的关闭按钮讨论
Jan 30 Javascript
jquery uaMatch源代码
Feb 14 Javascript
JsRender for object语法简介
Oct 31 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
JavaScript中的原型链prototype介绍
Dec 30 Javascript
jQuery中cookie插件用法实例分析
Dec 04 Javascript
jQuery实现产品对比功能附源码下载
Aug 09 Javascript
微信小程序 获取微信OpenId详解及实例代码
Oct 31 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
微信小程序 input输入及动态设置按钮的实现
Oct 27 Javascript
微信提示 在浏览器打开 效果实现过程解析
Sep 10 Javascript
three.js利用射线Raycaster进行碰撞检测
Mar 12 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 #Javascript
Vue用mixin合并重复代码的实现
Nov 27 #Vue.js
js实现扫雷源代码
Nov 27 #Javascript
JavaScript字符串转数字的简单实现方法
Nov 27 #Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 #Vue.js
JavaScript中的Proxy对象
Nov 27 #Javascript
详解JavaScript中的链式调用
Nov 27 #Javascript
You might like
PHP4实际应用经验篇(4)
2006/10/09 PHP
PHP循环获取GET和POST值的代码
2008/04/09 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
JQquery的一些使用心得分享
2012/08/01 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
python根据经纬度计算距离示例
2014/02/16 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
Android分包MultiDex策略详解
2017/10/30 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Django 框架模型操作入门教程
2019/11/05 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
python程序如何进行保存
2020/07/03 Python
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
学生会主席任命书
2015/09/21 职场文书
Python道路车道线检测的实现
2021/06/27 Python
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android