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

JavaScript系列(89)--前端模块化工程详解

前端模块化工程详解 🧩

前端模块化是现代Web开发的核心理念之一,它帮助我们组织和管理日益复杂的前端代码。本文将详细探讨前端模块化工程的各个方面,从基础概念到实际应用。

模块化概述 🌟

💡 小知识:模块化是指将一个复杂的系统分解为独立的、可复用的模块。在前端开发中,模块化有助于提高代码的可维护性、可测试性和可重用性,同时促进团队协作和大型应用的开发。

模块化标准与演进 📈

// 1. CommonJS 规范
class CommonJSDemo {static explain() {return `// 导出模块module.exports = {method1: function() { return 'Hello World'; },method2: function(name) { return 'Hello ' + name; }};// 导入模块const myModule = require('./myModule');myModule.method1(); // "Hello World"`;}static advantages() {return ['简单易用,Node.js原生支持','同步加载,适合服务器环境','支持动态导入'];}static limitations() {return ['浏览器环境需要转译','同步加载可能影响性能','没有处理循环依赖的机制'];}
}// 2. AMD 规范
class AMDDemo {static explain() {return `// 定义模块define(['dependency1', 'dependency2'], function(dep1, dep2) {return {method: function() {return dep1.doSomething() + dep2.doSomethingElse();}};});// 使用模块require(['myModule'], function(myModule) {myModule.method();});`;}static advantages() {return ['异步加载,适合浏览器环境','支持依赖管理','RequireJS广泛实现'];}
}// 3. UMD 规范
class UMDDemo {static explain() {return `(function(root, factory) {if (typeof define === 'function' && define.amd) {// AMDdefine(['dependency'], factory);} else if (typeof exports === 'object') {// CommonJSmodule.exports = factory(require('dependency'));} else {// 浏览器全局变量root.myModule = factory(root.dependency);}}(this, function(dependency) {return {method: function() {return dependency.doSomething();}};}));`;}static purpose() {return '兼容多种模块系统,实现跨环境共享代码';}
}// 4. ES Modules
class ESModulesDemo {static explain() {return `// 导出export function method1() { return 'Hello World'; }export function method2(name) { return 'Hello ' + name; }export default class MyClass { /* ... */ }// 导入import MyClass, { method1, method2 } from './myModule.js';import * as myModule from './myModule.js';`;}static advantages() {return ['语言原生支持','静态分析可优化打包','支持命名导出和默认导出','支持异步加载:import()','支持树摇(Tree Shaking)'];}static dynamicImport() {return `// 动态导入button.addEventListener('click', async () => {const module = await import('./dynamicModule.js');module.doSomething();});`;}
}

模块化工程实践 🛠️

