一、webpack 的安装和使用

1. webpack 简介

webpack 是基于模块化的打包 (构建)工具,它把一切视为模块(包括 JS、CSS、图片等资源文件)。

  • 工作原理:
    • 以开发时态的入口模块为起点
    • 递归分析所有依赖关系
    • 经过压缩、合并等处理
    • 最终生成运行时态的文件
    • 如上图 webpack 官方首页图片;左边的代码不运行,只运行右边的代码。左边的代码和右边的功能是一样的,只不过浏览器喜欢右边的代码。

2. webpack 的特点:

    • 工程化解决方案: webpack诞生于2012年,专注于解决前端工程化问题 ,尤其是浏览器端工程化遇到的问题(node 端也用 webpack 只不过用的少),让开发者专注业务代码,把工程化过程中的问题(比如开发兼容性、执行效率等)交给 webpack 来处理。
    • 零配置使用:支持开箱即用,无需额外配置
    • 生态扩展性: 虽然核心功能有限,但通过扩展机制支持丰富的第三方插件,形成活跃的生态系统(目前生态活跃度远超其他构建工具)
    • node.js :从入口文件开始要读取文件,读出来之后才能分析里边用了 require/import 语句分析依赖关系,如果是在浏览器环境是读取不了文件的。是图片中间的过程需要 node 环境。
    • 基于模块化:webpack 在构建过程中要分析依赖关系,方式是通过模块化导入语句进行分析,它支持各模块化标准,包括但不限于 CommonJS、ES6 Module。

3. webpack 的安装

1) webpack 通过 npm 安装

  • webpack:核心包,webpack 核心包包含构建过程中所需的所有 API ,用于处理模块依赖分析和打包过程。
  • webpack-cli:提供命令行接口,通过调用 webpack 核心包的 api,来完成构建工程,开发者无需编写构建代码。
  • 安装方式:必须用过 npm 安装,因为 webpack 运行在 Node.js 环境中。

2) 安装方式

  • 全局安装与本地安装
    • 全局安装特点:
      • 优点:可在任意目录使用 webpack 命令
      • 缺点:所有项目强制使用相同版本,无法满足不同项目的版本需求
    • 本地安装优势:
      • 每个项目独立管理 webpack 版本
      • 配合 npx 工具使用,无需全局安装
      • 推荐使用本地安装方式
  • 本地安装步骤
    • 初始化项目:
      • 执行 npm init 创建 package.json 文件
      • 注意项目名称需要符号 URL 规范(不含中文和特殊字符)
    • 安装命令:

npm i -D webpack webpack-cli

为什么要加 -D 安装开发依赖呢,是因为运行代码时不需要 webpack ,从 webpack 首页图也能看出,webpack 是开发到运行的中间过程。

    • 验证安装:
      • 检查node_modules/.bin目录下的可执行文件
      • 查看package.json中的devDependencies字段

说一下安装开发依赖时如何选择开发依赖,生产环境只需运行构建后的代码,不再需要 webpack,构建过程属于开发阶段的工作。我们想要区分就看运行时是否需要该依赖即可。

依赖类型有开发依赖和生产依赖,开发依赖仅在开发阶段需要的工具(如 webpack、测试工具等),而生产依赖是项目运行时必须的包(如 React、Vue 等)

3)使用

  • webpack 的入口文件

webpack 要在开发时态分析依赖,那么就一定需要一个入口文件来分析,默认情况下,webpack 会以 ./src/index.js 作为入口文件分析依赖关系,打包到 ./dist/main.js 文件中(无论开发时有多少个模块文件,最终都会合并成一个 main.js),必须要有 src/index.js 文件才能正常进行打包。

src 表示源代码目录(source),是开发阶段代码存放位置

dist 表示目标吗目录(destination),是运行时态代码存放位置

从这张图片可以看出,在开发时怎么简便怎么来,不管是用 es 还是 common ,最终都会打包运行时转换为普通的 js 函数,不会出现 commonjs 和 es6 模块化。我们以后开发就可以集中精力开发 src ,dist 目录不用管就行,我们只需把 src 写好了运行一下 npx webpack 命令。

在之前写的前端工程化包管理器文章中提到的脚本,在package.json文件中有一个scripts对象,用于定义可运行的脚本命令,这里我们可以定义一个脚本命令用于打包。

在 package.json 中配置 build 脚本执行 webpack ,通过 npm run build 命令触发打包,开发时专注 src 目录代码,构建时运行打包命令生成 dist。

