【前端工程化】

目录

  • 前端工程户核心技术之模块化
    • 前端模块化的进化过程
    • commonjs规范介绍
      • commonjs规范示例
      • commonjs模块打包
    • amd规范、cmd规范
    • 前端工程化关键技术之npm+webpack原理

前端工程户核心技术之模块化

前端模块化是一种标准,不是实现。commonjs是前端模块化的标准,而nodejs实现了一套commonjs的规范。
什么是前端模块化:将复杂程序根据规范拆分成若干个模块,每个模块间组织是有逻辑的,一个模块包括输入和输出,每个模块内部实现时私有的,对外暴露接口与其他模块通信,而不是直接调用的关系。这其实就是一种典型的面向对象编程思想。一个html页面可以引用的script标签包括:脚本和模块
脚本和模块的区别:请添加图片描述
原来我们所有的业务逻辑代码只能写在index.js里,但用了模块化标准以后,就可以对他进行拆分了,可以把他拆分为一个入口文件entry.js,这个入口文件去引用若干个模块,然后把他们组织起来进行调用,浏览器去调用时,主要访问入口文件,再由入口文件调用其他模块化文件,组装成一个业务逻辑。脚本和模块化最典型的区别就是,通过模块化拆分后,我们可以更清楚的看到整个业务的逻辑,如果只有一个index.js你并不知道源码里面在干什么。

前端模块化的进化过程

请添加图片描述
定义的函数是挂载在window上的,如果有一个文件夹里也定义api函数,会引发全局命名空间冲突
请添加图片描述
请添加图片描述
请添加图片描述

commonjs规范介绍

commonjs是nodejs默认模块化规范,每个文件就是一个模块,有自己的作用域,可以维护自己的私有变量,node中cjs模块加载采用同步加载方式,必须等这个模块加载完了再去执行后面的代码,通过require加载模块,通过exports或者module.exports输出模块。
commonjs规范特点:

  1. 所有代码都运行在模块作用域,没有js脚本概念,写一个js文件就是一个模块,所以不会污染全局作用域。
  2. 模块可以多次加载,第一次加载时会运行模块,模块输出结果会被缓存,再次加载时,会从缓存结果中直接读取模块输出结果。
  3. 模块加载的顺序,按照其在代码中出现的顺序
  4. 模块输出的值是值的拷贝,类似iife方案中的内部变量

commonjs规范示例

每个功能创建一个文件,如api文件:

const handle = require('./handle')
function api(){return {code: 0,data:{a: 1,b: 2,}}
}
module.exports = {api,handle
}

handle.js文件:

function handle(data, key){return data.data[key]
}module.exports = handle;

sum.js文件:

function sum(a, b){return a+b;
}module.exports = sum;

然后在entry.js中引入各文件,执行相关业务逻辑:
请添加图片描述
请添加图片描述
首先,我们需要有一个主模块(即入口文件entry.js),在主模块中,我们会使用require加载模块,require加载模块时会把模块变成module对象,module对象中有一个load方法,通过load方法进行模块加载,在加载过程中,他会在模块的外层包一层,把原来的模块变成自适应函数,我们写的代码(比如写在api.js中的代码)变成函数里面的内容了,他会向自适应函数传入一些变量(require、module、exports、_filename、_dirname),这就是为什么在node里可以直接使用require的原因。使用module.exports输出模块时,最终输出结果会被缓存到module cache map中,这是一个键值对,键是module path+module name,值是module.exports。commonjs输出模块时,module.exports只能输出一个结果

commonjs模块打包

安装browserify:npm install browserify -g
打包命令:browserify module_test/cjs/entry.js -o dist/bundle.js
⚠️当存在多个entry.js模块时,每个entry.js模块都需要单独打包
browserify打包原理:

  1. 本质还是通过自执行函数实现模块化
  2. 将每个模块编号,存入一个对象,每个模块标记依赖模块
  3. 实现了require方法,核心是通过call方法调用模块,并传入require、module、exports方法,通过module存储模块信息,通过exports存储模块输出信息

amd规范、cmd规范