// 1. 模块组织策略
class ModuleOrganization {static byFeature() {return {structure: `├── src/│   ├── auth/                  # 认证功能模块│   │   ├── components/        # 组件│   │   ├── services/          # 服务│   │   ├── store/             # 状态管理│   │   ├── utils/             # 工具函数│   │   └── index.js           # 模块入口│   ├── dashboard/             # 仪表盘功能模块│   │   ├── components/│   │   ├── services/│   │   └── index.js│   └── app.js                 # 应用入口`,advantages: ['功能内聚,便于理解和维护','团队协作时责任清晰','可以实现功能级别的代码分割']};}static byType() {return {structure: `├── src/│   ├── components/            # 所有组件│   │   ├── auth/│   │   ├── dashboard/│   │   └── shared/│   ├── services/              # 所有服务│   │   ├── auth.service.js│   │   └── user.service.js│   ├── store/                 # 状态管理│   │   ├── auth.store.js│   │   └── user.store.js│   └── app.js                 # 应用入口`,advantages: ['类型明确,易于找到特定类型文件','适合小到中型项目','减少入手学习时间']};}static hybrid() {return {structure: `├── src/│   ├── features/              # 按功能组织核心模块│   │   ├── auth/│   │   └── dashboard/│   ├── shared/                # 共享资源│   │   ├── components/│   │   ├── services/│   │   └── utils/│   └── app.js                 # 应用入口`,advantages: ['结合两种方法的优点','保持功能内聚的同时便于共享资源','可扩展性强,适合大型项目']};}
}// 2. 模块导入导出最佳实践
class ModulePatterns {static barrelExports() {return `// 桶文件 (barrel file) - components/index.jsexport { default as Button } from './Button';export { default as Input } from './Input';export { default as Modal } from './Modal';// 使用组件import { Button, Input, Modal } from './components';`;}static apiExports() {return `// api.js - 模块公共接口import { internalFunction1, internalFunction2 } from './internal';// 只导出需要暴露的APIexport function publicMethod1() {return internalFunction1();}export function publicMethod2(data) {return internalFunction2(data);}`;}static lazyLoading() {return `// React中的代码分割和懒加载import React, { Suspense, lazy } from 'react';const LazyComponent = lazy(() => import('./LazyComponent'));function MyComponent() {return (<Suspense fallback={<div>Loading...</div>}><LazyComponent /></Suspense>);}`;}
}// 3. 依赖管理
class DependencyManagement {static packageManagement() {return `// package.json{"name": "my-module","version": "1.0.0","dependencies": {"some-package": "^2.0.0"},"peerDependencies": {"react": ">=16.8.0","react-dom": ">=16.8.0"},"devDependencies": {"webpack": "^5.0.0"}}`;}static monorepoStructure() {return `// 使用Lerna的monorepo结构├── packages/│   ├── core/                      # 核心模块│   │   ├── package.json│   │   └── src/│   ├── ui/                        # UI组件库│   │   ├── package.json│   │   └── src/│   └── utils/                     # 工具函数│       ├── package.json│       └── src/├── lerna.json                     # Lerna配置└── package.json                   # 根package.json`;}static importCycles() {return {problem: `// moduleA.jsimport { functionB } from './moduleB';export function functionA() { return functionB() + 1; }// moduleB.jsimport { functionA } from './moduleA';export function functionB() { return functionA() + 1; }// 这会导致无限递归`,solution: `// 重构为单向依赖// shared.jsexport function baseFunction() { return 1; }// moduleA.jsimport { baseFunction } from './shared';export function functionA() { return baseFunction() + 1; }// moduleB.jsimport { baseFunction } from './shared';export function functionB() { return baseFunction() + 2; }`};}
}

构建工具与模块打包 🔨

// 1. Webpack模块打包
class WebpackModuleBundling {static configuration() {return `// webpack.config.jsconst path = require('path');module.exports = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'bundle.js'},module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader'}}]},optimization: {splitChunks: {chunks: 'all'}}};`;}static codeSplitting() {return `// 动态导入实现代码分割import(/* webpackChunkName: "chart" */ './chart').then(module => {module.renderChart();});`;}static treeShaking() {return {explanation: '移除未使用的代码,减小包体积',config: `// webpack.config.jsmodule.exports = {mode: 'production',optimization: {usedExports: true}};`,usage: `// 只导入需要的模块import { Button } from 'ui-library'; // 而不是 import UILibrary from 'ui-library'`};}
}// 2. Rollup模块打包
class RollupModuleBundling {static configuration() {return `// rollup.config.jsimport resolve from '@rollup/plugin-node-resolve';import commonjs from '@rollup/plugin-commonjs';export default {input: 'src/main.js',output: {file: 'bundle.js',format: 'esm',sourcemap: true},plugins: [resolve(),commonjs()]};`;}static multipleOutputs() {return `// rollup.config.jsexport default {input: 'src/main.js',output: [{file: 'dist/bundle.esm.js',format: 'esm'},{file: 'dist/bundle.cjs.js',format: 'cjs'},{name: 'MyLibrary',file: 'dist/bundle.umd.js',format: 'umd'}]};`;}
}// 3. ESBuild和SWC
class ModernBundlers {static esbuildConfig() {return `// esbuild.config.jsconst esbuild = require('esbuild');esbuild.build({entryPoints: ['src/index.js'],bundle: true,minify: true,splitting: true,format: 'esm',outdir: 'dist'}).catch(() => process.exit(1));`;}static swcConfig() {return `// .swcrc{"jsc": {"parser": {"syntax": "ecmascript","jsx": true},"transform": {"react": {"pragma": "React.createElement","pragmaFrag": "React.Fragment","throwIfNamespace": true,"development": false,"useBuiltins": false}}},"minify": true}`;}static comparisonTable() {return [{tool: 'Webpack',pros: '生态丰富,功能强大',cons: '配置复杂,构建慢',bestFor: '大型项目,需要丰富插件支持'},{tool: 'Rollup',pros: '输出干净,tree-shaking好',cons: '动态导入支持弱',bestFor: '库和框架开发'},{tool: 'ESBuild',pros: '极速构建,低配置',cons: '插件生态弱',bestFor: '项目性能优先'},{tool: 'SWC',pros: 'Rust编写,性能高',cons: '相对新,稳定性待验证',bestFor: '追求编译速度的项目'}];}
}