注意:为什么在脚本的值写 webpack 而不是 npx webpack,是因为配置在 package.son 中的命令,它会自动查找 node_modules 中 .bin 中的 wepack 执行命令。

4. 构建结果的运行环境

webpack 运行警告信息解释

  • 警告原因:webpack 打包时缺少 mode 参数配置,默认会使用 production 模式
  • 环境区分:
    • 开发环境(development):代码未完成,用于测试调试阶段
    • 生产环境(production):代码已完成,将部署到服务器运行
  • 模式影响:
    • 开发环境:保留代码格式和注释,便于调试
    • 生产环境:进行代码压缩等优化,减小体积
  • 配置方法:
    • 命令行方式:npx webpack --mode=development 或 --mode==production
    • npm 脚本配置:

  • 重要概念:
    • 开发阶段:
      • 这是开发阶段而不是开发环境,开发阶段是编写和修改代码的过程
    • 运行环境:
      • 打包后代码实际执行的环境
    • 环境差异:生产环境会进行更多优化,开发环境保留调试信息

二、模块化兼容性

由于 webpack 同时支持 CommonJS 和 ES6 module 模块化标准,也就是说我们无论是用 Common 还是 ES6 写的代码它都能识别它们的依赖,并且进行打包。在这里产生了一个问题,如果说一个模块,是用 ES6 导出,但用 CommonJS 导入,webpack 会怎么来处理呢?它导入的是什么?导出的又是什么?这个时候我们就需要理解在不同的模块化标准里边,它们互相操作的时候 webpack 是如何处理的。

1. 同模块化标准

当导出和导入使用同一种模块化标准时,webpack 的处理效果与原生模块化完全一致。

2. 不同模块化标准

  • ES6 导出 + CommonJS 导入:

将 ES6 的基本导出和默认导出合并为一个对象,通过 require 直接获取该对象

  • CommonJS 导出 + ES6 导入:

将 module.exports 内容作为默认导出

3. 模块化兼容性

选择一个模块化标准,避免混合使用不同模块化标准

项目开发中统一使用 ES6 或 CommomJS 中的一种

  • 第三方库导入时:
    • 大部分库使用 CommonJS 导出,可用 ES6 默认导入方式
    • 遇到 ES6 导出的库时,注意默认导出在 default 属性中

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

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

相关文章

数据结构---二级指针(应用场景)、内核链表、栈(系统栈、实现方式)、队列(实现方式、应用)

一、二级指针的应用场景1、在被调函数中,想要修改主调函数中的指针变量,需要传递该指针变量的地址,形参用二级指针接收。2、指针数组的数组名是一个二级指针,指针数组的数组名作为参数传递时,可用二级指针接收。指针数…

NodeJs学习日志(1):windows安装使用node.js 安装express,suquelize,sqlite,nodemon

windows安装使用node.js 安装express,suquelize,sqlite 系统是win10,默认已经安装好nodejs与npm包名作用expressWeb应用框架suquelize数据库ORMsqlite数据库nodemon代码热重载安装express 添加express生成器 npm add express-generator4安装e…

Cervantes:面向渗透测试人员和红队的开源协作平台

Cervantes 是一个专为渗透测试人员和红队打造的开源协作平台。它提供了一个集中式工作区,用于集中管理项目、客户端、漏洞和报告。通过简化数据组织和团队协调,它有助于减少规划和执行渗透测试所需的时间和复杂性。 作为 OWASP 旗下的开源解决方案&…

[Python 基础课程]猜数字游戏

使用 Python 实现一个猜数字游戏,先随机生成一个 1 到 100 之间的一个随机整数,让用户猜测这个数是什么,每次都提示用户猜大了还是猜小了,如果用户猜对了,提示用户猜对了,用了多少次,并且之前每…

文件加密实现

一、不依赖外部库实现 使用自定义的XOR加密算法结合简单的密钥扩展。 实现说明 这个方案不依赖任何外部库,仅使用C标准库实现: 加密原理:采用XOR加密算法,这是一种简单但有效的对称加密方式,相同的密钥可以用于加密和解…

Unity轻量观察相机

一、脚本功能简介ObserveCamera 是一个可直接挂载到任意 GameObject 上的通用摄像机控制脚本,支持以下功能:鼠标右键控制摄像机绕自身旋转(俯仰、水平)鼠标左键拖拽目标对象进行平移(局部 XY 平面移动)鼠标…

