首页 > 其他分享 >前端工程化

前端工程化

时间:2024-11-01 18:21:04浏览次数:3  
标签:文件 plugin 前端 loader 编译 webpack 模块 工程化

前端构建

  1. cjs:
    exports.sum = (x,y)=>x+y;
    const {sum} = require('./sum')

  2. esm :静态导入 针对无用tree shaking
    export const sum = (x,y)=>x+y;
    import {sum} from './sum'

  3. umd:universal module definition

前端权限管理的模型

  1. ACL:基于用户的权限管理模型
  2. RBAC:基于角色的权限管理模型
  3. ABAC:基于属性的权限管理模型

minify代码压缩
AST -> AST terser swc

  1. 去除多余字符
  2. 压缩变量名
  3. 逻辑解析,合并声明
  4. 预编译 pre-compiler

package-lock.json
锁版本->开发环境 生产环境

Loader和Plugin的区别
Loader本质是函数 对接收到的内容进行转换,返回转换后的结果,webpack只认识js,对其他类型的资源进行转移的预处理工作
loader:module.rules配置,类型是数组,

Plugin:插件,基于事件流框架Tapable,扩展webpack功能,webpack运行生命周期中会广播很多事件,plugin可以监听这些事件,在合适事件通过webpack api改变输出结果。
plugin:单独配置,类型数组 plugin实例,参数通过构造函数传入。

常见Loader
raw-loader:加载文件原始内容
file-loader:把文件输出到文件夹中,在代码中通过相对url去引用输出的文件(图片 字体)
url-loader:与file-loader类型,设置阈值 大于就交给file-loader处理
source-map-loader:加载额外的source-map文件 方便断点调试
image-loader:加载并压缩图片文件
json-loader:加载json文件
babel-loader:将es6转换成es5
ts-loader:将ts语言转换成js
sass-loader/less-loader:转换css
css-loader:加载css
style-loader:把css注入到js中,通过dom操作加载css
postcss-loader:扩展css语法,使用下一代css
eslint-loader/tslint-loader:代码检查
vue-loader:加载vue.js 单文件组件

常见的Plugin
define-plufin:定义环境变量
ignore-plugin:忽略部分文件
html-wepack-plugin:简化html文件创建
uglifyjs-wepack-plugin:压缩js
mini-css-extract-plugin:分离样式文件,css提取为单独文件,支持按需加载
clean-webpack-plugin:目录清理
webpack-bundle-analyzer:可视化webpack输出文件的体积
speed-measure-webpack-plugin:看到美每个loader plugin执行耗时

Webpack 构建流程
运行流程 串行
1、初始化参数:从配置文件和shell语句中读取并且合并参数,得到最终的参数
2、开始编译:初始化Compiler加载所有配置插件,执行对象run方法,开始编译
3、确定入口:entry找到所有入口
4、编译模块:调用所有loader对模块进行翻译,找出模块依赖的模块,在递归本步骤直到所有入口依赖的文件都经过处理
5、完成模块编译:得到每个模块被翻译后的最终内容以及他们之间的依赖关系
6、输出资源:包含多个模块的chunk,每个chunk转换成单独的文件加入到输出列表中,可以修改输出内容
7、输出完成:根据配置确定输出的路径和文件名,把文件内容写出到文件系统

webpack 提高效率的插件
1、webpack-dashboard 更友好的展示相关包的信息
2、webpack-merge 提取公共配置,减少重复配置代码
3、speed-measure-webpack-plugin 分析loader和plugin的耗时,分析构建过程中的性能瓶颈
4、size-plugin 监控资源体积变化
5、HotModuleReplacementPlugin 模块热替换

文件指纹
打包后输出的文件名后缀
1、hash 和整个项目构建相关的 只有项目文件改变,项目hash值改变
2、ChunkHash Chunk相关 不同entry产生不同的chunkhash
3、ContentHash 根据文件内容定义hash 文件内容不变 则contenthash不变

