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

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

毒舌时刻

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

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

为什么你需要这个

  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

告别复杂操作!这款图像修复WebUI让重绘变得超简单

告别复杂操作!这款图像修复WebUI让重绘变得超简单 你是否曾为一张心爱的照片上突兀的电线、路人、水印或文字而发愁?是否试过用PS反复涂抹、羽化、取样,却仍难逃生硬边缘和色差尴尬?是否在深夜赶稿时,对着几十张待处理的电商图叹气——“要是能点一下就自动修好该多好”? 现在,真的可以。 这不是概念演示,也不是未来预告。这是一款已经部署好、打开浏览器就能用、连鼠标画几笔就能出专业级效果的图像修复WebUI。它不依赖本地高性能显卡,不需配置Python环境,不弹出命令行报错,甚至不需要知道“FFT”“LaMa”“inpainting”这些词是什么意思。 它叫 fft npainting lama重绘修复图片移除图片物品 二次开发构建by科哥 ——名字虽长,用起来却极简。今天这篇文章,不讲原理,不堆参数,只带你从零开始,用最自然的方式,把“修图”这件事,真正变成“点一下,就好了”。 1. 为什么说它真的“超简单”? 先说结论:它把图像修复这件事,

Windows下载、安装并运行MinIO,访问WebUI界面

Windows下载、安装并运行MinIO,访问WebUI界面

MinIO MinIO 是一款基于 Apache License v2.0 开源协议的对象存储服务,兼容 Amazon S3 云存储服务接口,可用于存储海量非结构化数据(如图片、视频、日志文件等)。本教程针对 Windows 系统搭建本地 MinIO 服务,适合开发测试、小型项目部署场景。 下载MinIO 官网下载 访问MinIO中文官网或MinIO英文官网,根据读者的操作系统选择相应的操作系统版本点击MinIO Server/AIStor Server和MinIO Client/AIStor Client的Download按钮下载对应文件。 说明:两版官网域名不同,Server/Client 的文字标题有差异,但下载文件一致;中文官网下载速度更快,优先推荐。 网盘下载 通过网盘分享的文件:Minio 链接: https://pan.baidu.com/s/

前端核心知识:Vue 3 编程的 10 个实用技巧

前端核心知识:Vue 3 编程的 10 个实用技巧

文章目录 * 1. **使用 `ref` 和 `reactive` 管理响应式数据** * 原理解析 * 代码示例 * 注意事项 * 2. **组合式 API(Composition API)** * 原理解析 * 代码示例 * 优势 * 3. **使用 `watch` 和 `watchEffect` 监听数据变化** * 原理解析 * 代码示例 * 注意事项 * 4. **使用 `provide` 和 `inject` 实现跨组件通信** * 原理解析 * 代码示例 * 优势 * 5. **使用 `Teleport` 实现组件挂载到任意位置** * 原理解析 * 代码示例 * 优势 * 6. **使用 `Suspense` 处理异步组件加载** * 原理解析 * 代码示例 * 优势

AI Skills:前端新的效率神器!

近来,AI 领域有个火爆的话题:Skills。 Github 上被疯狂 star 的仓库,很多都是和 skills 有关的。 有的仓库仅仅上线三个月就获得了快 50K 的 star,Skills 的火热可见一斑。 不管是大模型,还是 Cursor、Codex、Claude、Trae、Copilot 等编程 IDE 都在争先支持 Skills。 围绕 Skills,它们在做的就是为了完成一件事情:技能是通过学习和反复练习获得的,而 Skills 是把经验和最佳实践沉淀为 AI 能力,将“知道”转化为“做到”的本领。 详解什么是 Skills 要说清楚什么是 Skills,先来了解一下关于 AI 的 2