实战应用示例 🚀

// 1. 组件库模块化设计
class UILibraryModular {constructor() {this.components = {};}// 按需加载组件async loadComponent(name) {if (!this.components[name]) {// 动态导入this.components[name] = await import(`./components/${name}`);}return this.components[name].default;}// 批量注册组件 (Vue示例)registerAll(Vue) {const requireComponent = require.context('./components',false,/Base[A-Z]\w+\.(vue|js)$/);requireComponent.keys().forEach(fileName => {const componentConfig = requireComponent(fileName);const componentName = fileName.split('/').pop().replace(/\.\w+$/, '');Vue.component(componentName,componentConfig.default || componentConfig);});}// 导出组件映射static getComponentMap() {return `// components/index.jsexport { default as Button } from './Button';export { default as Input } from './Input';export { default as Form } from './Form';export { default as Table } from './Table';// 在打包时可以利用tree-shaking移除未使用组件`;}
}// 2. 微前端架构模块化
class MicroFrontendModular {static appStructure() {return `├── container/                 # 容器应用│   ├── package.json│   └── src/├── app1/                      # 微应用1│   ├── package.json│   └── src/├── app2/                      # 微应用2│   ├── package.json│   └── src/└── shared/                    # 共享库├── package.json└── src/`;}static federationConfig() {return `// webpack.config.js (容器应用)const { ModuleFederationPlugin } = require('webpack').container;module.exports = {// ...plugins: [new ModuleFederationPlugin({name: 'container',remotes: {app1: 'app1@http://localhost:3001/remoteEntry.js',app2: 'app2@http://localhost:3002/remoteEntry.js'},shared: ['react', 'react-dom']})]};// 使用远程模块const RemoteApp = React.lazy(() => import('app1/App'));`;}
}// 3. 大型应用模块化重构
class LargeAppRefactoring {static monolithToModular() {return {steps: ['1. 识别功能边界与模块','2. 提取公共功能到共享模块','3. 定义模块间接口','4. 增量迁移,先保持兼容','5. 搭建模块化构建系统','6. 建立模块化测试体系','7. 完成迁移后清理过渡代码'],example: `// 重构前 (单一文件)function createUser() { /* ... */ }function updateUser() { /* ... */ }function validateEmail() { /* ... */ }function sendEmail() { /* ... */ }// 重构后 (模块化)// user.service.jsimport { validateEmail } from './validation.service';export function createUser() { /* 使用validateEmail */ }export function updateUser() { /* ... */ }// validation.service.jsexport function validateEmail() { /* ... */ }// email.service.jsexport function sendEmail() { /* ... */ }`};}static incrementalMigration() {return `// 第一步: 保持兼容性的模块化// legacy.js (旧文件)import * as userService from './user.service';// 导出旧API以保持兼容export function createUser() {return userService.createUser();}export function updateUser() {return userService.updateUser();}// 在新代码中:import { createUser } from './user.service';// 在旧代码中:import { createUser } from './legacy';`;}
}

测试与质量保障 🔍