优化Webpack的构建速度
1、使用高版本Webpack和Nodejs
2、多进程/多实例构建thread-loader
3、压缩代码
多进程并行压缩
webpack-paralle-uglify-plugin
terser-webpack-plugin开发parallel
mini-css-extract-plugin

4、图片压缩
imagemin
image-webpack-plugin

5、缩小打包作用域
exclude/include确定loader规则范围
resolve.extensions
resolve.modules

6、提取页面公共资源
基础包分离
使用html-webpack-externals-plugin 基础包通过cdn引入,不打入bundle中
使用splitchunksplugin 进行公共脚本 基础包 页面公共文件分离

7、充分利用缓存提升二次构建速度
babel-loader开启缓存
terser-webpack-plugin 开启缓存
cache-loader或者hard-source-webpack-plugin

8、tree shaking
没有用过的模块进行标记,从最终bundle中去掉

编写Loader
支持链式调用 遵守单一职责 负责自己所需负责的事
Nodejs中 调用nodejs api或者安装第三方模块调用
传给loader的原内容是utf-8编码的字符串
尽可能异步化loader 计算量小同步也可以
loader无状态 不应该在loader中保留状态
使用loader-utils schema-utils工具
加载本地loader方法

编写plugin
webpack运行生命周期会广播很多事件,plugin监听事件
特定阶段勾入想要添加的自定义内容
通过tapable事件流机制 保证插件有序性 扩展性良好

compiler 暴露钩子 整个生命周期相关
compliation 暴露模块和依赖有关的颗粒度更小的事件钩子
plugin需要在原型上绑定apply方法 才能访问compiler实例
插件接收commpiler compliation都是同一个引用
找到合适的事件点 完成想要的内容

babel原理
三部分
解析 将代码转换成AST
转换 访问AST节点 变换操作生成新的AST
生成 以新的AST为基础生成代码

source map是什么 生产环境怎么用
source-map 将编译、打包、压缩后的代码映射会源码的过程

文件监听原理
源码发生变化 自动重新构建新的文件
两种监听模式
-watch
-配置webpack.config.js watch:true

热更新原理
热更新 无需刷新浏览器 可将新模块替换掉旧模块
chunk diff
维护websocket
WDS浏览器
本地资源发生变化 WDS推送更新hash
对WDS发起ajax

Webpack事件机制
常见事件
before-run:开始执行构建之前触发,可以用于清理上一次构建的临时文件或状态
run:开始执行构建触发
before-compile:开始编译代码前触发,可以用于添加一些额外的编译配置或者预处理代码
compile:开始编译 可用于监听编译过程或者编译处理错误
this-compilation:创建新的Compilation对象触发,Compilation对象代表当前编译过程中的所有状态和信息
compilation:编译代码期间触发,可以用于监听编译过程或者处理编译错误
emit:输出文件之前触发,修改输出文件或者一些附加文件
after-emit:输出文件后触发 用于清理中间文件
done:构建完成时触发,用于生成构建报告

webpack事件机制Tapabel实现核心类 封装了事件订阅发布机制Compiler Compilation都是Tapable类的实例对象

webpack核心概念
1、entry指定从哪个模块开始构建依赖图 一个或多个入口模块
2、output 指定输出路径或文件名 输出一个或多个文件
3、loaders 处理各种类型文件 转化为有效模块 ES6+ 转译为浏览器可识别的ES5代码
4、plugins:可执行更广泛的功能模块,优化打包结果、资源管理、环境变量注入等
5、mode development production none
6、code splitting 拆分为多个单独文件,通过配置解析规则,指定如何查找以及处理不同类型的模块
7、Resolve 模块引用关系解析模块路径
8、devServer:热更新 自动刷新页面 提高开发效率

标签:文件,plugin,前端,loader,编译,webpack,模块,工程化
From: https://www.cnblogs.com/ypzgmz/p/18408400

