前端工程化解决方案-Webpack编程

news2025/1/19 16:58:04

文章目录

  • 1. 前端工程化
    • 目前主流的前端工程化解决方案
  • 2.webpack
    • 2.1 主要供能
    • 2.2 webpack与webpack-cli的使用
      • 2.2.1 初始化项目
      • 2.2.2 安装
      • 2.2.3 配置
        • 2.2.3.1 webpack.config.js
        • 2.2.3.2 package.json
        • 2.2.3.3 打包构建
        • 2.2.3.4 项目中引入 dist/bundle.js
    • 2.3 动态部署
      • 2.3.1 webpack-dev-server与html-webpack-plugin的安装
      • 2.3.2 package.json
      • 2.2.3 webpack.config.js
      • 2.2.4 devServer节点
    • 2.5 Loader加载器
      • 2.5.1 安装不同的加载器
      • 2.5.2 定义不同模块对应的加载器
      • 2.5.3 导入不同模块
      • 2.5.4 Loader加载器调用过程
    • 3. 打包发布
      • 自动清理 dist 目录下的旧文件
        • 3.1 安装clean-webpack-plugin插件
        • 3.2 导入clean-webpack-plugin插件
    • 4. Source Map
    • 5. 别名的使用

1. 前端工程化

在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化,包括:
⚫ 模块化(js 的模块化、css 的模块化、资源的模块化)
⚫ 组件化(复用现有的 UI 结构、样式、行为)
⚫ 规范化(目录结构的划分、编码规范化、接口规范化、文档规范化、 Git 分支管理)
⚫ 自动化(自动化构建、自动部署、自动化测试)

目前主流的前端工程化解决方案

webpack
parcel

2.webpack

前端项目工程化的具体解决方案

2.1 主要供能

代码压缩 (多行代码合成一行);
处理浏览器端JavaScript的兼容性;
性能优化

2.2 webpack与webpack-cli的使用

2.2.1 初始化项目

新建项目空白目录webui(项目名称任意),并在改目录下运行 npm init –y 命令,初始化包管理配置文件 package.json

2.2.2 安装

在这里插入图片描述
-S 是 --save的简写; -D是 --save-dev的缩写
在这里插入图片描述

2.2.3 配置

2.2.3.1 webpack.config.js

项目根目录webui中,创建名为 webpack.config.js 的 webpack 配置文件,初始化基本配置:
在这里插入图片描述mode 节点的可选值有两个,分别是:
① development
⚫ 开发环境
⚫ 不会对打包生成的文件进行代码压缩和性能优化
⚫ 打包速度快,适合在开发阶段使用
② production
⚫ 生产环境
⚫ 会对打包生成的文件进行代码压缩和性能优化
⚫ 打包速度很慢,仅适合在项目发布阶段使用

webpack 在真正开始打包构建之前,会先读取这个配置文件,
从而基于给定的配置,对项目进行打包。

在 webpack 4.x 和 5.x 的版本中,有如下的默认约定:
① 默认的打包入口文件为 src -> index.js
② 默认的输出文件路径为 dist -> main.js
在 webpack.config.js 配置文件中可以修改默认约定,通过 entry 节点指定打包的入口。通过 output 节点指定打包的出口

2.2.3.2 package.json

包管理配置文件 package.json,添加npm run 运行的脚本
在这里插入图片描述
script节点下的脚本,可以通过命令 npm run rdev 来执行,rdev名称为任意取的脚本名称

2.2.3.3 打包构建

cmd窗口执行命令 npm run rdev,启动 webpack 进行项目的打包构建
在这里插入图片描述

将源码文件 ./src/index1.js 打包构建成一个新的文件 dist\bundle.js (该文件有 解决浏览器端兼容性 的功能)

2.2.3.4 项目中引入 dist/bundle.js

  <!--<script src="./index1.js"></script>-->
    <!--<script src="../dist/main.js"></script>-->
    <script src="../dist/bundle.js"></script>

基于webpack自动引入机制,这一步可以省略

2.3 动态部署

需要两个插件
① webpack-dev-server
⚫ 类似于 node.js 阶段用到的 nodemon 工具
⚫ 每当修改了源代码,webpack 会自动进行项目的打包和构建
② html-webpack-plugin
⚫ webpack 中的 HTML 插件(类似于一个模板引擎插件)
⚫ 可以通过此插件自定制 index.html 页面的内容

2.3.1 webpack-dev-server与html-webpack-plugin的安装

npm install webpack-dev-server -D
npm install html-webpack-plugin -D

2.3.2 package.json