// 1. 模块化测试策略
class ModuleTestStrategy {static unitTesting() {return `// math.jsexport function add(a, b) {return a + b;}export function subtract(a, b) {return a - b;}// math.test.jsimport { add, subtract } from './math';describe('Math module', () => {test('adds two numbers correctly', () => {expect(add(1, 2)).toBe(3);});test('subtracts two numbers correctly', () => {expect(subtract(5, 2)).toBe(3);});});`;}static mocking() {return `// userService.jsimport api from './api';export async function getUser(id) {const response = await api.get(\`/users/\${id}\`);return response.data;}// userService.test.jsimport { getUser } from './userService';import api from './api';// 模拟API模块jest.mock('./api');test('fetches user correctly', async () => {// 设置模拟返回值api.get.mockResolvedValue({data: { id: 1, name: 'John' }});const user = await getUser(1);expect(api.get).toHaveBeenCalledWith('/users/1');expect(user).toEqual({ id: 1, name: 'John' });});`;}static integrationTesting() {return `// React组件集成测试import { render, screen, fireEvent } from '@testing-library/react';import UserForm from './UserForm';import UserService from './UserService';// 模拟UserServicejest.mock('./UserService');test('form submits user data', async () => {UserService.createUser.mockResolvedValue({ id: 1 });render(<UserForm />);fireEvent.change(screen.getByLabelText('Name'), {target: { value: 'John Doe' }});fireEvent.click(screen.getByText('Submit'));expect(UserService.createUser).toHaveBeenCalledWith({name: 'John Doe'});});`;}
}// 2. 模块文档化
class ModuleDocumentation {static jsdoc() {return `/*** 用户服务模块* @module services/user*//*** 用户对象* @typedef {Object} User* @property {number} id - 用户ID* @property {string} name - 用户名* @property {string} email - 电子邮件*//*** 创建新用户* @param {Object} userData - 用户数据* @param {string} userData.name - 用户名* @param {string} userData.email - 电子邮件* @returns {Promise<User>} 新创建的用户*/export async function createUser(userData) {// 实现...}`;}static typescriptTypes() {return `// types.tsexport interface User {id: number;name: string;email: string;}// userService.tsimport { User } from './types';export async function createUser(userData: Omit<User, 'id'>): Promise<User> {// 实现...}export async function getUser(id: number): Promise<User> {// 实现...}`;}static storybook() {return `// Button.stories.jsimport { Button } from './Button';export default {title: 'Components/Button',component: Button,argTypes: {variant: {control: { type: 'select', options: ['primary', 'secondary'] }}}};export const Primary = {args: {variant: 'primary',label: 'Button'}};export const Secondary = {args: {variant: 'secondary',label: 'Button'}};`;}
}

最佳实践总结 ⭐

// 模块化最佳实践
class ModularBestPractices {static designTips() {return ['1. 遵循单一职责原则,每个模块只做一件事','2. 保持模块API简洁明确,定义清晰的公共接口','3. 避免模块间的循环依赖','4. 使用显式依赖,避免隐式依赖全局变量','5. 关注模块大小,过大的模块考虑拆分','6. 合理使用默认导出和命名导出','7. 封装内部实现,只暴露必要接口','8. 考虑使用"桶文件"(barrel files)组织导出'];}static namingConventions() {return {files: '使用kebab-case或camelCase命名文件',modules: '模块名应反映其功能和职责',exports: '导出的函数和类使用驼峰命名法',constants: '常量使用大写字母和下划线'};}static performanceTips() {return ['1. 按需导入,避免导入整个库','2. 利用动态导入实现代码分割','3. 使用tree-shaking优化库导入','4. 实现模块预加载和缓存策略','5. 考虑模块间通信的性能成本'];}static teamCollaboration() {return ['1. 制定并遵循统一的模块化规范','2. 建立模块责任人机制','3. 通过代码评审确保模块质量','4. 撰写完整的模块文档和示例','5. 搭建模块展示平台便于复用'];}
}

结语 📝