1深度学习Pytorch-pytorch、tensor的创建、属性、设备和类型转换、数据转换、常见操作(获取元素、元素运算、形状改变、相乘、广播)

文章目录PyTorchTensor1 Tensor 的创建1.torch.tensor2.torch.Tensor3. 线性张量4. 随机张量5. 特定数值的张量2 Tensor 常见属性1 属性2 设备切换3 类型转换torch.Tensor.to(dtype)类型专用方法创建张量时直接指定类型与 NumPy 数组的类型互转4 数据转换(浅拷贝与深…

五、Istio管理网格外部服务

因语雀与csdn markdown 格式有区别,请查看原文: https://www.yuque.com/dycloud/pss8ys 一、Egress Listener 流量策略 前面学习了 sidecar 自动注入原理、inbound Listener、outbound Listener 等概念,也知道了 EgressListener 的流量策略…

Ubuntu20.04 离线安装 FFmpeg 静态编译包

系统版本 Ubuntu20.04 去现场部署项目,发现现场的设备连接的内网,无法使用apt直接安装ffmpeg ,想解决也简单,数据线连接手机使用共享网络,再使用命令sudo apt install ffmpeg安装即可,奈何现场百多台设备&a…

C语言高级编程技巧与最佳实践

C语言高级编程技巧与最佳实践 - 完整版 目录 宏定义与预处理技巧内存管理高级技巧函数指针与回调机制数据结构设计并发与多线程错误处理与异常机制性能优化技巧调试与测试技巧跨平台编程安全编程实践综合演示示例 宏定义与预处理技巧 1. 条件编译与平台检测 /*** 平台和编译…

cygwin+php教程(swoole扩展+redis扩展)

cygwin 1.下载cygwin安装程序 :在Windows上获得Linux的感觉 ​ 2. 打开安装包:setup-x86_64.exe 3.选择安装类型 从互联网安装首次安装下载而不安装仅下载软件包不安装从本地目录安装迁移程序时使用 4.选择安装目录 5.选择本地软件包目录&#xff…

Ethereum: Uniswap V3核心”Tick”如何引爆DEX的流动性革命?

大家好,今天,我们来聊聊一个在去中心化交易所(DEX)领域,尤其是自Uniswap V3问世以来,变得至关重要的概念——Tick(流动性边界)。 如果大家接触过DeFi,可能听说过Uniswap …

【概念学习】什么是深度学习

人工智能 人工智能的简洁定义如下:努力将通常由人类完成的智力任务自动化。 因此,人工智能是一个综合性的领域,不仅包括机器学习与深度学习,还包括更多不涉及学习的方法。 在相当长的时间内,许多专家相信,只…

【MATLAB】(八)矩阵

一.矩阵的定义MATLAB 以矩阵作为数据操作的基本单位,这使得矩阵运算变得非常简捷、方便、高效。矩阵是由m*n个数q(i1,2,…,m;j1,2,…,n),排成的m行n列数表,记成称为 mxn 矩阵,也可以记成aij或Am*n。其中,i表示行数,j表…

python的高校考研交流系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具:Navicat/SQLyog等都可以 在当今社…

从零开始部署Qwen3-8b大模型到本地

一、方法一(使用docker镜像进行部署) 安装Linux服务器,本机测试系统为Ubuntu系统;(带有2张A100的GPU服务器) 思路为:使用docker部署python环境镜像在此基础上安装vllm拉取Qwen3-8b模型 docker-compose.yml文件部分配…

AI产品经理如何理解和应用Transformer架构,以提升产品的技术能力和用户体验?

​你好,我是 ✨三桥君✨ 助你迈向AGI时代!!! 📌本文介绍📌 >> 一、引言 在当今的AI浪潮中,Transformer架构已不再是一个陌生的技术名词。从OpenAI的GPT系列到Google的BERT,再…

数据结构(四)内核链表、栈与队列

一、内核链表基础1. 什么是 Linux 内核链表?Linux 内核链表是一种高效的 双向循环链表,广泛应用于内核模块开发中,用于管理数据结构。每个节点通过指针连接前一个和后一个元素,实现插入和删除的高性能。2. 链表的定义与初始化在 L…

软考信息安全工程师11月备考

目前是在职备考,主业是移动端开发工程师。第一个月(8.4-9.6),将分享完下面所有章节内容,平均不到两天更新一节1.网络信息安全概述2.网络攻击原理与常用方法3.密码学基本理论4.网络安全体系与网络安全模型5.物理与环境安全技术6.认证技术与原理…

使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片

使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片 声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经…