修改 npm run 运行脚本为 webpack serve

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "rdev": "webpack server"
  }

2.2.3 webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin')

const htmlPlugin = new HtmlWebpackPlugin({
    // 原文件的存放路径
    template: './src/index.html',
    // 生成的文件的存放路径
    filename: './index.html'
});

// 使用Node.js 中的导出语法,向外导出一个webpack的配置对象
module.exports = {
    // 代表webpack运行的模式,可选值有两个development、production
    // mode用来指定构建模式
    mode: 'development',
    // 通过plugins属性,使HtmlWebpackPlugin插件生效
    plugins: [htmlPlugin]
}

① 不配置 webpack-dev-server 的情况下,webpack 打包生成的文件,会存放到实际的物理磁盘上
⚫ 严格遵守开发者在 webpack.config.js 中指定配置
⚫ 根据 output 节点指定路径进行存放
② 配置了 webpack-dev-server 之后,打包生成的文件存放到了内存中
⚫ 不再根据 output 节点指定的路径,存放到实际的物理磁盘上
⚫ 提高了实时打包输出的性能,因为内存比物理磁盘速度快很多
③ webpack-dev-server 生成到内存中的文件,默认放到了项目的根目录中,而且虚拟、不可见。
⚫ 可以直接用 / 表示项目根目录,后面跟上要访问的文件名称,即可访问内存中的文件
④ html-webpack-plugin 插件将/src/index.html,复制了一份到项目根目录下,也被放到了内存中

2.2.4 devServer节点

webpack.config.js 配置文件中,可以通过 devServer 节点对 webpack-dev-server 插件进行更多的配置
在这里插入图片描述

2.5 Loader加载器

webpack默认打包JS模块,非JS模块需要借用Loader加载器来打包
⚫ css-loader 可以打包处理 .css 相关的文件
⚫ less-loader 可以打包处理 .less 相关的文件
⚫ babel-loader 可以打包处理 webpack 无法处理的高级 JS 语法
⚫ url-loader 可以打包处理jpg、png、gif等图片相关的文件

2.5.1 安装不同的加载器

npm i style-loader css-loader less-loader url-loader file-loader babel-loader @babel/core @babel/plugin-proposal-decorators -D

2.5.2 定义不同模块对应的加载器

webpack.config.js在module -> rules 数组中添加加载器

// 使用Node.js 中的导出语法,向外导出一个webpack的配置对象
module.exports = {
    // 代表webpack运行的模式,可选值有两个development、production
    // mode用来指定构建模式
    mode: 'development',
    // entry:"指定文件入口位置"
    entry: path.join(__dirname, './src/index1.js'),
    // output: 指定生成的文件存放位置
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'js/bundle.js'
    },
    // 通过plugins属性,使HtmlWebpackPlugin插件生效
    plugins: [htmlPlugin,webpackConfig],
    devServer: {
        open: true, // 初次打包完成后,自动打开浏览器
        host: '127.0.0.1',
        port: 8080
    },
    module: {
        rules: [
            //定义不同模块对应的加载器
            {test: /\.css$/, use: ['style-loader', 'css-loader']},
            {test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader']},
            // 超过limit阈值的为大文件。不会转成base64,单位是字节
            // 图片输出的文件存放路径,文件大于阈值会输出到磁盘
            {test: /\.jpg|png|gif$/, use: 'url-loader?limit=10&outputPath=images'},
            //使用babel-loader处理高级的JS语法
            //在配置babel-loader 的时候,程序员只需要把自己的代码进行转换即可;一定要排除node_ modules 目录中的JS文件
            //因为第三方包中的JS兼容性,不需要程序员关心
            {test: /\.js$/, use: 'babel-loader', exclude: /node_modules/}
        ]
    }
}

⚫ test 表示匹配的文件类型, use 表示对应要调用的 loader
⚫ 多个 loader 的调用顺序是:从后往前调用,后面加载器的结果返回给前面的加载器,直至返回给webpack,webback把加载的所有模块拼到一个JS文件

2.5.3 导入不同模块

在这里插入图片描述

2.5.4 Loader加载器调用过程

在这里插入图片描述

3. 打包发布

使用 webpack 对项目进行打包发布。
在 package.json 文件的 scripts 节点下,新增 build 命令如下:

  "scripts": {
    "rdev": "webpack server",
    "build": "webpack --mode production"
  }

开发环境下,运行 npm run rdev,打包生成的文件存放于内存中,无法获取到最终打包生成的文件,且打包生成的文件不会进行代码压缩和性能优化