前端模块化工程是现代Web开发的基石,掌握它可以帮助我们构建更加可维护、可扩展的应用。我们学习了:

  1. 模块化标准的发展历程与各自特点
  2. 模块组织策略与最佳实践
  3. 依赖管理和循环依赖处理
  4. 各种构建工具的模块打包方式
  5. 实战应用场景和重构策略
  6. 模块化测试与文档化方法

💡 学习建议:

  1. 从小型项目开始实践模块化
  2. 学习主流框架的模块化实现
  3. 关注模块化相关工具的更新
  4. 实践不同的模块组织策略,找到适合团队的方案
  5. 在实战中不断优化模块间的关系和依赖

如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

相关文章:

JavaScript系列(89)--前端模块化工程详解

前端模块化工程详解 &#x1f9e9; 前端模块化是现代Web开发的核心理念之一&#xff0c;它帮助我们组织和管理日益复杂的前端代码。本文将详细探讨前端模块化工程的各个方面&#xff0c;从基础概念到实际应用。 模块化概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;模…...

PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 TIFF

TIFF文件是高质量图像的首选。它们广泛用于印刷、存档和图形设计。企业通常需要转换PDF文档以获得更好的兼容性。了解如何以编程方式执行此转换可以节省时间和资源。在这篇教程中&#xff0c;我们将探讨如何使用 Python 将 PDF 转换为 TIFF。 本文涵盖以下主题&#xff1a; P…...

【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)

本文项目编号 T 219 &#xff0c;文末自助获取源码 \color{red}{T219&#xff0c;文末自助获取源码} T219&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,加密压缩,带有压缩进度

前言 最近在做项目时遇到一个需求&#xff0c;需要将升级的文件压缩成zip&#xff0c;再进行传输&#xff1b; 通过网络调研&#xff0c;有许多方式可以实现&#xff0c;例如QT私有模块的ZipReader、QZipWriter&#xff1b;或者第三方库zlib或者libzip或者quazip等&#xff1…...

【GO】学习笔记

目录 学习链接 开发环境 开发工具 GVM - GO多版本部署 GOPATH 与 go.mod go常用命令 环境初始化 编译与运行 GDB -- GNU 调试器 基本语法与字符类型 关键字与标识符 格式化占位符 基本语法 初始值&零值&默认值 变量声明与赋值 _ 下划线的用法 字…...

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

官方网站 官方网址&#xff1a;etcd 二进制包下载&#xff1a;Install | etcd GitHub社区项目&#xff1a;etcd-io GitHub GitHub社区项目版本历史&#xff1a;Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...

港科大提出开放全曲音乐生成基础模型YuE:可将歌词转换成完整歌曲

YuE是港科大提出的一个开源的音乐生成基础模型&#xff0c;专为音乐生成而设计&#xff0c;专门用于将歌词转换成完整的歌曲&#xff08;lyrics2song&#xff09;。它可以生成一首完整的歌曲&#xff0c;时长几分钟&#xff0c;包括朗朗上口的声乐曲目和伴奏曲目。YuE 能够模拟…...

Hive从入门到运用

hive简介 hive的设计思想&#xff08;本质是一个翻译器&#xff09; 上传安装包 解压&#xff0c;查看 运行hive&#xff08;一定要启动hadoop&#xff0c;是有依赖关系的。&#xff09; 测试启动方法&#xff0c;和建表 文件创建很上传到hdfs&#xff0c;直接上传到hive表的目…...

unity学习55:按钮 button

目录 1 按钮 button 1.1 按钮button 其实就是一个组合体 1.2 测试按钮&#xff0c;在UI中添加1个按钮 1.3 按钮的属性 2 按钮的图片属性 3 按钮的变换 transition 3.1 按颜色变换 3.2 按图片精灵变换 3.3 按动画变换 4 按钮的导航 5 按钮的事件和脚本 1 按钮 …...

《论基于构件的软件开发方法及其应用》审题技巧 - 系统架构设计师