amd规范采用非同步(异步)加载模块,允许指定回调函数。node模块通常位于本地,加载速度快,所以适用于同步加载,但是在浏览器中,如果用同步加载会阻塞模块渲染(整个页面的渲染),所以在浏览器环境下,模块需要请求获取,适用于异步加载,所以诞生了amd规范,用来做异步加载,require.js是amd的一个具体实现库,amd、cmd目前很少使用,因为目前我们主要使用node和浏览器开发,分别使用commonjs和esmoudle。
cmd规范整合了commonjs和amd的优点,模块加载是异步的,cmd专门用于浏览器端,sea.js是cmd规范的一个实现,amd和cmd最大的问题是没有通过语法升级解决模块化,他们定义模块还是通过调用js方法来生成模块,这种方式利于我们快速应用,但是他没有办法对模块化进行规模化的应用,因为他们没有实现标准的语法规范
ESMoudle规范设计理念是希望在编译时就确定模块以来关系及输入输出,commonjs和amd必须在运行时才能确定依赖和输入、输出,ESMoudle通过import加载模块,通过exports输出模块
commonjs和ESMoudle规范的对比:

  1. commonjs模块输出的是值的拷贝,也就是说commonjs模块内部的值你想改是改不了的,但是es6模块输出的是值的引用
    使用es6定义test.js文件:
export let a = 1;
export function plus() {a++;
}

定义entry.js文件:

import {a, plus} from './test.js'
console.log(a);//1
plus();
console.log(a);//2

使用commonjs定义test.js:

let a = 1;
exports.a = a;
exports.plus = function(){a++;
}
// 上述代码等同于:
// module.exports={
//     a:1,// 这个a的值是直接拷贝过来的
//     plus// plus里加的是模块里的a
// }

定义entry.js文件:

const { a, plus} = require(./test.js);
console.log(a);// 1
plus();
console.log(a);// 1

如果想要获取模块里的a,需要使用get方法,在commonjs定义的test.js中定义get方法:

let a = 1;
exports.a = a;
exports.plus = function(){a++;
}
exports.get = function(){return a;
}

在entry.js文件中调用get:

const { a, plus, get} = require(./test.js);
console.log(a);// 1
plus();
console.log(a);// 1
console.log(get());// 2
  1. commonjs模块是运行时加载,es6模块是编译时输出接口,在编译时就能确定导入哪些模块,输出哪些模块
  2. commonjs是单个值导出,es6可以导出多个
  3. commonjs模块为同步加载,es6支持异步加载,导出的是一个promise
    请添加图片描述
  4. commonjs的this是当前模块的输出值,es6的this是undefined
  5. commonjs和es6的语法不同
    请添加图片描述
    script脚本和模块对比:模块具备更高的开发效率,可以将复杂的代码拆分成若干简单的代码,代码可读性强,复用高效,但是模块在加载过程中会损耗性能,因为模块文件很多,会使得加载速度变得更慢,而脚本具有更高的页面性能。模块在浏览器中运行会存在兼容性问题,要特别注意。所以在浏览器中运用模块化存在一些局限性,比如浏览器缺乏模块管理能力,模块分散在各个项目中,模块性能加载慢,无法在大型项目中直接使用,这两个问题是npm(解决模块管理能力问题)和webpack(解决模块加载慢问题)核心解决的问题

前端工程化关键技术之npm+webpack原理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于CNN,RNN,GAN,GNN,DQN,Transformer,LSTM,DBN你了解多少