相关文章

  • 前端打包成dist包,后端该怎么访问,两种方式
    第一种Nginx,映射到dist文件夹server{listen80;server_nameyourdomain.com;location/{root/path/to/your/dist;try_files$uri$uri//index.html;}}第二种把dist放到项目中使用SpringBoot结合前端资源,使用WebMvcConfigurer......
  • 前端的全栈Deno篇(五):与前端保持一致的模块化方案,摆脱ERR_REQUIRE_ESM和mjs、cjs等模块
    在现代JavaScript开发中,模块化系统的演变经历了多次变革,使得前端和后端开发人员在选择模块加载方式时常常感到困惑。尤其是Node.js所采用的CommonJS和ESM(ECMAScriptModules)两种模块体系,以及文件扩展名的多样性(如.cjs、.mjs和.js)带来的复杂性和混乱。Deno的诞生以及其2.0版......
  • WebSocket详解:从前端到后端的全栈理解
    文章目录前言一、WebSocket简介1.1WebSocket的特点二、WebSocket的工作原理2.1握手过程2.2数据传输三、WebSocket在前端的应用四、WebSocket在后端的应用五、WebSocket的局限与解决方案结语前言随着互联网技术的发展,传统的HTTP协议在某些场景下的局限性逐渐显......
  • 前端面试看似普遍却热度最高的题
    一、说一下浏览器事件模型1、Dom0级别简单直接,html属性上添加事件函数<buttononclick="handleClick()">Clickme</button>2、Dom1级别Dom1只是一个规范标准,但并没有明确地引入新的事件模型规范3、Dom2级别特点:引入了更强大、更规范的事件处理机制。支持事件的捕......
  • 【前端基础】CSS基础
    目标:掌握CSS属性基本写法,能够使用文字相关属性美化文章页。01-CSS初体验层叠样式表(CascadingStyleSheets,缩写为CSS),是一种样式表语言,用来描述HTML文档的呈现(美化内容)。书写位置:title标签下方添加style双标签,style标签里面书写CSS代码。<title>CSS初......
  • 【前端基础】CSS进阶
    目标:掌握复合选择器作用和写法;使用background属性添加背景效果01-复合选择器定义:由两个或多个基础选择器,通过不同的方式组合而成。作用:更准确、更高效的选择目标元素(标签)。后代选择器后代选择器:选中某元素的后代元素。选择器写法:父选择器子选择器{CSS属性},父子......
  • 后台业务系统OA,CRM,ERP,HR这类开发用什么前端UI框架更好
    在开发后台业务系统如OA、CRM、ERP和HR时,选择合适的前端UI框架至关重要。本文主要探讨:一、Bootstrap框架;二、AntDesign框架;三、ElementUI框架;四、Vue.js框架;五、React框架。考虑到这些系统的复杂性和对界面的要求,以下框架能够提供高效、统一和用户友好的体验。一、Bootstrap......
  • 跟着阿灵学前端——CSS 基础 (2)
    1.CSS长度单位px:像素em:相对元素font-size的倍数rem:相对根字体大小的倍数,html标签就是根。%:相对父元素计算的百分比。CSS中设置长度,必须加单位,否则样式无效。2.元素的显示模式块元素(block)又称:块级元素特点:在页面中独占一行,不会与任何元素共用一行,是从上到......
  • 前端之移动web(一)
    1.平面转换transform⚫作用:为元素添加动态效果,一般与过渡配合使用⚫概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)平面转换又叫2D转换 一:平面转换–平移⚫属性transform:translate(X轴移动距离,Y轴移动距离......
  • 响应式项目(RxJS+Vue.js+Spring)大决战(5):主页的实现(前端视图模块)
    书接上篇:响应式项目(RxJS+Vue.js+Spring)大决战(4):主页的实现(后端服务模块)5.2前端视图模块5.2.1整体结构的设计        前端模块app-view/home负责主页视图的建构,其结构如下图所示:        本篇所述方法,体现了极强的独特性、技巧性! 5.2.2主页home.html ......