【11】工程化

一、为什么需要模块化

当前端工程到达一定规模后,就会出现下面的问题:

  • 全局变量污染

  • 依赖混乱

上面的问题,共同导致了代码文件难以细分

模块化就是为了解决上面两个问题出现的

模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理

前端模块化标准

前端主要有两大模块化标准:

  • CommonJS,简称 CMJ,这是一个社区规范,出现时间较早,目前仅 node 环境支持
  • ES Module,简称 ESM,这是随着 ES6 发布的官方模块化标准,目前浏览器和新版本 node 环境均支持

node 环境

下载地址:https://nodejs.org/zh-cn/

image-20210423130904669

CommonJS 如何实现模块化

node 天生支持 CommonJS 模块化标准

node 规定:

  1. node 中的每个 js 文件都是一个 CMJ 模块,通过 node 命令运行的模块,叫做入口模块

  2. 模块中的所有全局定义的变量、函数,都不会污染到其他模块

  3. 模块可以暴露(导出)一些内容给其他模块使用,需要暴露什么内容,就在模块中给module.exports赋值

  4. 一个模块可以导入其他模块,使用函数require("要导入的模块路径")即可完成,该函数返回目标模块的导出结果

    1. 导入模块时,可以省略.js
    2. 导入模块时,必须以./../开头
  5. 一个模块在被导入时会运行一次,然后它的导出结果会被 node 缓存起来,后续对该模块导入时,不会重新运行,直接使用缓存结果

练习题

导入导出练习

按照要求完成下面的模块

1. 配置模块 config.js

它需要导出一个对象,规格如下:

{
   
  wordDuration: 300, // 打印每个字的时间间隔
  text: `西风烈,
长空雁叫霜晨月。
霜晨月,
马蹄声碎,
喇叭声咽。
雄关漫道真如铁,
而今迈步从头越。
从头越,
苍山如海,
残阳如血。` // 要打印的文字
}

2. 延迟模块 delay.js

该模块的文件名为delay,你需要把下面的函数导出:

/**
 * 该函数返回一个Promise,它会等待指定的毫秒数,时间到达后该函数完成
 * @param {number} ms 毫秒数
 * @returns {Promise}
 */
function delay(ms) {
   
  return new Promise((resolve) => setTimeout(resolve, ms));
}

3. 打印模块 print.js

该模块负责导出一个打印函数,该函数需要获取当前的打印配置:

/**
 * 该函数会做以下两件事:
 * 1. console.clear() 清空控制台
 * 2. 读取config.js中的text配置,打印开始位置到index位置的字符
 * @param {number} index
 */
function print(index) {
   }

4. 主模块 main.js

这是启动模块,它会利用其它模块,逐字打印出所有的文本,打印每个字的间隔时间在config.js中已有配置

/**
 * 运行该函数,会逐字打印config.js中的文本
 * 每个字之间的间隔在config.js已有配置
 */
function run() {
   }

run();

CommonJS

标准类型:社区规范

支持环境:node

依赖类型:动态依赖

如何导出

module.exports = 导出的值;

如何导入

require("模块路径"); // 函数返回模块导出的值

ES Module

标准类型:官方标准

支持环境:node,浏览器

依赖类型:静态依赖,动态依赖

如何导出

ES Module的导出

ES Module 分为两种导出方式:

  • 具名导出(普通导出),可以导出多个
  • 默认导出,只能导出一个

一个模块可以同时存在两种导出方式,最终会合并为一个「对象」导出

export const a = 1; // 具名,常用
export function b() {
   } // 具名,常用
export const c = () => {
   }; // 具名,常用
const d = 2;
export {
    d }; // 具名
//不可以写成 export d 这样写就是export d中的d是表达式,但是export需要的是定义
//例如 export const xxx,export function xx(){}
//注意这里的 export {d}导出不是导出一个d对象,这里只是语法要求将d放在一对括号中
//这里表示你要导出一个变量,而且导出变量的名字为d,就使用上面的写法
const k = 10;
export {
    k as temp }; // 具名

// export default 3 // 默认,常用
// export default function() {} // 默认,常用
// const e = 4;
// export { e as default } // 默认
// export default {xxx(){},yyy(){}}// 默认导出一个对象
const f = 4,
  g = 5,
  h = 6;
export {
    f, g, h as default }; // 基本 + 默认

// 以上代码将导出下面的对象
/*
{
	a: 1,
	b: fn,
	c: fn,
	d: 2,
	temp: 10,
	f: 4,
	g: 5,
	default: 6
}
*/

注意:导出代码必须为顶级代码,即不可放到代码块中

如何导入

针对具名导出和默认导出,有不同的导入语法

// 仅运行一次该模块,不导入任何内容,模块路径后缀名不能省略
import "模块路径";
// 常用,导入属性 a、b,放到变量a、b中。a->a, b->b
import {
    a, b } from "模块路径";
// 常用,导入属性 default,放入变量c中。default->c
import c from "模块路径";
// 常用,default->c,a->a, b->b
import c, {
    a, b } from "模块路径";
// 常用,将模块对象放入到变量obj中
import * as ob

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/481084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

活用 C语言之union的精妙之用

一、union的基本定义 Union的中文叫法又被称为共用体、联合或者联合体。它的定义方式与结构体相同,但意义却与结构体完全不同。下面是union的定义格式: union 共用体名 {成员列表}共用体变量名;它与结构体的定义方式相同,但区别在于共用体中的成员的起始地址都是相同的,…

Android Studio Gradle设置查看全部task

如果你在 Android Studio 的 Gradle 窗口中看不到所有的任务,你可以尝试以下步骤来解决这个问题 android studio 版本: Android Studio Iguana | 2023.2.1 Build #AI-232.10227.8.2321.11479570, built on February 22, 2024 打开 Android Studio 的设置…