软考论文写作框架&#xff1a;基于构件的软件开发方法及其应用 一、考点概述 本论题“基于构件的软件开发方法及其应用”主要考察的是软件工程专业中关于基于构件开发&#xff08;CBSD&#xff09;的深入理解与实践应用。考点涵盖以下几个方面&#xff1a; 首先&#xff0c;…...

穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路

回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...

java23种设计模式-命令模式

命令模式&#xff08;Command Pattern&#xff09;学习笔记 1. 模式定义 行为型设计模式&#xff0c;将请求封装为对象&#xff0c;使请求的发送者与接收者解耦。支持请求的排队、记录、撤销/重做等操作。 2. 适用场景 ✅ 需要将操作参数化 ✅ 需要支持事务操作&#xff08…...

交流异步电动机PI双闭环SVPWM矢量控制Simulink

关注微♥“电机小子程高兴的MATLAB小屋”获取专属优惠 1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.仿真算法&#xff1a; (…...

利用 Open3D 保存并载入相机视角的简单示例

1. 前言 在使用 Open3D 进行三维可视化和点云处理时&#xff0c;有时需要将当前的视角&#xff08;Camera Viewpoint&#xff09;保存下来&#xff0c;以便下次再次打开时能够还原到同样的视角。本文将演示如何在最新的 Open3D GUI 界面&#xff08;o3d.visualization.gui / o…...

kiln微调大模型-使用deepseek R1去训练一个你的具备推理能力的chatGPT 4o

前言 随着deepseek的爆火&#xff0c;对于LLM的各种内容也逐渐步入我的视野&#xff0c;我个人认为&#xff0c;可能未来很长一段时间&#xff0c;AI将持续爆火&#xff0c;进入一段时间的井喷期&#xff0c;AI也会慢慢的走入我们每个家庭之中&#xff0c;为我们的生活提供便利…...

《从Kokoro看开源语音模型的“无限可能”》:此文为AI自动生成

开源语音模型 Kokoro 是一款轻量级、高性能的文本转语音(TTS)模型,以下是关于它的详细介绍: 核心优势 卓越的音质:即使参数规模仅 8200 万,也能生成自然流畅、富有表现力的语音。轻量高效:占用资源少,运行速度快,在 CPU 上即可实现近乎实时的语音生成,在 GPU 端则能…...

Spring 事务和事务传播机制(详解)

1 .事务 1.1.什么是事务&#xff1f; 事务是一组操作的集合,是不可分割的操作 事务作为一个整体&#xff0c;要不同时完成&#xff0c;要不同时失败 1.2什么时候需要事务&#xff1f; 关于金钱的操作基本都会有事务 例如转账操作&#xff1a; 第一步 A账号 - 500元第二步 B账…...

Innodb MVCC实现原理

什么是MVCC? MVCC全称多版本并发控制&#xff0c;是在并发访问数据库时对操作数据做多版本管理&#xff0c;避免因为写数据时要加写锁而阻塞读取数据的请求问题。 Innodb对mvcc的实现 1、事务版本号 每次事务开启前都会从数据库获得一个自增长的事务ID&#xff0c;可以从事…...

【网络编程】网络套接字和使用案例

一、为什么大多数网络编程使用套接字 在网络编程中&#xff0c;套接字 (socket) 是最常用的接口&#xff0c;但并不是所有的底层通信都依赖于套接字。尽管如此&#xff0c;绝大多数网络应用&#xff08;特别是在操作系统层面&#xff09;都使用套接字进行通信&#xff0c;因为…...

【Java企业生态系统的演进】从单体J2EE到云原生微服务

Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进&#xff1a;从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进&#xff1a;从原始Java到Spring Cloud2.1 原始Java阶段&#xff08;1995-1999&#xff09;2.2 J2EE阶段&#x…...

【爬虫基础】第二部分 爬虫基础理论 P1/3

上节内容回顾&#xff1a;【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 爬虫相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff…...

第2章_保护您的第一个应用程序

第2章_保护您的第一个应用程序 在本章中&#xff0c;您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣&#xff0c;您将运行的示例应用程序由两部分组成&#xff0c;前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证&#xff0…...