生成环境下,运行 npm run build,–model 是一个参数项,用来指定 webpack 的运行模式。production 代表生产环境,会对打包生成的文件进行代码压缩和性能优化,生成的文件存放于磁盘,且通过 --model 指定的参数项,会覆盖 webpack.config.js 中的 model 选项。

自动清理 dist 目录下的旧文件

3.1 安装clean-webpack-plugin插件

安装clean-webpack-plugin插件

3.2 导入clean-webpack-plugin插件

webpack.config.js文件导入插件,使插件生效

const HtmlWebpackPlugin = require('html-webpack-plugin')
//结构赋值
const {CleanWebpackPlugin}  = require('clean-webpack-plugin')

通过 module.exports -> plugins属性指定 webpackConfig插件生效
在这里插入图片描述

4. Source Map

① 有了Source Map,调试的时候,可以直接显示原始代码,而不是压缩转换后的代码
② 推荐在 webpack.config.js 中添加如下的配置,即可保证运行时报错的行数与源代码的行数保持一致
在这里插入图片描述
开发环境
建议配置: devtool: ‘eval-source-map’
可以直接在控制台提示源文件错误行的位置,并定位到具体的源代码

生成环境
建议配置:devtool: ‘nosources-source-map’
只定位报错的具体行数在源文件中的位置,且不暴露源码。
如果想在定位报错行数的同时,展示具体报错的源码,可以配置:devtool: ‘source-map’, 但不安全,不建议使用

5. 别名的使用

在webpack项目中,建议使用 @ 表示 src 源代码目录,从外往里查找;不要使用 …/ 从里往外查找。使用之前需要在webpack.config.js定义别名

module.exports = {
    resolve: {
        alias: {'@': path.join(__dirname, './src/')}
    }
}

例如项目根目录src文件夹下有一个文件msg.js。可以这样导入该模块:import msg from ‘@/msg.js’

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

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

相关文章

微服务架构概述

微服务架构概述一、架构演变1.1 单体架构1.2 分布式架构1.3 微服务二、SpringCloud2.1 简介3.2 痛点三、SpringCloud Alibaba3.1 简介3.2 优点3.3 主要组件3.4 版本对应一、架构演变 1.1 单体架构 讲业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点&am…

SaaS架构实现理论(四)可伸缩多租户

目录1.伸缩性&#xff08;Scalable&#xff09;的概念2.应用服务器层的水平扩展2.1基于Session复制的水平扩展方式2.2基于Session Sticky的水平扩展方式2.3基于Cache的集中式Session实现水平扩展2.4三种水平扩展方式的比较3.数据库的水平扩展3.1数据库的垂直切分3.2数据库的读写…

ArcGIS基础实验操作100例--实验93插值模型的精度分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验93 插值模型的精度分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

ESP-IDF:使用基本类型,指针,引用,指针的指针,指针的引用作为函数参数的几个例程

1.例程&#xff1a; /下面是使用基本类型&#xff0c;指针&#xff0c;引用&#xff0c;指针的指针&#xff0c;指针的引用作为函数参数的几个例程/ // 值拷贝 int add10(int a) { a 10; return a; } // 指针传参&#xff0c;是一种地址拷贝 void add101(int *a) { // int *…

(11)QWidget的使用(two)

目录 设置窗口图标和标题 设置窗口图标以及获取图标 设置窗口标题以及获取标题 窗口标题的特殊操作 设置窗口的状态 设置窗口的不透明度 设置窗口的状态 使用封装好的函数显示窗口 设置窗口标志 窗口标志简介 设置窗口图标和标题 设置窗口图标以及获取图标 void se…

Java在远程方法调用中运用反射机制

本案例将介绍反射机制在网络编程中的应用&#xff0c;实现如何在客户端通过远程方法调用服务器端的方法。 假定在服务器端有一个 HelloService 接口&#xff0c;该接口具有 getTime() 和 echo() 方法&#xff0c;具体代码如下&#xff1a; import java.util.Date; public int…

【C语言航路】第十一站:字符串、字符和内存函数

目录 一、字符串函数 1.strlen &#xff08;1&#xff09;strlen的库函数文档 &#xff08;2&#xff09;strlen的模拟实现 &#xff08;3&#xff09;strlen的注意事项 2.strcpy &#xff08;1&#xff09;strcpy的库函数文档 &#xff08;2&#xff09;strcpy的使用以…

如何使用机器学习进行图像识别|数据标注

