JavaScript系列(86)--现代构建工具详解
JavaScript 现代构建工具详解 🔨
现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。
构建工具概述 🌟
💡 小知识:构建工具主要解决代码转换、文件优化、模块打包、自动刷新、代码分割等问题。主流的构建工具包括webpack、Vite、Rollup等,它们各有特点和适用场景。
webpack 详解 📦
// 1. webpack配置
class WebpackConfig {constructor() {this.config = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: '[name].[contenthash].js'},module: {rules: []},plugins: [],optimization: {splitChunks: {chunks: 'all'}}};}addLoader(rule) {this.config.module.rules.push(rule);}addPlugin(plugin) {this.config.plugins.push(plugin);}setDevServer() {this.config.devServer = {contentBase: './dist',hot: true,port: 3000,compress: true,historyApiFallback: true};}setOptimization() {this.config.optimization = {minimize: true,minimizer: [new TerserPlugin(),new CssMinimizerPlugin()],splitChunks: {chunks: 'all',minSize: 20000,maxSize: 244000,cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all'}}}};}
}// 2. 加载器配置
class LoaderConfig {static getJavaScriptLoader() {return {test: /\.(js|jsx|ts|tsx)$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env','@babel/preset-react','@babel/preset-typescript'],plugins: ['@babel/plugin-transform-runtime']}}};}static getStyleLoader() {return {test: /\.(css|scss)$/,use: [MiniCssExtractPlugin.loader,{loader: 'css-loader',options: {modules: true,importLoaders: 1}},'postcss-loader','sass-loader']};}static getAssetLoader() {return {test: /\.(png|svg|jpg|jpeg|gif)$/i,type: 'asset',parser: {dataUrlCondition: {maxSize: 8 * 1024 // 8kb}}};}
}// 3. 插件配置
class PluginConfig {static getCommonPlugins() {return [new HtmlWebpackPlugin({template: './src/index.html',filename: 'index.html',inject: 'body'}),new MiniCssExtractPlugin({filename: '[name].[contenthash].css'}),new CleanWebpackPlugin(),new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)})];}static getAnalyzerPlugin() {return new BundleAnalyzerPlugin({analyzerMode: 'static',reportFilename: 'bundle-report.html'});}static getCompressionPlugin() {return new CompressionPlugin({algorithm: 'gzip',test: /\.(js|css|html|svg)$/,threshold: 10240,minRatio: 0.8});}
}
Vite 特性与应用 ⚡
// 1. Vite配置
class ViteConfig {static getBaseConfig() {return {root: process.cwd(),base: '/',mode: 'development',define: {__APP_VERSION__: JSON.stringify('1.0.0')},resolve: {alias: {'@': '/src'}},css: {modules: {localsConvention: 'camelCase'},preprocessorOptions: {scss: {additionalData: `@import "@/styles/variables.scss";`}}}};}static getPlugins() {return [vue(),vueJsx(),legacy({targets: ['defaults', 'not IE 11']})];}static getBuildConfig() {return {target: 'es2015',outDir: 'dist',assetsDir: 'assets',cssCodeSplit: true,sourcemap: false,rollupOptions: {output: {manualChunks: {vendor: ['vue', 'vue-router', 'vuex']}}}};}
}// 2. 开发服务器
class DevServer {constructor(config = {}) {this.config = {host: 'localhost',port: 3000,https: false,open: true,cors: true,...config};}async start() {const server = await createServer({...ViteConfig.getBaseConfig(),server: this.config});await server.listen();server.printUrls();}configureProxy() {return {'/api': {target: 'http://localhost:8080',changeOrigin: true,rewrite: path => path.replace(/^\/api/, '')}};}
}// 3. 优化策略
class ViteOptimization {static getDependencyOptimization() {return {optimizeDeps: {include: ['vue','vue-router','@vueuse/core'],exclude: ['vue-demi']}};}static getBuildOptimization() {return {build: {target: 'es2015',minify: 'terser',terserOptions: {compress: {drop_console: true,drop_debugger: true}},rollupOptions: {output: {manualChunks(id) {if (id.includes('node_modules')) {return 'vendor';}}}}}};}
}
Rollup 配置与插件 📦
// 1. Rollup配置
class RollupConfig {static getBaseConfig() {return {input: 'src/index.js',output: [{file: 'dist/bundle.cjs.js',format: 'cjs'},{file: 'dist/bundle.esm.js',format: 'es'},{file: 'dist/bundle.umd.js',format: 'umd',name: 'MyLibrary'}],plugins: [],external: ['react', 'react-dom']};}static getPlugins() {return [resolve({browser: true}),commonjs(),babel({babelHelpers: 'bundled',exclude: 'node_modules/**'}),terser()];}static getWatchConfig() {return {watch: {include: 'src/**',exclude: 'node_modules/**'}};}
}// 2. 插件开发
class RollupPlugin {static createPlugin(options = {}) {return {name: 'my-rollup-plugin',buildStart() {console.log('Build starting...');},resolveId(source, importer) {if (source === 'virtual-module') {return source;}return null;},load(id) {if (id === 'virtual-module') {return 'export default "This is virtual!"';}return null;},transform(code, id) {if (id.includes('.js')) {// 转换代码return {code: code,map: null};}}};}
}// 3. 构建优化
class RollupOptimization {static getTerserConfig() {return {compress: {dead_code: true,drop_console: true,drop_debugger: true,pure_getters: true,unsafe: true,unsafe_comps: true},mangle: {properties: {regex: /^_/}}};}static getTreeShakingConfig() {return {treeshake: {moduleSideEffects: false,propertyReadSideEffects: false,tryCatchDeoptimization: false}};}
}
性能优化策略 ⚡
// 1. 代码分割
class CodeSplitting {static getWebpackConfig() {return {optimization: {splitChunks: {chunks: 'all',minSize: 20000,maxSize: 244000,cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name(module) {const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];return `vendor.${packageName.replace('@', '')}`;}},common: {name: 'common',minChunks: 2,priority: -20}}}}};}static getViteConfig() {return {build: {rollupOptions: {output: {manualChunks: {vendor: ['vue', 'vue-router', 'vuex'],utils: ['lodash-es', 'axios']}}}}};}
}// 2. 缓存优化
class CacheOptimization {static getWebpackCacheConfig() {return {cache: {type: 'filesystem',buildDependencies: {config: [__filename]},name: 'production-cache'},output: {filename: '[name].[contenthash].js',chunkFilename: '[name].[contenthash].chunk.js'}};}static getViteCacheConfig() {return {optimizeDeps: {entries: ['src/**/*.{vue,js,ts}'],include: ['vue', 'vue-router'],exclude: ['your-unstable-package']},build: {commonjsOptions: {include: [/node_modules/]}}};}
}// 3. 资源优化
class AssetOptimization {static getImageOptimization() {return {test: /\.(png|jpg|gif|svg)$/i,use: [{loader: 'image-webpack-loader',options: {mozjpeg: {progressive: true,quality: 65},optipng: {enabled: false},pngquant: {quality: [0.65, 0.90],speed: 4},gifsicle: {interlaced: false},webp: {quality: 75}}}]};}static getCSSOptimization() {return {test: /\.css$/,use: [MiniCssExtractPlugin.loader,{loader: 'css-loader',options: {modules: true,importLoaders: 1}},{loader: 'postcss-loader',options: {postcssOptions: {plugins: ['postcss-preset-env','cssnano']}}}]};}
}
构建分析与监控 📊
// 1. 构建分析
class BuildAnalyzer {static getWebpackAnalyzer() {return new BundleAnalyzerPlugin({analyzerMode: 'static',reportFilename: 'bundle-report.html',openAnalyzer: false,generateStatsFile: true,statsFilename: 'bundle-stats.json'});}static getStatsConfig() {return {stats: {assets: true,chunks: true,modules: false,children: false,performance: true,timings: true,hash: false,version: false,builtAt: false,entrypoints: false}};}static analyzeBuildResult(stats) {return {totalSize: this.calculateTotalSize(stats),chunks: this.analyzeChunks(stats),assets: this.analyzeAssets(stats),performance: this.analyzePerformance(stats)};}
}// 2. 性能监控
class PerformanceMonitor {constructor() {this.metrics = {buildTime: 0,chunkCount: 0,totalSize: 0,warnings: []};}startBuild() {this.buildStartTime = Date.now();}endBuild() {this.metrics.buildTime = Date.now() - this.buildStartTime;}collectMetrics(stats) {this.metrics.chunkCount = stats.chunks.length;this.metrics.totalSize = this.calculateTotalSize(stats);this.metrics.warnings = stats.warnings;}generateReport() {return {...this.metrics,timestamp: new Date().toISOString(),performance: this.evaluatePerformance()};}
}// 3. 错误处理
class BuildErrorHandler {static handleError(error) {console.error('Build Error:', error);if (error.name === 'ModuleBuildError') {this.handleModuleError(error);} else if (error.name === 'ChunkRenderError') {this.handleChunkError(error);} else {this.handleGenericError(error);}}static generateErrorReport(errors) {return {count: errors.length,details: errors.map(error => ({type: error.name,message: error.message,module: error.module?.resource,stack: error.stack}))};}static notifyError(error) {// 实现错误通知逻辑}
}
结语 📝
现代构建工具为前端开发提供了强大的工程化能力。我们学习了:
- webpack的配置和优化
- Vite的特性和应用
- Rollup的插件开发
- 性能优化策略
- 构建分析与监控
- 错误处理机制
💡 学习建议:
- 深入理解不同构建工具的特点
- 掌握性能优化的关键点
- 重视构建配置的可维护性
- 建立完善的监控机制
- 持续优化构建流程
如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇
终身学习,共同成长。
咱们下一期见
💻
相关文章:
JavaScript系列(86)--现代构建工具详解
JavaScript 现代构建工具详解 🔨 现代前端开发离不开构建工具,它们帮助我们处理模块打包、代码转换、资源优化等任务。让我们深入了解主流的构建工具及其应用。 构建工具概述 🌟 💡 小知识:构建工具主要解决代码转换…...

docker容器网络配置及常用操作
Linux内核实现名称空间的创建 ip netns(网络名称空间)命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作。ip netns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。 注意&am…...
Docker 性能优化指南
Docker 提供了强大的容器化功能,能够帮助开发者在不同的环境中构建、测试和部署应用。然而,随着容器化应用的不断增长,Docker 容器可能会面临一些性能瓶颈,影响其运行效率、资源占用和扩展能力。为了确保容器在生产环境中的高效运…...

课程1. 深度学习简介
课程1. 深度学习简介 神经网络结构逻辑回归XOR问题(异或问题) 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材…...

【cuda学习日记】4.3 结构体数组与数组结构体
4.3 数组结构体(AoS)和结构体数组(SoA) AoS方法进行存储 struct innerStruct{float x;float y; };struct innerStruct myAOS[N];SoA方法来存储数据 struct innerArray{float x[N];float y[N]; };struct innerArray moa;如图说明…...

2025最新高维多目标优化:基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码
一、基于导航变量的多目标粒子群优化算法(NMOPSO)介绍 基于导航变量的多目标粒子群优化算法(Navigation variable-based multi-objective particle swarm optimization,NMOPSO)是2025年提出的一种用于无人机路径规划的…...

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
数字IC后端时钟树综合专题(OCC电路案例分享) 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC? 片上时钟控制器(On-chip Clock Controllers ,OCC),也称为扫描时钟控制器(Scan Clock Con…...

Linux内核,slub分配流程
我们根据上面的流程图,依次看下slub是如何分配的 首先从kmem_cache_cpu中分配,如果没有则从kmem_cache_cpu的partial链表分配,如果还没有则从kmem_cache_node中分配,如果kmem_cache_node中也没有,则需要向伙伴系统申请…...

本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)
安装Ollama 打开 Ollama官网 https://ollama.com/下载安装 Ollama服务默认只允许本机访问,修改允许其它主机访问 OLLAMA_HOST0.0.0.0 ollama serve也可以添加系统环境变量 都知道模型体积很大,顺便也通过环境变量修改模型存放位置,我这…...
Java 实现快速排序算法:一条快速通道,分而治之
大家好,今天我们来聊聊快速排序(QuickSort)算法,这个经典的排序算法被广泛应用于各种需要高效排序的场景。作为一种分治法(Divide and Conquer)算法,快速排序的效率在平均情况下非常高ÿ…...

20250223下载并制作RTX2080Ti显卡的显存的测试工具mats
20250223下载并制作RTX2080Ti显卡的显存的测试工具mats 2025/2/23 23:23 缘起:我使用X99的主板,使用二手的RTX2080Ti显卡【显存22GB版本,准备学习AI的】 但是半年后发现看大码率的视频容易花屏,最初以为是WIN10经常更换显卡/来回更…...

element-ui的组件使用
1. 安装 Element UI(在文件夹最上面输入cmd进入dos窗口,然后输入安装指令 npm install element-ui --save) 2.在main.js文件全局引入(main.js文件负责 全局注册 ),在该文件注册的所有组件在其他文件都能直接调用,一般…...

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)
医疗AI领域中GPU集群训练的关键技术与实践经验探究(上) 一、引言 1.1 研究背景与意义 在科技飞速发展的当下,医疗 AI 作为人工智能技术与医疗领域深度融合的产物,正引领着医疗行业的深刻变革。近年来,医疗 AI 在疾病诊断、药物研发、健康管理等诸多方面取得了显著进展,…...
详解Redis淘汰策略
引言 Redis 是一个高性能的内存数据库,广泛应用于缓存系统、消息队列等场景。当 Redis 的内存达到限制时,需要根据一定的策略来淘汰数据,以便腾出空间给新数据。本文将深入解析 Redis 的内存淘汰机制,帮助更好地配置 Redis&#…...

HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索
【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果:准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中…...

nginx关于配置SSL后启动失败原因分析
在配置SSL后,启动./nginx失败,报错提示如下: nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx-1.27.4/conf/nginx.conf:36 这个错误提示表在配置nginx启用SSL时,nginx未启用 ng…...

【自学嵌入式(9)ESP8266网络服务器的使用】
ESP8266网络服务器的使用 ESP8266WiFi 库① WiFiClass② WiFiClient③ WiFiServer④ WiFiUDP ESP8266WiFiMulti 库① WiFiMulti ESP8266WebServer 库① ESP8266WebServer 网络服务器实例在浏览器中控制ESP8266指示灯将开发板引脚状态显示在网页中 在之前的文章中,曾…...

危化品经营单位安全管理人员的职责及注意事项
危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任,以下是其主要职责及注意事项: 职责 1. 安全制度建设与执行:负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案,确保这些制度符合国家相关法…...
项目实战--网页五子棋(匹配模块)(5)
上期我们实现了websocket后端的大部分代码,这期我们实现具体的匹配逻辑 1. 定义Mather类 我们新建一个Matcher类用来实现匹配逻辑 Component public class Matcher {//每个匹配队列代表不同的段位,这里约定每一千分为一个段位private ArrayList<Queue<User…...

mysql 迁移到人大金仓数据库
我是在windows上安装了客户端工具 运行数据库迁移工具 打开 在浏览器输入http://localhost:54523/ 账号密码都是kingbase 添加mysql源数据库连接 添加人大金仓目标数据库 添加好的两个数据库连接 新建迁移任务 选择数据库 全选 迁移中 如果整体迁移不过去可以单个单个或者几个…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...