山东大学软件学院人工智能导论实验之知识库推理

目录 实验目的&#xff1a; 实验代码&#xff1a; 实验内容&#xff1a; 实验结果 实验目的&#xff1a; 输入相应的条件&#xff0c;根据知识库推理得出相应的知识。 实验代码&#xff1a; def find_data(input_process_data_list):for epoch, data_process in enumerat…...

Java 网络协议面试题答案整理,最新面试题

TCP和UDP的主要区别是什么&#xff1f; TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;的主要区别在于TCP是面向连接的协议&#xff0c;而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。 1、连接…...

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后&#xff0c;安装的时候没选择其他硬盘&#xff0c;虚拟磁盘也在c盘会占用很大的空间&#xff0c;像我的就三十多个G&#xff0c;把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...

AOP进阶-02.通知顺序

一.通知顺序 当有多个切面类中的切入点表达式一样时&#xff0c;这些切面类的执行顺序是怎样的呢&#xff1f;如图我们将定义两个切面类&#xff0c;一个MyAspect2&#xff0c;一个MyAspect3&#xff0c;一个MyAspect4。执行后我们发现&#xff0c; 对于目标方法前的通知方法&…...

${sym} 与 String(sym) 的区别

在 JavaScript 中&#xff0c;${sym}&#xff08;模板字符串插值&#xff09;和 String(sym)&#xff08;显式类型转换&#xff09;虽然都涉及将值转换为字符串&#xff0c;但它们的底层逻辑和行为存在显著差异&#xff0c;尤其是在处理 Symbol 等特殊类型时。以下是具体对比&a…...

sglang框架源码笔记

文章目录 整体架构1. **客户端&#xff08;Client&#xff09;**&#xff1a;2. **服务器端&#xff08;Server&#xff09;**&#xff1a;3. **调度器与模型工作节点&#xff08;Scheduler & Model Worker&#xff09;**&#xff1a; TpModelWorker类ModelRunner类TpModel…...

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法&#xff08;Chaotic Evolution Optimization, CEO&#xff09;是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…...

uake 网络安全 reverse网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文首发于“合天网安实验室” 首先从PEID的算法分析插件来介绍&#xff0c;要知道不管是在CTF竞赛的REVERSE题目中&#xff0c;还是在实际的商业产品中&#xf…...

C语言实现单链表

单链表是数据结构中最基础的链式结构,它不按照线性的顺序存储数据,而是由若干个同一结构类型的“节点”依次串联而成的,即每一个节点里保存着下一个节点的地址(指针)。 上图中,一个表头变量head是用来存储链表首节点的地址,链表中每个节点有data(数据)部分和n…...

Rk3568驱动开发_点亮led灯代码完善(手动挡)_6

1.实现思路&#xff1a; 应用层打开设备后通过write函数向内核中写值&#xff0c;1代表要打开灯&#xff0c;0代表要关闭灯 Linux配置gpio和控制gpio多了一个虚拟内存映射操作 2.注意事项&#xff1a; 配置和读写操作的时候要谨慎&#xff0c;比如先关掉gpio再注销掉虚拟内存…...

threejs:document.createElement创建标签后css设置失效

vue3threejs&#xff0c;做一个给模型批量CSS2D标签的案例&#xff0c;在导入模型的js文件里&#xff0c;跟着课程写的代码如下&#xff1a; import * as THREE from three; // 引入gltf模型加载库GLTFLoader.js import { GLTFLoader } from three/addons/loaders/GLTFLoader.…...

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…...

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通过编写提示词&#xff0c;辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多&#xff0c;流量分析的需求多种多样&#xff0c;…...

Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合

概述 实时目标检测对于许多实际应用来说已经变得至关重要&#xff0c;而Ultralytics公司开发的YOLO&#xff08;You Only Look Once&#xff0c;只看一次&#xff09;系列一直是最先进的模型系列&#xff0c;在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...

一个行为类似标准库find算法的模板

