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

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

毒舌时刻

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

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

为什么你需要这个

  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

.js客户关系管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

.js客户关系管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着信息技术的飞速发展,企业对于客户关系管理和信息管理的需求日益增长。传统的管理方式效率低下,难以满足现代企业对数据整合、分析和实时处理的要求。客户关系管理系统(CRM)和信息管理系统(IMS)成为企业提升运营效率、优化客户服务的重要工具。通过数字化手段,企业能够更好地管理客户信息、跟踪业务进展,并实现数据的可视化分析。本系统旨在为企业提供一个高效、易用的管理平台,帮助其实现客户资源的集中管理和业务流程的自动化。关键词:客户关系管理、信息管理、数字化、业务流程、可视化分析。 本系统采用前后端分离的架构,后端基于SpringBoot框架开发,提供稳定的RESTful API接口;前端使用Vue.js框架,实现动态交互和响应式布局;数据库选用MySQL,确保数据的高效存储和查询。系统功能涵盖客户信息管理、订单跟踪、数据分析等模块,支持多角色权限控制,确保数据安全。通过该系统,企业可以快速录入和查询客户信息,实时监控业务状态,并生成多维度的数据报表。系统设计注重用户体验和可扩展性,能够根据企业需求灵活调整功能模块。关键词:SpringBoot、Vue.js、MySQL、

使用Open WebUI下载的模型文件(Model)默认存放在哪里?

使用Open WebUI下载的模型文件(Model)默认存放在哪里?

🏡作者主页:点击!  🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2025年2月21日21点21分 🀄️文章质量:95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下载存放位置 默认存放路径 扩展知识 关于 Ollama 核心价值 服务 关于Open WebUI 核心特点 主要功能 使用场景 Open WebUI下载存放位置 在使用Ollama平台进行深度学习和机器学习模型训练时,了解模型文件的存储位置至关重要。这不仅有助于有效地管理和部署模型,还能确保在需要时能够快速访问和更新这些模型文件。本文将详细探讨Ollama下载的模型文件存放在哪里,并提供相关的操作指南和最佳实践 最后感谢大家 希望这篇文章能帮助你! 使用CMD安装存放位置 以下做测试 我们采用哦llama38B模型来测试 输入命令等待安装即可 默认存放路径 C:\Users\Smqnz\.ollama\models\manifests\registry.ollama.ai 不要直接复制粘贴 我的用户名和你的不一样

在Android设备上利用Termux安装llama.cpp并启动webui

llama.cpp没有发布官方aarch64的二进制,需要自己编译,好在Termux已经有编译好的包可用。 按照文章在安卓手机上用vulkan加速推理LLM的方法, 1.在Termux中安装llama-cpp软件 ~ $ apt install llama-cpp Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable to locate package llama-cpp ~ $ apt update Get:1 https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable InRelease [14.0 kB] Get:2 https://mirrors.

突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案

突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案

突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案 背景 随着AI技术的飞速发展,诸如DeepSeek R1、千问QWQ32、文小言、元宝等AI大模型迅速崛起。在AI大模型训练和微调、AI知识库建设中,数据集的获取已成为不可或缺的基础。尤其是在面对各式各样的网页数据结构时,将其整理成可用的数据集是一项极具挑战的任务。开发者不仅需要付出大量的开发和人工成本,还需应对复杂的网页数据获取难题。在这种情况下,一款能够自动化解决网页数据获取问题的工具变得尤为重要。 本文将介绍网页解锁器Web Unlocker API、网页抓取Web-Scraper以及搜索引擎结果页SERP API等工具,特别适合中小企业解决商业化网页数据集问题,展示其如何解决AI数据集网页抓取的难题,提供高效、自动化的数据获取解决方案。 什么是Web Unlocker API工具? Web Unlocker API是基于Bright Data的代理基础设施开发的,具备三个关键组件:请求管理、浏览器指纹伪装和内容验证。通过这些功能,它能够自动化处理所有网页解锁操作