前端模块化开发:从面条代码到结构化代码的蜕变

前端模块化开发:从面条代码到结构化代码的蜕变

毒舌时刻

模块化开发?不就是把代码分成几个文件嘛,有什么大不了的?我见过很多所谓的模块化代码,其实就是把一堆函数随便塞进不同的文件里,根本没有任何结构可言。

你以为把代码分成模块就万事大吉了?别天真了!如果你的模块设计不合理,反而会让代码变得更加混乱。比如那些互相依赖的模块,就像一团乱麻,让你根本理不清头绪。

为什么你需要这个

  1. 代码可维护性:模块化代码结构清晰,易于理解和维护,当需要修改某个功能时,只需要修改对应的模块即可。
  2. 代码复用:模块化可以让你在不同的项目中复用相同的代码,减少重复开发的工作量。
  3. 团队协作:模块化可以让不同的开发者负责不同的模块,减少代码冲突和沟通成本。
  4. 性能优化:模块化可以帮助你实现代码分割,减少初始加载时间,提高应用的性能。

反面教材

// 这是一个典型的面条代码 let users = []; let products = []; function fetchUsers() { fetch('https://api.example.com/users') .then(response => response.json()) .then(data => { users = data; renderUsers(); }); } function fetchProducts() { fetch('https://api.example.com/products') .then(response => response.json()) .then(data => { products = data; renderProducts(); }); } function renderUsers() { const userList = document.getElementById('user-list'); userList.innerHTML = ''; users.forEach(user => {matter what he wrote const li = document.createElement('li'); li.textContent = user.name; userList.appendChild(li); }); } function renderProducts() { const productList = document.getElementById('product-list'); productList.innerHTML = ''; products.forEach(product => { const li = document.createElement('li'); li.textContent = product.name; productList.appendChild(li); }); } // 调用函数 fetchUsers(); fetchProducts(); 

问题

  • 所有代码都在一个文件中,随着功能增加,代码量会变得非常庞大
  • 变量和函数都是全局的,容易产生命名冲突
  • 代码逻辑混乱,难以理解和维护
  • 无法实现代码复用

正确的做法

ES6模块

// api.js - 负责API调用 const API_BASE_URL = 'https://api.example.com'; export async function fetchUsers() { const response = await fetch(`${API_BASE_URL}/users`); return response.json(); } export async function fetchProducts() { const response = await fetch(`${API_BASE_URL}/products`); return response.json(); } 
// render.js - 负责渲染 import { fetchUsers, fetchProducts } from './api.js'; export function renderUsers(users) { const userList = document.getElementById('user-list'); userList.innerHTML = ''; users.forEach(user => { const li = document.createElement('li'); li.textContent = user.name; userList.appendChild(li); }); } export function renderProducts(products) { const productList = document.getElementById('product-list'); productList.innerHTML = ''; products.forEach(product => { const li = document.createElement('li'); li.textContent = product.name; productList.appendChild(li); }); } 
// app.js - 主应用 import { fetchUsers, fetchProducts } from './api.js'; import { renderUsers, renderProducts } from './render.js'; async function init() { try { const [users, products] = await Promise.all([ fetchUsers(), fetchProducts() ]); renderUsers(users); renderProducts(products); } catch (error) { console.error('Error initializing app:', error); } } init(); 

CommonJS模块

// api.js - 负责API调用 const API_BASE_URL = 'https://api.example.com'; async function fetchUsers() { const response = await fetch(`${API_BASE_URL}/users`); return response.json(); } async function fetchProducts() { const response = await fetch(`${API_BASE_URL}/products`); return response.json(); } module.exports = { fetchUsers, fetchProducts }; 
// render.js - 负责渲染 function renderUsers(users) { const userList = document.getElementById('user-list'); userList.innerHTML = ''; users.forEach(user => { const li = document.createElement('li'); li.textContent = user.name; userList.appendChild(li); }); } function renderProducts(products) { const productList = document.getElementById('product-list'); productList.innerHTML = ''; products.forEach(product => { const li = document.createElement('li'); li.textContent = product.name; productList.appendChild(li); }); } module.exports = { renderUsers, renderProducts }; 
// app.js - 主应用 const { fetchUsers, fetchProducts } = require('./api.js'); const { renderUsers, renderProducts } = require('./render.js'); async function init() { try { const [users, products] = await Promise.all([ fetchUsers(), fetchProducts() ]); renderUsers(users); renderProducts(products); } catch (error) { console.error('Error initializing app:', error); } } init(); 

模块化的最佳实践

  1. 单一职责原则:每个模块只负责一个功能,避免模块过大或职责过多。
  2. 依赖管理:合理管理模块间的依赖关系,避免循环依赖。
  3. 命名规范:使用清晰的命名规范,让模块的用途一目了然。
  4. 文档:为模块添加适当的文档,说明模块的用途、参数和返回值。
  5. 测试:为每个模块编写测试,确保模块的功能正确。