函数需要两个模板类型参数&#xff0c;一个表示函数的迭代器参数&#xff0c;另一个表示值的类型。 代码 #include<iostream> #include<string> #include<vector> #include<list>using namespace std;template <typename IterType,typename T>…...

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09;针对全桥LLC拓扑&#xff0c;利用Matlab软件搭建模型&#xff0c;分别对轻载&#xf…...

Elasticsearch 的分布式架构原理:通俗易懂版

Elasticsearch 的分布式架构原理&#xff1a;通俗易懂版 Lucene 和 Elasticsearch 的前世今生 Lucene 是一个功能强大的搜索库&#xff0c;提供了高效的全文检索能力。然而&#xff0c;直接基于 Lucene 开发非常复杂&#xff0c;即使是简单的功能也需要编写大量的 Java 代码&…...

[深度学习]基于C++和onnxruntime部署yolov12的onnx模型

基于C和ONNX Runtime部署YOLOv12的ONNX模型&#xff0c;可以遵循以下步骤&#xff1a; 准备环境&#xff1a;首先&#xff0c;确保已经下载后指定版本opencv和onnruntime的C库。 模型转换&#xff1a; 安装好yolov12环境并将YOLOv12模型转换为ONNX格式。这通常涉及使用深度学习…...

seacmsv9报错注入

1、seacms的介绍 ​ seacms中文名&#xff1a;海洋影视管理系统。是一个采用了php5mysql架构的影视网站框架&#xff0c;因此&#xff0c;如果该框架有漏洞&#xff0c;那使用了该框架的各个网站都会有相同问题。 2、源码的分析 漏洞的部分源码如下&#xff1a; <?php …...

剑指 Offer II 033. 变位词组

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20033.%20%E5%8F%98%E4%BD%8D%E8%AF%8D%E7%BB%84/README.md 剑指 Offer II 033. 变位词组 题目描述 给定一个字符串数组 strs &#xff0c;将 变位词 组合在一起…...

【2025全网最新最全】前端Vue3框架的搭建及工程目录详解

文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/ 安装完成后&#xff0c;打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…...

前缀和专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》

目录 一、0求和 - 蓝桥云课 算法代码&#xff1a; 代码思路概述 代码详细解释 数组定义 输入读取 前缀和计算部分 结果计算部分 输出结果 程序结束 总结 二、1.可获得的最小取值 - 蓝桥云课 算法代码&#xff1a; 代码思路概述 详细代码逻辑解释 输入初始化 …...

1.测试策略与计划设计指南

1.介绍 1.1项目介绍 完整项目组成&#xff1a;1.基于K8S定制开发的SaaS平台&#xff1b;2.多个团队提供的中台服务(微服务)&#xff1b;3.多个业务团队开发的系统平台。涉及多个项目团队、上百个微服务组件。 测试在所有团队开发测试后&#xff0c;自己搭建测试环境&#xff0c…...

pikachu

暴力破解 基于表单的暴力破解 【2024版】最新BurpSuit的使用教程&#xff08;非常详细&#xff09;零基础入门到精通&#xff0c;看一篇就够了&#xff01;让你挖洞事半功倍&#xff01;_burpsuite使用教程-CSDN博客 登录页面&#xff0c;随意输入抓包&#xff0c;发送到攻击…...

HDFS扩缩容及数据迁移

1.黑白名单机制 在HDFS中可以通过黑名单、白名单机制进行节点管理&#xff0c;决定数据可以复制/不可以复制到哪些节点。 黑名单通常是指在HDFS中被标记为不可用或不可访问的节点列表&#xff0c;这些节点可能由于硬件故障、网络问题或其他原因而暂时或永久性地无法使用。当一…...

设计模式-(状态模式,策略模式,代理模式,责任链模式)

状态模式 概念&#xff1a; 用于管理一个对象在不同状态下的行为变化。它允许对象在内部状态改变时改变其行为&#xff0c;从而让对象看起来像是改变了其类。状态模式的核心思想是将状态封装到独立的类中&#xff0c;每个状态类都定义了在该状态下对象的行为 状态模式主要涉…...

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…...