webpack详细教程

1,什么是webpackwebpack | webpack中文文档 | webpack中文网

  • Webpack 不仅是一个模块打包器(bundler),更完整的讲是一个前端自动化构建工具。
  • 在 Webpack 看来前端的所有资源文件(s/json/css/img/less/...)都会作为横块处理
  • 它将根据模块的依赖关系进行静态分析,生成对应的静态资源.

五个核心概念 

  • Entry:入起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。
  • Output:output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件
  • Loader: loader让webpack 能够去处理那些非JavaScript 文件
  • Plugins: 插件则可以用于执行范围更广的任务。例:打包优化、压缩
  • Mode:横式,有生产模式 production 和开发模式development

理解Loader

  • Webpack 本身只能加载JS/JSON 块,如果要加载其他类型的文件(模块),就需要使用对应的loader进行转换/加载。
  • Loader 本身也是运行在 node.js 环境中的JavaScript 横块。
  • 本身是一个函数,接受源文件作为参数,返回转换的结果。
  •  loader 一般以xxx-loader 的方式命名,xxx代表了这个 loader 要做的转换功能,比如 less-loader。

理解Pligins

  • 插件可以完成一些loader 不能完成的功能。
  • 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定。

Mode

  • 模式(Mode)指示 webpack 使用相应模式的配置

配置文件(默认)

  •  webpack.configjs:是一个 node 模块,返回一个json 格式的配置信息对象

 2,安装webpack

  • 全局安装(这一步暂时不需要做)
npm install webpack webpack-cli -g
  • 局部安装
npm init
npm install webpack webpack-cli -D   # cli  Command Line Interface 命令行接口

官方推荐使用『局部安装』,这样可以避免因为版本不同而产生的 BUG

3,webpack初体验 

 1.创建JS模块: src/index.js

import data from './data.json'console.log(data)function add(x,y){return x + y;
}console.log(add(1,2))

2,创建JSON模块: src/data.json

{"name":"jack","age":18
}

3,创建css文件: src/index.css

html,body{height: 100%;background-color: pink;
}

4,安装

npm init -y
npm i webpack webpack-cli -D

5,执行打包命令 『项目根目录下运行』

# 开发模式打包
npx webpack --entry ./src/index.js  --output-path ./build/js --output-filename bundle.js --mode developmentwebapck会以 ./src/index.js为入口文件开始打包,打包后输出到 ./build/bundle.js整体打包环境,是开发环境# 生产模式打包
npx webpack --entry ./src/index.js  --output-path ./build/js --output-filename bundle2.js --mode productionwebapck会以 ./src/index.js为入口文件开始打包,打包后输出到 ./build/bundle.js整体打包环境,是生产环境(对代码进行压缩到只剩下一行代码,在开发项目中对代码进行一个打包,解析速度等会变快)
  • –entry 设置入口
  • –output-path 设置输出目录
  • –output-filename 设置输出文件名
  • –mode 设置运行模式

区别 npmnpx ?

它们都是由Node提供的2个工具, 用来做工具包的相关处理
npm (Node Package Manager) : 包管理器, 用来下载工具包
npx (Node Package Excuted) : 包扩展工具, 用来运行工具包命令
npx 查找工具包的顺序: 局部查找 ==> 全局查找 ==> 运行

但是当在index.js中引入css样式,会进行一个报错

import "./index.css"

所以我们得到一个结论:

1.webpack能处理js/json资源,不能处理css/img等资源

2.生产环境和开发环境将ES6模块化编译成浏览器能识别的模块化~

3.生产环境比开发环境多一个压缩js代码

4,使用配置文件打包

问题:打包命令太复杂(需要指定打包的各种配置信息)

解决:通过JS类型的配置文件来指定打包的配置信息

项目根目录下创建文件 webpack.config.js,内容如下

const {resolve} = require('path'); // path模块是Node内置的
// __dirname:当前配置文件所在的目录绝对路径
// resolve: 用来拼接路径的函数// 暴露配置对象
module.exports = {// 入口entry: './src/index.js',// 出口output: {path: resolve(__dirname, 'build'), // 打包文件所在的根目录filename: 'js/bundle.js', // 打包生成的js文件名(可以带目录)clean: true, // 打包时, 会先自动清空打包文件夹},// 模式// mode: 'production',mode: 'development',
}

 创建完毕之后,在项目根目录执行如下命令:

npx webpack

5,打包样式

问题:webpack本身只能打包 JS 文件JSON 文件, 不能打包CSS文件

解决:利用css-loader & style-loader & less-loader 对CSS进行打包处理

首先是我们的准备工作

1,创建css文件:./src/index.css

html,body{margin: 0;padding: 0;height: 100%;background-color: pink;
}

2,创建less文件:./src/index.less

#title{color: #fff;
}

3.在入口JS文件中引入这些资源:./src/index.js

// 引入样式资源
import './index.css'  //只下载css-loader就只引入css文件 不然会报错
import './index.less' //只下载less-loader就只引入less文件 不然会报错

5-1:打包css文件

第一步:安装loader

npm i style-loader css-loader -D

第二步:修改webpack.config.js配置文件

module.exports = {mode: 'development',// 配置 loadermodule: {rules: [// 配置 css 文件处理{test: /\.css$/, // 处理css文件use: ["style-loader",		// 将 CSS 生成 style 标签插入 HTML 中"css-loader"  		// 将 CSS 转为 CommonJS 的模块]}   ]},
}

第三步:运行打包命令 『在项目的根目录下运行』

npx webpack

 5-2:打包less文件

第一步:安装loader

npm i less less-loader -D

第二步:配置loader

module.exports = {module: {rules: [// 配置 less 文件处理{test: /\.less$/, // 处理less文件use: ['style-loader', // 将 CSS 生成 style 标签插入 HTML 中'css-loader', // 将 CSS 转为 CommonJS 的模块'less-loader' // 将Less编译为CSS]},]}
}	

第三步:运行打包命令 『在项目的根目录下运行』

npx webpack

6,打包HTML资源

问题: 在HTML中手动引入打包文件比较麻烦,且没有压缩处理

解决: 使用html-webpack-plugin打包HTML => 自动引入打包文件,压缩HTML

  1. 删除HTML中引入的JS打包文件

  2. 安装插件

npm i html-webpack-plugin -D

     3.修改 webpack.config.js 配置文件

// 1. 引入插件
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {plugins: [// 2. 配置打包HTML的插件new HtmlWebpackPlugin({template: "./public/index.html",// 指定html模板文件。inject: "body",// 将打包生成的JS文件放置在body尾部hash: true,// 在引入JS时增加hash后缀字符串,去除缓存。filename:'index.html'minify: {removeAttributeQuotes: true,// 移除属性中的双引号removeComments: true,// 移除注释collapseWhitespace: true,// 去除空格与换行}})]
}

       4.执行打包命令

npx webpack  # 打包产生的页面自动引入js打包文件

        5.静态资源要相对根目录查找,需要增加一个配置

output: {// 3-1. 指定出口文件的目录path: path.resolve(__dirname, '../dist'),// 3-2. 指定打包后的js文件名filename: 'js/app.bundle.js',// 3-3. 重新打包,清空以前的内容,重新生成clean: true,// 3-4. 静态资源目录publicPath:'/'},

5-1. 如何查看打包后的效果

  • 方式一:在vscode中,以dist为根目录代开项目。这样liveserver 模拟的服务器 5500端口的根目录就是dist目录
  • 方式二:
    • 安装一个 serve 包,用它来模拟服务器,它可以指定根目录启动服务
    • npm i -g serve
    • 指定目录启动:
    • serve 网站根目录名
    • 举例:serve dist
  • 根目概念:
    • 项目根目路:指的是src所在目录
    • 网站根目录:build之后的目录。当我们通过网址访问的时候,去哪个目录查找资源

7,打包JS

7-1:JS语法转换

问题:一些浏览器(尤其是IE)对ES6新语法的支持不够(不兼容), 但前端开发基本都在用ES6+的语法

解决:利用babel相关工具包将 ES6 转换为 ES5

Babel可以将浏览器不能识别的新语法(ES6-11)转换成原来识别的老语法(ES5),浏览器JS兼容性处理。 操作流程:

1,安装babel相关工具包

npm install -D babel-loader @babel/core @babel/preset-env
  • @babel/core babel 的核心库 (本身并不能完成 ES6 转 ES5)
  • @babel/preset-env babel 的预设工具包,将 ES6 新语法转为 ES5
  • babel-loader babel 在 webpack 中的 loader 包

babel 插件包: 每个 ES6 的新语法都有一个对应的 babel 插件包来转换为对应的 ES5 语法

babel 预设包: 包含多个常用的 babel 插件包的一个大的集合包 ==> 简化配置

2,配置 loader

module.exports = {module: {rules: [//配置 babel 的 loader{test: /\.js$/,exclude: /node_modules/, // 不进行处理的文件夹use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env'], // 指定bebel预设包plugins: [], // 指定babel插件包}}},]}
}

 3,设置目标浏览器

问题:webpack5 打包生成的 JS 代码默认是被包裹在『箭头函数』中, 而IE不支持箭头函数

解决:在 package.json 配置说明兼容 IE 浏览器 => 打包文件中的箭头函数变为 function 函数

"browserslist": ["> 0.1%","not ie <=8"
]

 4,执行打包命令

npx webpack

5,babel单独配置文件使用

 (1)在项目根目录[src所在目录]创建一个 .babelrc

{"presets": ["@babel/preset-env"]
}

(2)webpack.config.js

module.exports = {module: {rules: [//配置 babel 的 loader{test: /\.js$/,exclude: /node_modules/, // 不进行处理的文件夹use: 'babel-loader'},]}
}

7-2. JS 兼容性处理

以下内容待更新....

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

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

相关文章

mysql数据库相关知识【MYSQL】

mysql数据库相关知识【MYSQL】 一. 库1.1 登录数据库管理系统1.2 什么是数据库1.2.1 mysqld与mysql 1.3 编码集和校验集1.3.1 什么是编码集和校验集1.3.2 查看库对应的编码集和校验集1.3.3 用指定的编码集和校验集 1.4 库的操作 一. 库 1.1 登录数据库管理系统 这个算是第一个…

节流防抖:提升前端性能的秘密武器(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

浅谈基于深度学习的手写体纸质文档识别OCR软件

引言&#xff1a; 随着数字化时代的到来&#xff0c;纸质文档的电子化需求越来越强烈。在众多的OCR&#xff08;Optical Character Recognition&#xff09;软件中&#xff0c;基于深度学习的手写体纸质文档识别OCR软件成为了关注焦点。本文将探讨这种软件的特点、功能以及应用…

基于SSM架构的超市管理系统设计

基于SSM架构的超市管理系统设计 目录 基于SSM架构的超市管理系统设计 1 环境及工具1.1 IDEA软件安装1.2 JDK环境配置1.3 MySQL数据库安装1.3.1常规情况1.3.2非常规情况 1.4 Tomcat安装 2 部署与设计2.1 数据库信息创建2.2项目创建与部署 3 相关说明4 功能操作说明4.1 管理员操作…

互联网加竞赛 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

SE考研真题总结(三)

继续更新&#xff0c;今天准备连出两期该系列~ SE考研真题总结&#xff08;二&#xff09;https://blog.csdn.net/jsl123x/article/details/134857052?spm1001.2014.3001.5501 目录 一.简答题 二.代码大题 一.简答题 1.工程和科学的区别 科学是关于事物的基本原理和事实的…

计算4*4*4空间中2点结构的分布

不考虑两点距离的情况下&#xff0c;3维空间中的两点最多只有7种位置关系。3条边&#xff0c;3条面对角线&#xff0c;1条体对角线。现在向4*4*4的3维空间中随机的扔2个石子&#xff0c;比较7种结构的占比。 得到表格为 1 96 0.0476 2 96 0.0476 3 288 0.1429 4 288 …

【ARM Trace32(劳特巴赫) 使用介绍 6 -- 通用寄存器查看与修改】

请阅读【Trace32 ARM 专栏导读】 文章目录 通用寄存器查看与修改Rester 命令语法Register.InitRegister.RELOAD高亮显示Register变化的值多核寄存器显示设置寄存器的值修改 通用寄存器查看与修改 在使用Trace32进行调试时&#xff0c;有时候需要查看并修改通用寄存器、PC指针、…

使用ffmpeg命令进行视频格式转换

1 ffmpeg介绍 FFmpeg 是一个非常强大和灵活的开源工具集&#xff0c;用于处理音频和视频文件。它提供了一系列的工具和库&#xff0c;可以用于录制、转换、流式传输和播放音频和视频。 FFmpeg 主要特点如下&#xff1a; 格式支持广泛&#xff1a;FFmpeg 支持几乎所有的音频和视…

ARM开发基础知识

1、ARM寄存器 概念&#xff1a;寄存器是处理器内部的存储器&#xff0c;没有地址 作用&#xff1a;一般用于暂时存储参与运算的数据和运算结果 分类&#xff1a;通用寄存器、专用寄存器、状态寄存器 注意&#xff1a;有标签&#xff08;带三角光标&#xff09;的是独有的寄存器…

Caché/M 数据库上面的那个 é 怎么打

Cach/M 数据库名字上的 e 有一撇&#xff0c;这个 e 是法语字符&#xff0c;通常英语键盘还不是那么好打。 因最近在研究这个数据库&#xff0c;所以这个字符会用得比较多&#xff0c;简单点的方法就是直接用 e 代替&#xff0c;并且后面加个斜杆 M 用于区分英文的 Cache。 拷…

几本学习中整理和面试的PDF,以及精选面试资料

今天和大家分享我在学习过程中整理的笔记&#xff0c;以及我在准备面试中&#xff0c;阅读的PDF&#xff0c;包括Spring Cloud学习手册、Docker学习手册、RabbitMQ学习手册、Spring 6手册、Maven手册、22w字面试手册等等&#xff0c;包括了大部分后端技术以及大部分高频面试题&…

计算机网络应用层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 DNS域名服务器域名解析过程分类递归查询&#xff08;给根域名服务器造成的负载过大&#xff0c;实际中几乎不用&#xff09;迭代查询 域名缓存&#xff08;了解即可&#xff09;完整域名解析过程采用UDP服务 FTP控制连接与数据连接 电…

C# 从代码入门 Mysql 数据库事务

在业务开发中&#xff0c;使用数据库事务是必不可少的。而开发中往往会使用各种 ORM 执行数据库操作&#xff0c;简化代码复杂度&#xff0c;不过&#xff0c;由于各种 ORM 的封装特性&#xff0c;开发者的使用方式也不一样&#xff0c;开发者想要了解 ORM 对事务做了什么处理是…

redis-学习笔记(Jedis 通用命令)

flushAll 清空全部的数据库数据 jedis.flushAll();set & get set 命令 get 命令 运行结果展示 exists 判断该 key 值是否存在 当 redis 中存在该键值对时, 返回 true 如果键值对不存在, 返回 false keys 获取所有的 key 值 参数是模式匹配 *代表匹配任意个字符 _代表匹配一…

WWW 指南-万维网联盟(World Wide Web)

WWW - 万维网联盟 WWW通常称为网络。 web是一个世界各地的计算机网络。 电脑在Web上使用标准语言沟通。 万维网联盟&#xff08;W3C&#xff09;制定了Web标准 什么是WWW&#xff1f; WWW 代表 World Wide Web(万维网)万维网常常被称为 网络网络是世界各地的计算机网络网络中…

windows 服务器 怎么部署python 程序

一、要在 Windows 服务器上部署 Python 程序&#xff0c;您需要遵循以下步骤&#xff1a; 安装 Python&#xff1a;首先&#xff0c;在 Windows 服务器上安装 Python。您可以从官方网站&#xff08;https://www.python.org/downloads/windows/&#xff09;下载最新的 Python 安…

小程序开发实战案例之三 | 小程序底部导航栏如何设置

小程序中最常见的功能就是底部导航栏了&#xff0c;今天就来看一下怎么设置一个好看的导航栏&#xff5e;这里我们使用的是支付宝官方小程序 IDE 做示范。 官方提供的底部导航栏 第一步&#xff1a;页面创建 一般的小程序会有四个 tab&#xff0c;我们这次也是配置四个 tab 的…

C语言结构体和位段

自定义类型&#xff1a;结构体及联合和枚举 一.结构体类型的声明1.1 结构体的概念1.2结构的声明1.3特殊的声明1.4结构体的自引用1.5可以使用typedef重命名 二.结构体变量的创建和初始化2.1结构体变量的初始化使用{}2.2初始化&#xff1a;定义变量的同时赋初值。2.3结构体嵌套及…

Java 基础学习(八)多态、接口、造型与内部类

1 多态 1.1 多态 1.1.1 多态的意义 一个类型的引用在指向不同的对象时会有不同的实现。依然借助前面案例中的 Person类、Student类和 Teacher 类举例&#xff0c;看如下的代码&#xff1a; Person p1 new Student(); Person p2 new Teacher(); p1.schedule(); p2.schedul…