以下是神经网络中常见的几种模型的简要介绍: 1. ​CNN (Convolutional Neural Network, 卷积神经网络) ​用途: 主要用于图像处理和计算机视觉任务。​特点: 通过卷积核提取局部特征,具有平移不变性,能够有效处理高维数据(如图像…

T113-i开发板的休眠与RTC定时唤醒指南

​​在嵌入式系统设计中,休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式:freeze和mem,以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…

SpringBoot项目实战(初级)

目录 一、数据库搭建 二、代码开发 1.pom.xml 2.thymeleaf模块处理的配置类 3.application配置文件 4.配置(在启动类中) 5.编写数据层 ②编写dao层 ③编写service层 接口 实现类 注意 补充(注入的3个注解) 1.AutoWir…

高性能网络SIG双月动态:加速 SMC eBPF 透明替换特性上游化进程,并与上游深度研讨新特性

01、整体进展 本次双月报总结了 SIG 在 1 月和 2 月的工作进展,工作聚焦在 ANCK CVE 和稳定性问题修复,以及上游 SMC eBPF 透明替换特性推进和多个话题讨论上。 本月关键进展: 1. 推进 SMC eBPF 透明替换特性上游化,更新至 V7&…

某视频的解密下载

下面讲一下怎么爬取视频,这个还是比小白的稍微有一点绕的 首先打开网址:aHR0cDovL3d3dy5wZWFydmlkZW8uY29tL3BvcHVsYXJfNA 首页 看一下: 有一个标题和一个href,href只是一个片段,待会肯定要拼接, 先找一…

C++继承机制:从基础到避坑详细解说

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 总结: 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 ​编辑 默认构造与传参构造 拷贝构造&am…

测试基础入门

文章目录 软件测试基础1.1软件测试概述什么是软件测试什么是软件需求说明书软件测试的原则测试用例的设计测试用例设计的基本原则软件测试分类软件缺陷的定义 2.1软件开发模型软件开发模型概述大爆炸模型(边写边改)软件开发生命周期模型--螺旋模型软件开…

022-spdlog

spdlog 以下是从原理到代码实现的全方位spdlog技术调研结果,结合核心架构、优化策略和完整代码示例: 一、核心架构设计原理 spdlog三级架构 (图示说明:spdlog采用三级结构实现日志系统解耦) Registry管理中枢 全局…

STM32时钟树

时钟树 时钟树就是STM32中用来产生和配置时钟,并且把配置好的时钟发送到各个外设的系统,时钟是所有外设运行的基础,所以时钟也是最先需要配置的东西,在程序中主函数之前还会执行一个SystemClock_Config()函数,这个函数…

【第22节】windows网络编程模型(WSAAsyncSelect模型)

目录 引言 一、WSAAsyncSelect模型概述 二、WSAAsyncSelect模型流程 2.1 自定义消息 2.2 创建窗口例程 2.3 初始化套接字 2.4 注册网络事件 2.5 绑定和监听 2.6 消息循环 三、完整示例代码 引言 在网络编程的广袤天地中,高效处理网络事件是构建稳定应用的…

利用Dify编制用户问题意图识别和规范化回复

继上一篇文章,成功完成Dify本地部署后,主要做了一些workflow和Agent的应用实现,整体感觉dify在工作流可视化编排方面非常好,即使部分功能无法实现,也可以通过代码执行模块或者自定义工具来实现(后续再具体分…

双核锁步技术在汽车芯片软错误防护中的应用详解

摘要 本文深入探讨了双核锁步技术在保障汽车芯片安全性中的应用。文章首先分析了国产车规芯片在高安全可靠领域面临的软错误难点及攻克方向,然后详细介绍了双核锁步技术的基本原理及其在汽车芯片防软错误的重要性。通过对比国内外多家厂商的芯片技术,分析…

Lustre 语言的 Rust 生成相关的工作

目前 Lustre V6 编译器支持编译生成的语言为C语言。但也注意到,以 Rust 语言为生成目标语言,也存在若干相关工作。 rustre(elegaanz) 该项工作为 Lustre v6 语言的解析器,使用 Rust 语言实现。生成 Lustre AST。 项…

Java 之「单调栈」:从入门到实战

Java 单调栈:从入门到实战 文章目录 Java 单调栈:从入门到实战引言什么是单调栈?单调递增栈单调递减栈 单调栈的应用场景Java 实现单调栈代码示例:下一个更大元素代码解析 单调栈的优势实战应用:股票价格跨度代码示例代…

【Golang】defer与recover的组合使用

在Go语言中,defer和recover是两个关键特性,通常结合使用以处理资源管理和异常恢复。以下是它们的核心应用场景及使用示例: 1. defer 的应用场景 defer用于延迟执行函数调用,确保在函数退出前执行特定操作。主要用途包括&#xff…

CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。

大白话CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。 在 CSS 的弹性盒布局(Flexbox)里,flex-grow、flex-shrink 和 flex-basis 这三个属性对弹性元素的尺寸和伸缩性起着关键作用。下面为你详细…

OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap

乒乓缓冲核心思想 不使用乒乓缓冲,如果要每个滤镜作用下的绘制内容,也就是这个滤镜作用下的帧缓冲,需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲,只用两个Frame Buffer Object加上对应的F…

【HarmonyOS NEXT】关键资产存储开发案例

在 iOS 开发中 Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才能访问存储的数据。那…

ccfcsp1901线性分类器

//线性分类器 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int x[1000],y[1000];char z[1000];for(int i0;i<n;i){cin>>x[i]>>y[i];cin>>z[i];}int a[20],b[20],c[20];for(int i0;i<m;i){cin>>a[i…

Spring Boot 整合 OpenFeign 教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 整合 OpenFeign 教程 一、OpenFeign 简介 OpenFeign 是 Netflix 开源的声明式 HTTP 客户端&#xff0c;通过接口和注解简化服务间 HTTP 调用。…