当前位置: 首页 > news >正文

前端取经路——工程化渡劫:八戒的构建之道

大家好,我是老十三,一名前端开发工程师。前端工程化就像八戒的钉耙,看似简单却能降妖除魔。在本文中,我将带你探索前端工程化的九大难题,从模块化组织到CI/CD流程,从代码规范到自动化测试,揭示这些工具背后的核心原理。无论你是初学者还是资深工程师,这些构建之道都能帮你在复杂项目中游刃有余,构建出高质量的前端应用。

踏过了框架修行的双修之路,我们来到前端取经的第五站——工程化渡劫。就如同猪八戒钉耙一般,前端工程化工具虽貌似平凡,却是降妖除魔的利器。当项目规模不断扩大,团队成员日益增多,如何保证代码质量与开发效率?这就需要掌握"八戒的构建之道"。

🧩 第一难:模块化 - 代码组织的"乾坤大挪移"

问题:大型前端项目如何组织代码?为什么全局变量是万恶之源?

深度技术:

前端模块化是有效管理复杂度的基础,它经历了从全局变量、命名空间、IIFE到AMD、CommonJS、ES Modules的漫长进化。理解模块化不仅是掌握语法,更是理解其解决的核心问题:依赖管理、作用域隔离和代码组织。

模块化最关键的价值在于控制复杂度,隐藏实现细节,提供清晰接口,进而使大型前端应用的开发和维护成为可能。从技术角度看,模块系统需要解决三个核心问题:模块定义、依赖声明和模块加载。

代码示例:

// 1. 原始方式:全局变量(反模式)
var userService = {getUser: function(id) { /* ... */ },updateUser: function(user) { /* ... */ }
};var cartService = {addItem: function(item) { /* ... */ }// 失误:重写了userService的方法!getUser: function() { /* ... */ }
};// 2. IIFE + 闭包:模块模式
var userModule = (function() {// 私有变量和函数var users = [];function findUser(id) { /* ... */ }// 公开APIreturn {getUser: function(id) {return findUser(id);},addUser: function(user) {users.push(user);}};
})();// 3. CommonJS (Node.js环境)
// math.js
const PI = 3.14159;
function add(a, b) {return a + b;
}module.exports = {PI,add
};// app.js
const math = require('./math.js');
console.log(math.add(16, 26)); // 42// 4. ES Modules (现代浏览器)
// utils.js
export const PI = 3.14159;
export function add(a, b) {return a + b;
}// 默认导出
export default function multiply(a, b) {return a * b;
}// app.js
import multiply, { PI, add } from './utils.js';
console.log(add(2, 3)); // 5
console.log(multiply(2, 3)); // 6// 5. 动态导入
const modulePromise = import('./heavy-module.js');
modulePromise.then(module => {module.doSomething();
});// 或使用async/await
async function loadModule() {const module = await import('./heavy-module.js');return module.doSomething();
}// 6. 模块化CSS:CSS Modules
// button.module.css
.button {background: blue;color: white;
}// React组件
import styles from './button.module.css';function Button() {return <button className={styles.button}>Click me</button>;
}// 7. 微前端模块化
// 主应用
import { registerApplication, start } from 'single-spa';registerApplication('app1',() => import('./app1/index.js'),location => location.pathname.startsWith('/app1')
);registerApplication('app2',() => import('./app2/index.js'),location => location.pathname.startsWith('/app2')
);start();

🔨 第二难:打包工具 - Webpack到Vite的进化之路

问题:为什么现代前端开发离不开打包工具?各种构建工具的优劣势是什么?

深度技术:

打包工具是前端工程化的核心引擎,它解决了模块依赖解析、资源转换、代码合并和优化等一系列问题。从最早的Grunt、Gulp到Webpack、Parcel,再到最新的Vite、esbuild,每一代工具都针对前一代的痛点进行了优化。

理解打包工具的关键在于掌握其工作原理:依赖图构建、Loader转换、插件系统以及代码分割机制。特别是Webpack的模块联邦和Vite的ESM+HMR机制,代表了现代打包工具的创新方向。

代码示例:

// Webpack配置示例
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {// 入口文件entry: './src/index.js',// 输出配置output: {path: path.resolve(__dirname, 'dist'),filename: '[name].[contenthash].js',clean: true // 每次构建前清理输出目录},// 模式:development或productionmode: 'production',// 模块规则(Loaders)module: {rules: [// JavaScript/TypeScript处理{test: /\.(js|jsx|ts|tsx)$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env', '@babel/preset-react']}}},// CSS处理{test: /\.css$/,use: [MiniCssExtractPlugin.loader,'css-loader','postcss-loader']},// 图片和字体处理{test: /\.(png|svg|jpg|jpeg|gif)$/i,type: 'asset/resource',},{test: /\.(woff|woff2|eot|ttf|otf)$/i,type: 'asset/resource',}]},// 插件配置plugins: [new HtmlWebpackPlugin({template: './src/index.html',title: '八戒的前端工程化'}),new MiniCssExtractPlugin({filename: '[name].[contenthash].css'})],// 优化配置optimization: {// 代码分割splitChunks: {chunks: 'all',// 将node_modules中的模块单独打包cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'vendors',chunks: 'all'}}},// 提取运行时代码runtimeChunk: 'single'},// 开发服务器配置devServer: {static: './dist',hot: true,port: 3000,historyApiFallback: true}
};// Vite配置示例
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import legacy from '@vitejs/plugin-legacy';export default defineConfig({plugins: [react(),// 支持旧浏览器legacy({targets: ['defaults', 'not IE 11']})],// 解析配置resolve: {alias: {'@': '/src'}},// 构建配置build: {target: 'es2015',outDir: 'dist',rollupOptions: {// 外部化依赖external: ['some-external-library'],output: {// 自定义分块策略manualChunks: {vendor: ['react', 'react-dom'],utils: ['lodash-es', 'date-fns']}}}},// 开发服务器配置server: {port: 3000,// 代理API请求proxy: {'/api': {target: 'http://localhost:8080',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}}
});// Gulp任务示例(旧时代的构建方式)
// gulpfile.js
const gulp = require('gulp');
const sass = require('gulp-sass')(require('sass'));
const autoprefixer = require('gulp-autoprefixer');
const uglify = require('gulp-uglify');
const concat = require('gulp-concat');// 编译Sass任务
gulp.task('styles', () => {return gulp.src('./src/styles/**/*.scss').pipe(sass().on('error', sass.logError)).pipe(autoprefixer()).pipe(gulp.dest('./dist/css'));
});// 处理JavaScript任务
gulp.task('scripts', () => {return gulp.src('./src/scripts/**/*.js').pipe(concat('main.js')).pipe(uglify()).pipe(gulp.dest('./dist/js'));
});// 监视文件变化
gulp.task('watch', () => {gulp.watch('./src/styles/**/*.scss', gulp.series('styles'));gulp.watch('./src/scripts/**/*.js', gulp.series('scripts'));
});// 默认任务
gulp.task('default', gulp.parallel('styles', 'scripts', 'watch'));

🌲 第三难:Tree-Shaking - 代码瘦身的"七十二变"

问题:为什么引入一个小功能却打包了整个库?如何实现真正的按需加载?

深度技术:

Tree-Shaking是现代JavaScript构建中的重要优化技术,它通过静态分析移除未使用的代码(死代码),大幅减小最终打包体积。这一技术源于ES Modules的静态结构特性,使得构建工具能在编译时确定模块间的依赖关系。

实现高效Tree-Shaking需要理解"副作用"概念、ESM与CJS的区别、sideEffects标记,以及如何编写"Tree-Shakable"的代码。特别是在使用UI组件库时,正确的导入方式可能导致最终打包大小相差数倍。

代码示例:

// 反例:不利于Tree-Shaking的代码// 1. 命名空间导出(所有内容会被视为一个整体)
// utils.js
export default {add(a, b) { return a + b; },subtract(a, b) { return a - b; },multiply(a, b) { return a * b; },// 可能有几十个方法...
};// 使用
import Utils from './utils';
console.log(Utils.add(2, 3)); // 即使只用了add,其他所有方法也会被打包// 2. 具有副作用的模块
// side-effects.js
const value = 42;
console.log('This module has been loaded!'); // 副作用!
export { value };// 3. 动态属性访问(无法静态分析)
const methods = {add: (a, b) => a + b,subtract: (a, b) => a - b
};export function calculate(operation, a, b) {return methods[operation](a, b); // 动态访问,Tree-Shaking无法优化
}// 正例:有利于Tree-Shaking的代码// 1. 命名导出
// utils.js
export function add(a, b) { return a + b; }
export function subtract(a, b) { return a - b; }
export function multiply(a, b) { return a * b; }// 使用 - 只导入需要的函数
import { add } from './utils';
console.log(add(2, 3)); // 其他未使用的函数将被Tree-Shaking移除// 2. 标记无副作用
// package.json
{"name": "my-library","sideEffects": false, // 标记整个库无副作用// 或指定有副作用的文件"sideEffects": ["*.css","./src/side-effects.js"]
}// 3. 条件引入与代码分割
// 使用动态import实现按需加载
async function loadModule(moduleName) {if (moduleName === 'chart') {// 只有需要时才加载图表库const { Chart } = await import('chart.js/auto');return Chart;}return null;
}// 4. UI组件库按需引入
// 反例 - 导入整个库
import { Button, Table, DatePicker } from 'antd'; // 会导入整个antd// 正例 - 从具体路径导入
import Button from 'antd/lib/button';
import 'antd/lib/button/style/css';// 更好的方式 - 使用babel-plugin-import自动转换
// babel.config.js
{"plugins": [["import", {"libraryName": "antd","libraryDirectory": "lib","style": "css"}]]
}// 转换前
import { Button } from 'antd';
// 转换后(自动)
import Button 

相关文章:

前端取经路——工程化渡劫:八戒的构建之道

大家好,我是老十三,一名前端开发工程师。前端工程化就像八戒的钉耙,看似简单却能降妖除魔。在本文中,我将带你探索前端工程化的九大难题,从模块化组织到CI/CD流程,从代码规范到自动化测试,揭示这些工具背后的核心原理。无论你是初学者还是资深工程师,这些构建之道都能帮…...

Android 数据持久化之 Room 数据库存储

一、简介 Room 是 Google 推出的 Android 持久层框架,建立在 SQLite 之上,提供了一个抽象层,简化了数据库操作。它通过注解和编译时检查来确保数据操作的正确性。 Room 主要由以下三个组件组成: Entity(实体):定义封装实际数据的实体类,每个实体类对应数据库中的一个…...

Selenium Web自动化测试学习笔记(一)

自动化测试 技术手段模拟人工&#xff0c;执行重复性任务&#xff0c;准确率100%&#xff0c;高于人工 selenium 可通过浏览器驱动控制浏览器&#xff0c;通过元素定位模拟人工&#xff0c;实现web自动化&#xff0c;没有焦点&#xff08;把浏览器放在最小化依然可以&#x…...

一个项目的周测试的文档(Billing Service 测试文档)

目录 Pending Pool 各项功能测试... 2 1. Assign 分配功能。测试结果&#xff1a; ok. 2 2. Reset 功能。 测试结果&#xff1a; OK. 3 3. Discard 功能。测试结果&#xff1a; 提示discard成功&#xff0c;但是historical job没有找到记录... 3 4. E…...

二分查找习题

一、二叉搜索树与双向链表&#xff08;剑指 Offer JZ36 &#xff09; 解题思路要点 - 利用中序遍历特性&#xff1a;二叉搜索树的中序遍历结果是有序序列&#xff0c;这是将二叉搜索树转化为有序双向链表的关键。通过中序遍历可以按从小到大的顺序访问节点&#xff0c;满足…...

JumpServer批量添加资产

环境说明&#xff1a;我的环境是H3C网络设备环境 一、在linux系统环境下通过Python脚本获取交换机信息&#xff0c;IP地址和设备名称一一对应&#xff0c;脚本如下&#xff1a; cat get_device-sysname.py import re from netmiko import ConnectHandler from concurrent.fut…...

使用 Python 与 Java 实现接入 AI 大模型的 MCP 协议:原理与实战

一、什么是 MCP 协议&#xff1f; MCP&#xff08;Model Context Protocol&#xff09; 是一种专为远程控制和管理 AI 大模型而设计的通信协议。它允许客户端通过网络向服务器发送请求&#xff0c;以执行诸如模型推理、状态查询、参数更新等操作&#xff0c;并接收相应的结果。…...

Nginx核心原理以及案例分析(AI)

一、Nginx核心原理分析 1. ‌事件驱动与非阻塞模型‌ ‌Epoll异步机制‌&#xff1a;基于Linux的epoll模型实现异步非阻塞I/O处理&#xff0c;单线程可高效管理数万并发连接&#xff0c;避免传统select模型的轮询性能瓶颈。‌多进程架构‌&#xff1a;采用Master-Worker模式&…...

ChromeDriverManager的具体用法

ChromeDriverManager 是 webdriver_manager 库的一部分&#xff0c;它用于自动管理 ChromeDriver 的下载和更新。使用 ChromeDriverManager 可以避免手动下载 ChromeDriver 并匹配系统中安装的 Chrome 浏览器版本。以下是 ChromeDriverManager 的基本用法&#xff1a; 步骤 1…...

Linux:认识基础IO

1.理解"⽂件" 1.1狭义理解 ⽂件在磁盘⾥ 磁盘是永久性存储介质&#xff0c;因此⽂件在磁盘上的存储是永久性的 磁盘是外设&#xff08;即是输出设备也是输⼊设备&#xff09; 磁盘上的⽂件 本质是对⽂件的所有操作&#xff0c;都是对外设的输⼊和输出 简称 IO 1.2广…...

SimpleMindMap:一个支持AI的思维导图软件

SimpleMindMap&#xff08;思绪思维导图&#xff09;是一款开源、跨平台且功能丰富的思维导图工具&#xff0c;支持 Web 端及多平台客户端&#xff08;Windows、macOS、Linux&#xff09;。 SimpleMindMap 提供的主要功能如下&#xff1a; 插件化设计&#xff0c;除了核心功能…...

数据库故障排查指南:MySQL 解决常见问题解决

数据库是现代 IT 系统的核心引擎,承载着企业最重要的数据资产。数据库的稳定、高效运行直接关系到业务的生死存亡。然而,由于软硬件、配置、应用访问等多种因素的影响,数据库故障难以完全避免。当故障发生时,能够迅速定位、分析并解决问题,同时确保数据安全不受影响,是每…...

2025年特种作业操作证考试题库及答案(登高架设作业)

一、单选题 202.带电跨越架羊角撑杆高度&#xff08;  &#xff09;m。 A.1 B.1.1 C.1.2 答案:B 203.跨越架拉线地锚埋深必须按&#xff08;  &#xff09;及架体设计要求进行。 A.现场情况决定 B.土质情况 C.地锚设计分坑图 答案:C 204.单排脚手架洞口处&#…...

Open CASCADE学习|ApplicationFramework 框架使用指南

在现代 CAD&#xff08;计算机辅助设计&#xff09;应用开发中&#xff0c;构建一个高效、可扩展且用户友好的应用程序框架是至关重要的。Open CASCADE&#xff08;简称 OCC&#xff09;提供了一个功能强大的 ApplicationFramework&#xff08;应用程序框架&#xff09;&#x…...

hadoop中的序列化和反序列化(3)

3. Java的序列化 Java提供了内置的序列化机制&#xff0c;通过java.io.Serializable接口实现。 3.1 如何实现Java序列化 让类实现Serializable接口。 使用ObjectOutputStream进行序列化。 使用ObjectInputStream进行反序列化。 示例代码 序列化 java 复制 import jav…...

PostgreSQL给新用户授权select角色

✅ 切换到你的数据库并以超级用户登录&#xff08;例如 postgres&#xff09;&#xff1a; admin#localhost: ~$ psql -U postgres -d lily✅ 创建登录的账号机密吗 lily> CREATE USER readonly_user WITH PASSWORD xxxxxxxxxxx; ✅ 确认你授予了这个表的读取权限&#xf…...

MySQL 8.0 OCP(1Z0-908)英文题库(1-10)

目录 第1题题目解析正确答案 第2题题目解析正确答案 第3题题目解析正确答案 第4题题目解析正确答案 第5题题目解析正确答案 第6题题目解析正确答案 第7题题目解析正确答案 第8题题目解析正确答案 第9题题目解析正确答案 第10题题目解析正确答案&#xff1a; 第1题 Your MySQL …...

南京市出台工作方案深化“智改数转网联”,物联网集成商从“困局”到“蓝海”!

为落实《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025-2027年&#xff09;》&#xff0c;南京市近日出台“工作方案”&#xff0c;部署五大行动17项重点任务&#xff0c;进一步深化全市制造业智能化改造、数字化转型、网络化联接&#xff08;以…...

系统思考:教育焦虑恶性循环分析

今天和团队的小伙伴一起拆解了一个父母教育焦虑与报班行为之间的系统环路图&#xff0c;报班越多 ➡ 孩子自由时间越少 ➡ 情绪调节力下降 ➡ 学习效率更低 ➡ 成绩不理想 ➡ 家长更焦虑 ➡ 继续加码报班…… 一圈一圈&#xff0c;像是陷入了“焦虑的恶性循环”。 这也是我一直…...

(已完结)完美解决C盘拓展卷是灰色的无法扩容的问题以及如何正确地在WINDOS上从一个盘扩容到C盘

众所周知&#xff0c;window系统在“计算机”管理中自带了一个磁盘管理系统 但是在使用过程中会出现各种各样无法扩容的毛病。 第一&#xff1a;首先排查&#xff0c;大多数人在扩容之前忽视了一点就是&#xff0c;我们现代的很多新机器都是默认开启BitLocker加密的&#xff…...

优选算法系列(8.多源BFS)

简介&#xff1a; 01 矩阵&#xff08;medium&#xff09;&#xff1a; 题目链接&#xff1a;542. 01 矩阵 - 力扣&#xff08;LeetCode&#xff09; 算法&#xff1a; 对于求的最终结果&#xff0c;我们有两种方式&#xff1a; 第⼀种方式&#xff1a;从每⼀个 1 开始&#…...

迈向AI辅助数据分析代码生成的透明性与知识共享

李升伟 摘译 生成式人工智能&#xff08;AI&#xff09;及尤其大型语言模型&#xff08;LLMs&#xff09;正在改变我们进行数据科学研究的方式. 最显著的例子包括科学家使用该技术与科学数据交互, 回答数据分析问题, 生成数据分析代码以及(重新)撰写科研手稿. 然而遗憾的是&am…...

autojs和冰狐智能辅助该怎么选择?

最近打算做自动化脚本&#xff0c;在autojs和冰狐智能辅助中做选择&#xff0c;不知道该怎么选。没办法只能花费大量时间仔细研究了autojs和冰狐智能辅助&#xff0c;综合考虑功能需求、开发复杂度、编程经验及项目规模等因素。以下是两者的核心对比及选择建议&#xff0c;仅供…...

小数的二进制表示

相信很多人都知道整数的二进制表示方法&#xff0c;但是小数的二进制就不一定了。 想来简单说一下整数的&#xff0c;就是不断的除以2取余数&#xff0c; 大致这样 从下往上取&#xff0c;这里42的结果就是101010 而且每个整数都有他对应的二进制数&#xff0c;但是小数转二…...

信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十)

个人笔记整理---仅供参考 第十章项目进度管理 10.1管理基础 10.2项目进度管理过程 10.3规划进度管理 10.4定义活动 选C 10.5排列活动顺序 10.6估算活动持续时间 10.7制订进度计划 制订进度计划4个步骤&#xff08;背&#xff0c;案例可能会考&#xff01;&#xff09; 10.8控制…...

Linux内核初始化机制全解析:从pure_initcall到late_initcall

引言 Linux内核的启动过程是一个高度有序的初始化流程,涉及数百个模块和子系统的协同工作。为了确保依赖关系正确、硬件资源按需分配,内核通过一系列初始化宏(如pure_initcall、subsys_initcall、late_initcall等)将函数划分为不同的优先级,按严格顺序执行。本文将深入探…...

pcie协议复位

pcie协议复位共有4中情况&#xff1b;cold reset&#xff1b;warm reset&#xff1b;hot reset&#xff1b;function level reset&#xff1b; 分类&#xff1a; 依据spec 6.6&#xff1a; Conventional reset&#xff08;传统复位&#xff09;&#xff1a;cold&#xff0c;…...

boost笔记: Cannot open include file: ‘boost/mpl/aux_/preprocessed/plain/.hpp‘

1. 问题描述 因为一下库定义了宏and&#xff0c;导致boost的文件包含and.hpp展开成&.hpp&#xff0c;所以出现以下错误 Cannot open include file: ‘boost/mpl/aux_/preprocessed/plain/&.hpp’ 2. 解决方案 在定义宏之前包含boost文件&#xff0c;但这种方案的缺点…...

Xilinx XCKU11P-2FFVA1156I 赛灵思 FPGA AMD Kintex UltraScale+

XCKU11P-2FFVA1156I 属于 AMD Kintex UltraScale™ FPGA 家族&#xff0c;采用 TSMC 20 nm FinFET 工艺&#xff0c;兼顾高性能与功耗效率&#xff0c;提供约 653 100 个逻辑单元、2 928 个 DSP 切片、21.1 Mb Block RAM 和 22.5 Mb UltraRAM&#xff0c;可广泛应用于网络加速、…...

hadoop中的序列化和反序列化(4)

4. Hadoop的序列化 Hadoop提供了自己的序列化机制&#xff0c;用于高效地处理分布式计算中的数据传输。Hadoop的序列化机制比Java的序列化更高效&#xff0c;更适合大规模数据处理。 4.1 Hadoop序列化的特点 高效&#xff1a;Hadoop的序列化格式紧凑&#xff0c;适合大规模数…...

实现引用计数线程安全的shared_ptr

c11引入了三个智能指针&#xff0c;用来自动管理内存&#xff0c;使用智能指针可以有效地减少内存泄漏。 其中&#xff0c;shared_ptr是共享智能指针&#xff0c;可以被多次拷贝&#xff0c;拷贝时其内部的引用计数1&#xff0c;被销毁时引用计数-1&#xff0c;如果引用计数为…...

今日行情明日机会——20250507

指数今天放量上涨&#xff0c;政策层面也释放出重大利好消息~ 上证缺口已补&#xff0c;大盘股表现总体较好 深证60分钟缺口依然未补&#xff0c;等待后续走势~ 2025年5月7日涨停股主要行业方向分析 一、核心主线方向 军工&#xff08;政策催化地缘驱动&#xff09; • 涨停…...

配置Hadoop集群-测试使用

&#xff08;一&#xff09;上传小文件 上传文件的时候&#xff0c;我们传一个大一点的&#xff08;>128M&#xff09;&#xff0c;再传一个小一点的。对于大一点的文件&#xff0c;我们要去看看它是否会按128M为单位去拆分这个大文件&#xff0c;而拆分成大文件之后&#…...

MEGA3:分子进化遗传学分析和序列比对集成软件

李升伟 摘译 摘要 在分子进化和群体遗传学的理论基础稳固确立后&#xff0c;比较DNA和蛋白质序列分析在重建物种和多基因家族的进化历史、估计分子进化速率以及推断塑造基因和基因组进化的性质和程度方面发挥了核心作用。随着高通量测序技术和新颖的统计及计算方法的发展&…...

21. LangChain金融领域:合同审查与风险预警自动化

引言&#xff1a;当AI成为24小时不眠的法律顾问 2025年某商业银行的智能合同系统&#xff0c;将百万级合同审查时间从平均3周缩短至9分钟&#xff0c;风险条款识别准确率达98.7%。本文将基于LangChain的金融法律框架&#xff0c;详解如何构建合规、精准、可追溯的智能风控体系…...

7D-AI系列:模型微调之mlx-lm

大模型的出现&#xff0c;导致信息量太大&#xff0c;只有静心动手操作&#xff0c;才能得到真理。 文章目录 环境要求安装示例mlx-lm微调工具参数准备数据集下载模型微调模型合并模型验证结果验证微调前的模型验证微调后的模型 环境要求 macbook pro m系列芯片mlx环境已安装 …...

数据可视化:php+echarts实现数据可视化(包含echart安装引入)

一、实现效果 实现动态时间,多列柱状图,单列柱状图,普通表格,表格动画等效果 二、实现 1、动态时间显示 通过php获取当前时间 设置计时器来动态显示时间秒数 <!-- 时间动画 --> <script>// 动态更新时间中的秒数function updateTime() {const now = new D…...

《Python星球日记》 第47天:聚类与KMeans

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、聚类与…...

linux(centos)联网情况下部署

nginx部署 1.linux(centos)联网情况下部署 1.下载nginx所需依赖 # 安装开发工具组&#xff08;若未安装&#xff09; sudo yum groupinstall "Development Tools"# 安装 OpenSSL 开发包 sudo yum install openssl-devel# 安装 PCRE 开发包 sudo yum install pcre-…...

Kubernetes生产级资源管理实战:从QoS策略到OOM防御体系

一、资源限制的本质&#xff1a;不是成本控制&#xff0c;而是稳定性保障 当集群中某个节点的内存耗尽时&#xff0c;Kubernetes会像冷酷的交通警察一样&#xff0c;根据Pod的"优先级证件"&#xff08;QoS类别&#xff09;决定哪些Pod需要被驱逐。这种机制直接关系到…...

gcc的使用

gcc 是 GNU Compiler Collection&#xff08;GNU 编译器套件&#xff09;的缩写&#xff0c;是 GNU 项目开发的编程语言编译器集合&#xff0c;支持多种编程语言&#xff08;如 C、C、Objective-C、Fortran、Ada 等&#xff09;。以下是关于 gcc 的核心信息&#xff1a; 1. 主要…...

聊一聊Qwen3思考模式实现以及背后原理探讨

Qwen3思考模式切换实现 硬开关 我们先通过官方的示例代码来体验一下&#xff0c;如何实现在思考模式和非思考模式之间切换 通过tokenizer.apply_chat_template的enable_thinking参数来实现 默认情况下&#xff0c;Qwen3 启用了思考功能&#xff0c;类似于 QwQ-32B。这意味着…...

spark行动算子

在 Apache Spark 中&#xff0c;行动算子&#xff08;Action&#xff09;用于触发对 RDD 的实际计算&#xff0c;并将结果返回给驱动程序&#xff08;Driver&#xff09;或保存到外部存储系统中。与转换算子&#xff08;Transformation&#xff09;不同&#xff0c;行动算子会立…...

电商双十一美妆数据分析(代码)

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import jieba # 数据读取 df pd.read_csv(双十一_淘宝美妆数据.csv) # 数据清洗 # 处理重复值 data df.drop_duplicates(inplaceFalse) data data.reset_index(in…...

STM32裸机开发问题汇总

一、代码编写 1. keil中某个文件无法修改 keil中某个文件无法修改&#xff0c;不能输入_keil5 h文件无法修改-CSDN博客 2.编译报错declaration may not appear after executable statement in block STM32常见错误error: #268: declaration may not appear after executabl…...

C语言复习笔记--自定义类型

今天我们来复习一下自定义类型.自定义类型大概分为结构体,枚举,联合体,数组这几种.数组在之前就介绍过.今天我们来看下其他三种. 结构体 首先来看结构体. 结构体类型的声明 之前在操作符的地方简单认识过结构体.下面我们回顾一下. 结构体回顾 结构是⼀些值的集合&#xff0c;这…...

做 iOS 调试时,我尝试了 5 款抓包工具

日常做开发的人&#xff0c;特别是和客户端接口打交道的同学&#xff0c;应该对“抓包”这件事不陌生。 调试登录流程、分析接口格式、排查错误返回、分析网络性能、甚至研究第三方 App 的数据通信……说到底&#xff0c;都绕不开“抓 HTTPS 包”这一步。 而这一步&#xff0…...

html css js网页制作成品——HTML+CSS珠海网页设计网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

FID和IS的区别

&#x1f4ca; 生成模型评估&#xff1a;你选 IS 还是 FID&#xff1f; 在评估 GAN、Diffusion 等图像生成模型时&#xff0c;两个最常被提到的指标是&#xff1a; &#x1f539;IS (Inception Score) &#x1f539;FID (Frchet Inception Distance) &#x1f9e0; Inception…...

前端三大件--HTML

引言 在互联网的世界里&#xff0c;每一个绚丽多彩的网页背后&#xff0c;都离不开 HTML 的支撑。HTML&#xff08;Hyper Text Markup Language&#xff0c;超文本标记语言&#xff09;作为网页开发的基础语言&#xff0c;就像是搭建高楼大厦的砖块&#xff0c;是所有 Web 开发…...