【CSP】2020-12-3 带配额的文件系统 100分完整代码 最长的大模拟 使用指针优化数据结构

2020-12-3 带配额的文件系统 最长的大模拟 使用指针优化数据结构 索引2020-12-3 带配额的文件系统 最长的大模拟 使用指针优化数据结构思路遇到的问题(学到的东西)40分stl代码acwing 15/15 csp官网40分代码100分完整代码 索引 历年CSP认证考试真题题解总汇持续更新 2020-12-3…

框架结构模态分析/动力时程分析Matlab有限元编程 【Matlab源码+PPT讲义】|梁单元|地震时程动画|结果后处理|地震弹性时程分析| 隐式动力学

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

Bytebase 2.14.1 - 分支 (Branching) 功能支持 Oracle

🚀 新功能 分支 (Branching) 功能支持 Oracle。为 SQL 编辑器添加了项目选择器。 新增 SQL 审核规范: 禁止混合 DDL、DML 语句。禁止对同一张表进行不同类型的 DML 变更 (UPDATE,INSERT,DELETE)。 🔔 重大变更 工作空间设置中的「数据访问…

【Linux操作系统】命令的运行原理

文章目录 shell命令以及运行原理Linux系列学习目录 shell命令以及运行原理 Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序&…

【网站项目】294火车票订票系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Data Interpreter: An LLM Agent For Data Science 论文解读

论文地址:https://arxiv.org/abs/2402.18679 Github:MetaGPT: The Multi-Agent Framework 数据解释器(Data Interpreter)是一个基于大型语言模型(LLM)的代理,专门为解决数据科学问题而设计。它…

主干网络篇 | YOLOv8更换主干网络之MobileNetV3

前言:Hello大家好,我是小哥谈。MobileNetV3是一种轻量级的卷积神经网络架构,用于图像分类和目标检测任务。它是MobileNet系列的第三个版本,旨在在保持高准确性的同时减少模型的计算量和参数数量。MobileNetV3引入了一些新的设计思想和技术,以提高模型的性能。其中一项重要…

抖音用户主页如何打开词令抖音小程序?

抖音用户主页如何打开词令抖音小程序? 1、打开抖音主页,点击右上角的「搜索」; 2、使用抖音搜索找到小程序名称:词令的用户,并点击头像名称进入; 3、进入词令抖音用户主页,并到抖音小程序的图标…

Tensorflow 2.0 常见函数用法(一)

文章目录 0. 基础用法1. tf.cast2. tf.keras.layers.Dense3. tf.variable_scope4. tf.squeeze5. tf.math.multiply 0. 基础用法 Tensorflow 的用法不定期更新遇到的一些用法,之前已经包含了基础用法参考这里 ,具体包含如下图的方法: 本文介…

Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 解决跨域问题方案 1.Spring Boot 中解决跨域 1.1 通过注解跨域 1.2 通…

JavaScript高级(十)----JavaScript中的类【重述原型链】!

类 在JavaScript其实本来没有类的概念,哪怕是ES5以后的class,严格意义上来说也只是构造函数的语法糖,之所以喜欢称之为类,因为JavaScript也可以面向对象开发。 类的声明 class Person {}function Person1() {}// 上面两种写法本…

简单了解JMM

什么是JMM 对于不同的硬件和操作系统,有着自己的底层内存模型,可能导致Java程序在一些的平台可以正确并发,而在另一些平台出现并发错误,JMM是Java内存模型,是语言级别的内存模型,用于屏蔽掉各种硬件和操作…

Activiti7学习大纲及环境-Activiti7从入门到专家(2)

学习大纲 入门系列 开发环境及源码编译流程设计器核心API简单流程示例启动与结束事件边界事件中间事件用户任务手动任务接受任务服务任务脚本任务业务规则任务排他网关并行网关包容网关事件网关子流程调用活动泳池泳道执行监听器任务监听器全局监听器真实业务流程 进阶系列 …

蓝桥杯真题讲解:网络稳定性(Kruskal重构树+LCA)

蓝桥杯真题讲解&#xff1a;网络稳定性&#xff08;Kruskal重构树LCA&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;网络稳定性&#xff08;Kruskal重构树LCA&#xff09; 二、正解代码 //kruskal重构树 lca #include<bits/stdc.h>…

lora-scripts 训练IP形象

CodeWithGPU | 能复现才是好算法CodeWithGPU | GitHub AI算法复现社区&#xff0c;能复现才是好算法https://www.codewithgpu.com/i/Akegarasu/lora-scripts/lora-trainstable-diffusion打造自己的lora模型&#xff08;使用lora-scripts&#xff09;-CSDN博客文章浏览阅读1.1k次…

Springboot+vue的高校实习管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校实习管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

YOLOV8环境配置精简

AnacondaCUDA_cuDNN的安装这里就不详细介绍了&#xff0c;按照网上的教程基本可用&#xff0c;但是我的难题主要集中在Pycharm新建conda虚拟环境和Yolov8的工程验证上&#xff0c;所以本文记录自己解决问题的过程。 一&#xff0c;Ultralytics官网下载Yolov8源码&#xff0c;解…

stable diffusion 提示词进阶语法-年龄身材肤色-学习小结

stable diffusion 提示词进阶语法-年龄&身材&肤色 前言年龄提示词青年&#xff08;18-25岁&#xff09;幼年、少年&#xff08;1-18&#xff09;中年&#xff08;35-60岁&#xff09;老年&#xff08;65-80岁 老爷爷 老奶奶&#xff09; 身材提示词肤色关键词(人物基础…