什么是图像识别&#xff1f;图像识别是一种用于识别图像中的对象并将其分类为特定类别的机制&#xff0c;基于人类识别不同图像集中对象的方式。图像识别如何为人类工作&#xff1f;当我们看到一个物体或图像时&#xff0c;作为人类&#xff0c;我们能够立即准确地知道它是什么…

浅谈STL——适配器

一、适配器&#xff08;Adapters&#xff09; 它是一种设计模式&#xff0c;为STL中能够将一个类的接口转化为用户更加想要使用的接口&#xff0c;适配器就扮演者轴承、转换器的功能 就是一个wrapper的模式&#xff0c;将要修饰的接口进行二次包装&#xff0c;展露出可以更容…

紧急事故的流程管理

嵌套式职责分离 在事故处理中&#xff0c;让&#xff1a;每个人清楚自己的职责是非常重要的。有点反直觉的是&#xff0c;明嘶职费反而能够使每个人可以更独立自主地解决问题&#xff0c;因为他们不用怀疑和担心他们的同事都在干什么。 如果一个人目前要处理的事情大多了&…

[TPAMI 2022] 用深度神经网络解决欠定问题——考虑鲁棒性?

Solving Inverse Problems With Deep Neural Networks – Robustness Included?https://ieeexplore.ieee.org/abstract/document/9705105摘要在过去的五年中&#xff0c;深度学习方法已经成为解决各种反问题的最先进方法。在此类方法可以应用于安全关键领域之前&#xff0c;必…

2022年度总结和展望2023年

文章目录 前言 2022年的成就总结 2023年的行动目标 如何完成这些目标&#xff1f; 前言 从2018年更新CSDN第一篇的博文&#xff0c;我就和CSDN产生联系。当时想法很纯粹&#xff0c;就是将积累的知识写成文章&#xff0c;无论去到哪里都能查到&#xff0c;所以前面三年都是…

Python实现预测客户是否会购买房车险源码+数据集,基于伯努利朴素贝叶斯预测客户购买房车险源码,Python预测客户购买房车险

伯努利朴素贝叶斯预测客户购买房车险 根据2000年数据挑战赛保险公司的客户特征数据&#xff0c;预测客户是否会购买房车险。 使用伯努利朴素贝叶斯模型&#xff0c;我获得了更好的预测效果 完整代码下载地址&#xff1a;Python实现预测客户是否会购买房车险源码数据集 数据集…

中国化工发展的新态势

顺势而为的企业才可能有好的未来&#xff0c;在一年之初&#xff0c;回顾总结一下中国化工行业的发展态势&#xff0c;对企业认清形势&#xff0c;确定企业的行业发展方向和发展战略至关重要。 自2022年以来&#xff0c;中国快速增长的化工行业按收入计算一直是世界上最大的&am…

【Java、Redis】通过中心经纬度与半径获取范围内的结果集(类似附近的人)

文章目录需求解决方案什么是Redis GeoHashJava实现InitEquLongLatTask.javaControllerservicexml sql语句引用的pom依赖需求 通过百度地图的覆盖物功能&#xff0c;用户在页面上画圈选定某个区域&#xff0c;前端传输中心点经纬度与半径给后端&#xff0c;后端需要返回位置在圈…

表格存储 Tablestore 十年发展总结

作者&#xff1a;周赵锋 阿里云基础产品团队 ​表格存储Tablestore上线已有十年&#xff0c;随着业务规模变大&#xff0c;稳定性挑战也随之而来&#xff0c;需要不断优化架构来提升可用性。本文将为大家分享表格存储Tablestore在技术层面近年来的功能演进、技术架构演进以及稳…

与哈希函数有关的结构:布隆过滤器、一致性哈希

1、认识哈希函数 &#xff08;out f(in data)&#xff09; 输入参数in&#xff0c;其值域范围可以看作是无穷大的。输出函数out&#xff0c;其值域范围可能性很大&#xff0c;但是一定是有穷尽的哈希函数没有任何随机的机制&#xff0c;固定的输入一定是固定的输出输入无穷多但…

计算机基础——无处不网络

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.计算机网络概述 1.计算机网络发展史 二.计算机网络应用领域 三.计算机网…

基于YOLOv6m的接打电话检测识别分析系统

本身在实际项目开发应用中YOLO都是目标检测任务的绝对主力&#xff0c;从v3一直跟着到了v7&#xff0c;做了很多的项目&#xff0c;处理了很多的数据&#xff0c;当然了也积累了一些自己的成果和心得&#xff0c;这里主要是以不常用到的yolov6m系列的模型来开发构建接打电话行为…

python基础篇之函数

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a;lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…