文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于什么是javascript模块化以及为何使用模块化开发

2023-05-15 17:26

关注

模块化是一种软件开发的设计模式,它将一个大型的软件系统划分成多个独立的模块,每个模块都有自己的功能和接口,并且能够与其他模块独立地工作。

 先来一段八股文

模块化开发可以带来以下好处:

总之,模块化开发是一种有效的软件开发模式,可以提高软件开发的质量、效率和可维护性,特别是在大型软件系统的开发中,模块化更是必不可少的。

实际工作中如何使用

场景一:在前后端交互的ajax请求中,对不同的请求进行分类,每一个种类的业务放到一个模块中,有用户相关的、商品列表相关的、订单相关的各种,为了使业务逻辑更加清晰,更改相关代码的时候,只需要找到对应的文件,用户相关的就去user.js修改,商品相关的就去goods.js修改等等,是不是清楚多了,这是不是好用多了?

来看看示例user.js

import axios from '../utils/request'
import md5 from 'md5'
 
// 登录
export const login = async (params)=>{
  let {data} = await axios.post('users/login',{params})
  if(data.success){
    // 在浏览器缓存中存储token
    sessionStorage.setItem('token',data.token)
  }
  return data
}
// 修改密码
export const resetPwd = async (params)=>{
  // 要对密码加密
  let {data} = await axios.post('users/resetPwd',params)
  return data
}
//...other business

示例,goods.js

export const getDetail = async (id)=> {
  let {data} =  axios.get(`/goods/detail/${id}`);
  return data
}
 
export const getCategory = async () =>{
  let {data} =  axios.get('/categories');
  return data
}
 
export const search = (params) =>{
  let {data} =  axios.get('/search', { params });
  return data
}

每个js(模块)都有自己的相关的代码,代码之间互不影响。

如下代码所示,所有的请求都放到一个文件中,不分模块

import axios from '../utils/request'
import md5 from 'md5'
 
// 登录
export const login = async (params)=>{
  let {data} = await axios.post('users/login',{params})
  if(data.success){
    // 在浏览器缓存中存储token
    sessionStorage.setItem('token',data.token)
  }
  return data
}
//查询商品
export const search = (params) =>{
  let {data} =  axios.get('/search', { params });
  return data
}
 
// 修改密码
export const resetPwd = async (params)=>{
  // 要对密码加密
  let {data} = await axios.post('users/resetPwd',params)
  return data
}
//商品详情
export const getDetail = async (id)=> {
  let {data} =  axios.get(`/goods/detail/${id}`);
  return data
}
//获取商品分类
export const getCategory = async () =>{
  let {data} =  axios.get('/categories');
  return data
}
 
//...other business

是不是很乱,这只是一点点业务,如果大一点业务系统,里面有百十个接口,如果不能按照模块划分,代码就会是一座屎山,多人协作会出问题、代码维护无从下手

场景二:大家都知道单页面应用程序,他的最大优势就是不用切换页面,对用户体验极好。例如vue常见的页面是头、尾、菜单不动,只有内容区域动,在dom中扣去一块旧的,换一块新的,这样看来,每一块都应该是独立存在的,也就是咱们常见的.vue文件,使用webpack将.vue文件转为.js文件,这个js就是一个模块化的文件,通过路由把页面和名字进行关联,扣掉和换上新的都需要操作路由来完成

总结一下,模块化其实就是分门别类。

 附加几种模块化语法

不管哪种语法,只是一种固定的写法,重点了解两个概念,一个导出(暴露当前模块),一个导入(用那个模块)

1. CommonJS

CommonJS 是一种用于服务器端 JavaScript 的模块化规范,使用 require 和 module.exports 导出和引入模块。例如:

// math.js
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
const hello = () => '千锋,你好';
 
module.exports = {
  add,
  subtract,
  hello
};
 
// app.js
const math = require('./math');
 
console.log(math.add(2, 3)); // 输出 5
console.log(math.subtract(3, 2)); // 输出 1
console.log(math.hello); // 输出千锋,你好

2. AMD

AMD(Asynchronous Module Definition,异步模块定义)是用于浏览器端 JavaScript 的模块化规范,使用 define 定义模块,通过 require 异步加载模块。例如:

// math.js//define第一个参数表示当前模块所依赖的模块,可以是一个字符串数组,也可以是一个函数// 定义一个名为 "math" 的模块,依赖于 "jquery" 和 "underscore" 两个模块define(['jquery', 'underscore'], function($, _) {  // 定义模块的功能  const add = function(a, b) {    return a + b;  };  const multiply = function(a, b) {    return a * b;  };  const test = ()=>{    var arr = ['foo', 'bar', 'qfedu'];    var arrUpper = _.map(arr, function(str) {      return str.toUpperCase();    });    return  arrUpper;  }    // 导出模块的功能  return {    add: add,    multiply: multiply,    test:test  };});// app.jsrequire(['./math'], function(math) {  console.log(math.add(2, 3)); // 输出 5  console.log(math.subtract(3, 2)); // 输出 1  console.log(math.test())//输出 ["FOO", "BAR", "QFEDU"]});

3. ES6 模块

ES6 模块是 JavaScript 的官方模块化规范,使用 import 和 export 导入和导出模块。例如:

// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
 
// app.js
import { add, subtract } from './math';
 
console.log(add(2, 3)); // 输出 5
console.log(subtract(3, 2)); // 输出 1

4. UMD

UMD(Universal Module Definition,通用模块定义)是一种支持多种模块化规范的通用模块化方案,它既支持 CommonJS,又支持 AMD 和全局变量。例如:

(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(['exports'], factory);
  } else if (typeof module === 'object' && module.exports) {
    factory(module.exports);
  } else {
    factory((root.myModule = {}));
  }
}(typeof self !== 'undefined' ? self : this, function (exports) {
  const add = (a, b) => a + b;
  const subtract = (a, b) => a - b;
 
  exports.add = add;
  exports.subtract = subtract;
}));

到此这篇关于关于什么是javascript模块化以及为何使用模块化开发的文章就介绍到这了,更多相关什么是模块化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