毒舌点评

模块化开发确实是前端开发的重要实践,但我见过太多开发者滥用模块化,把简单的功能拆分成无数个小模块,结果导致代码结构变得更加复杂。

想象一下,当你需要修改一个简单的功能时,你需要在多个文件之间来回跳转,这真的提高了开发效率吗?

还有那些过度设计的模块,为了所谓的模块化而模块化,结果导致代码变得更加难以理解。比如一个只有几行代码的功能,也要拆分成多个模块,这纯粹是浪费时间。

所以,在进行模块化开发时,一定要把握好度。不要为了模块化而模块化,要根据实际情况来决定模块的大小和数量。

当然,对于大型项目来说,模块化是必不可少的。但对于小型项目,过度的模块化反而会增加开发成本。所以,在决定是否使用模块化时,要根据项目的规模和复杂度来决定。

最后,记住一句话:模块化的目的是为了提高代码的可维护性和复用性,而不是为了炫技。如果你的模块化代码比非模块化代码更难理解,那你就失败了。

Read more

黑马程序员java web学习笔记--后端进阶(二)SpringBoot原理

目录 1 配置优先级 2 Bean的管理 2.1 Bean的作用域 2.2 第三方Bean 3 SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 实现方案 3.2.2 原理分析 3.2.3 自定义starter 1 配置优先级 SpringBoot项目当中支持的三类配置文件: * application.properties * application.yml ❤ * application.yaml 配置文件优先级排名(从高到低):properties配置文件 > yml配置文件 > yaml配置文件 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置。

【白话前端 09】HTML网页结构搭建:从语义化标签到整站规划

早期写网页,前端只有一个容器标签可用:<div>。 结果就是页面里堆叠了几百个 <div>。人眼能通过 CSS 样式看出哪里是头部、哪里是侧边栏。但对于搜索引擎爬虫、或是视障者的屏幕阅读器来说,这只是一坨没有主次的文本碎片。机器根本不知道 <div> 这几个英文字母代表核心内容。 HTML5 引入 <header>、<main> 等语义化标签,本质不是为了给页面换个长相,而是给网页写一份“机器能看懂的结构说明书”。 当把核心代码放进 <main>,把底部备案信息扔进 <footer>,爬虫一进来就明确知道:“抓取有效信息直接去 <main> 里找,底部的东西可以直接跳过。”这就是语义化的底层价值。 本文不背概念,

手把手|VSCode搭建Claude编程环境,低成本用AI写代码

手把手|VSCode搭建Claude编程环境,低成本用AI写代码

📌 教程前言 作为海南大学大一学生,从零开始搞定VSCode调用AI写代码、做UI,全程无复杂操作,跟着步骤走就能成功。避开报错坑、网络坑、扣费坑,低成本用上高效AI编程工具,新手也能一次通关。 ✅ 前期准备 * 电脑系统:Windows(本教程适配Windows环境) * 提前装好:VSCode编辑器、Node.js(版本v24.14.0即可) * 备好手机号(用于DeepSeek平台注册) * 备用:网络环境稳定,避免安装卡顿 🔧 步骤一:全局安装Claude命令行工具 1. 按下Win+X,打开Windows PowerShell,先检查Node版本,确认已安装 (安装地址https://nodejs.org/en) node-v 2. 执行安装命令,切记不要打错包名,少字母会直接报错 npminstall-g @anthropic-ai/claude-code 3. 等待安装完成,

前端代码质量保证:让你的代码更可靠

前端代码质量保证:让你的代码更可靠 毒舌时刻 代码质量?听起来就像是前端工程师为了显得自己很专业而特意搞的一套复杂流程。你以为随便写几个测试就能保证代码质量?别做梦了!到时候你会发现,测试代码比业务代码还多,维护起来比业务代码还麻烦。 你以为ESLint能解决所有问题?别天真了!ESLint只能检查代码风格,无法检查逻辑错误。还有那些所谓的代码质量工具,看起来高大上,用起来却各种问题。 为什么你需要这个 1. 减少错误:代码质量保证可以帮助你发现和修复代码中的错误,减少生产环境中的问题。 2. 提高可维护性:高质量的代码更容易理解和维护,减少后期的维护成本。 3. 促进团队协作:统一的代码质量标准可以便于团队成员之间的协作,减少沟通成本。 4. 提高开发效率:高质量的代码可以减少调试和修复错误的时间,提高开发效率。 5. 提升代码安全性:代码质量保证可以帮助你发现和修复安全漏洞,提升代码的安全性。 反面教材 // 这是一个典型的代码质量问题示例 // 1. 代码风格不一致 function getUser(id) { return fetch(`/api/