认真过一遍webpack

news2024/11/18 2:37:37

1. 简介

Webpack 是 前端资源打包工具,它会根据模块之间的依赖关系进行静态分析,将模块按照指定的规则生成对应的静态资源。 

 webpack会从入口文件开始打包,先形成依赖关系图,根据依赖图把不同的资源引进来形成一个chunk代码块, 然后根据chunk根据不同的资源进行处理,比如: less => css, 这个处理过程就是 打包,打包之后输出去,输出去的文件 就是 bundle。

 Webpack 处理是会构建出一个依赖图,该依赖图映射项目所需的每个模块,并将多种静态资源 js、css、less 转换成一个静态文件bundle.js,减少了页面的请求。

从 v4.0.0 开始,webpack 可以不用再引入一个配置文件来打包项目,然而,但它仍然有着 高度可配置性

1.  Entry 入口

入口指示Webpack 以哪个文件为起点开始打包,分析构建内部 依赖图(dependency graph) 。默认是 './src/index.js', 可以通过配置指定 entry 属性,指定一个或多个 入口起点。

webpack.config.js

module.exports = {
    entry: './src/index.js'
}

2. Output 

输出指示Webpack打包后的资源bundle 输出到哪里去,以及如何命名。

3. Loader

Loader 让 Webpack 能够去处理那些非 JavaScript 文件(Webpack 自身只理解JavaScript),把文件转成 webpack可以识别的 js 文件。

4. Plugins

插件(plugins)可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。

5. Model

通过选择 developmentproduction 或 none 之中的一个,来设置 mode 参数,你可以启用 webpack 内置在相应环境下的优化。其默认值为 production

2. webpack 体验

1. 新建文件夹, npm init

2. 引入 webpack webpack-cli,  先 -g 全局引入(这样可以直接用 webpack-cli 的命令),再 -D 引入

npm webpack webpack-cli -g

npm webpack webpack-cli -D

3. 新建代码文件夹 src, 打包输出的文件夹 build

新建 index.js 入口文件


function add(x, y) {
  return x+y;
}
console.log(add(1,2));

/**
 * index,js: webpack 入口起点文件
 * 1. 运行指令
 *    开发环境: webpack ./src/index.js -o ./build/built.js --mode=development
 *    webpack会以  ./src/index.js 为入口文件开始打包,打包输出到  ./build/built/main.js
 *    整体打包环境,是开发环境
 * 
 *    生产环境:webpack ./src/index.js -o ./build/built.js --mode=production
 *    webpack会以  ./src/index.js 为入口文件开始打包,打包输出到  ./build/built/main.js
 *    整体打包环境,是生产环境
 */

1. 开发环境控制台 输入 指令:

webpack ./src/index.js -o ./build/built.js --mode=development

会生成built.js/main.js, main.js里面是 打包的内容 

main.js 文件 eval 函数 包含了 index.js 的所有内容,包括注释。 

 2. 生产环境控制台 输入 指令:

webpack ./src/index.js -o ./build/built.js --mode=production

 文件 main.js 里面 是 webpack帮你压缩好的 代码了,我的是 webpack5, 好家伙,直接剩下一个运行语句

 3.node 运行这个文件,输出 3

node .\build\built.js\main.js

结论:

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

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

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

3. webpack 打包样式资源

src 文件夹 下建 index.js(入口文件), index.css 样式文件, index.less 样式

build 文件夹,建  index.html

根目录新建一个 webpack.config.js 文件

初始配置模板:

/**
 * webpack.config.js webpack的配置文件
 * 
 *    作用: 指示webpack 干哪些活( 当运行 webpack 指令时,会加载里面的配置)
 * 
 *    所有构建工具都是基于 node.js 平台运行的 —— 模块化默认采用 common.js
 */
// resolve 用来拼接绝对路径的方法
const { resolve } = require('path');
module.exports = {
  // 入口
  entry: './src/index.js',
  // 输出
  output: {
    // 输出文件名
    filename: 'built.js',
    // 输出路径,绝对路径
    // __dirname nodejs的变量,代表当前文件的目录绝对路径
    path: resolve(__dirname, 'build')
  },
  // loader 的配置
  module: {
    rules: [
      // 详细 loader 配置
      // 不同文件必须配置不同loader 配置
      {
        // test 匹配哪些文件
        test: /\.css$/,
        //使用哪些 loader 进行处理
        use: [
          // use 数组中 loader 执行顺序: 从右到左,从下到上,依次执行
          // 创建style 标签,将 js 中的样式资源插入进去,添加到 head 中生效
          'style-loader',
          // 将css文件变成commonjs模块加载 js 到中,里面内容是样式字符串
          'css-loader'
        ]
      },
      {
        test: /\.less$/,
        use: [
          'style-loader',
          'css-loader',
          // 将less文件编译成 css文件
          'less-loader'
        ]
      }
    ]
  },
  // plugins 的配置
  plugins: [
    // 详细 plugins 的配置
  ],
  // 模式
  mode: 'development', // 或 'production'
}

注意:__dirname 是两个 _ , 写少一个 bug找半天

控制台输入 webpack 即可 运行打包,并且 index.css的样式 生效于 index.html中

4. 打包 html资源

/**
 * loader : 1.下载 2. 使用(配置loader)
 * plugins:  1. 下载 2. 引入  3. 使用
 */

plugins 引入 html-webpack-plugins


const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: []
  },
  plugins: [
    // html-webpack-plugin
    // 功能: 默认会创建一个空的 html,自动引入打包输出的所有资源(JS/CSS)
    // 需要有结构的html文件
    new HtmlWebpackPlugin({
      // 复制 ./src/index.html 文件, 并自动引入打包输出的所有资源(JS/CSS)
      template: './src/index.html'
    })
  ],
  mode: 'development'
} 

5.  打包图片资源

webpack5 自带图片处理, webpack4 的话 就要 加上 url-loader, 有的还需要 加 file-loader.

 在index.less 文件中 引入 图片

body,html {
  margin: 0;
  padding:0;
}

.one {
  height: 100px;
  width: 200px;
  background-image: url('./1.jpg');
  background-repeat: no-repeat;
  background-size: 100% 100%;
}
.tow {
  height: 200px;
  width: 200px;
  background-image: url('./2.png');
  background-repeat: no-repeat;
  background-size: 100% 100%;
}
.three {
  height: 300px;
  width: 300px;
  background-image: url('./3.jpg');
  background-repeat: no-repeat;
  background-size: 100% 100%;
}

index.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>打包图片资源</title>
</head>
<body>
  <div id="app">
    <div class="one"></div>
    <div class="tow"></div>
    <div class="three"></div>
    <img src="./1.jpg" alt="图片">
  </div>
</body>
</html>

 

url-loader: webpack5的 不用 加该loader, webpack5会自动处理.


      {
        // 处理图片资源
        test: /\.(jpg|png|gif)$/,           
        // 下载url-loader file-loader
        loader: 'url-loader',
        options: {
          // 图片大小小于 300kb, 就会被 base64处理
          // 优点:减少请求数量(减轻服务器压力)
          // 优点:  图片体积会更大(文件请求速度更慢)
          limit: 200 * 1024,
          // 问题: 因为url-loader默认使用 es6 模块化解析,而 html-loader 引入图片是 commonjs
          // 解析时会出现问题: [object Module]
          // 解决: 关闭 url-loader 的 es6 模块化, 使用 commonjs 解析
          esModule: false,
          // 给图片进行重命名(没必要)
          // [hash:10] 取图片的hash 的前 10位
          // [ext] 取文件原来扩展名
          // name: '[hash:10].[ext]'
        }
      }

 

 html-loader: 处理html文件的img 图片(负责引入img,从而被 url-loader 进行处理)


      {
        test: /\.html$/,
        // 处理html文件的img 图片(负责引入img,从而被 url-loader 进行处理)
        loader: 'html-loader'
      }

 

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

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

相关文章

Flutter 这个评分组件用起来真香

前言 在很多应用中,我们都需要收集用户的评分,比如商品满意度、配送满意度、应用使用体验等等。评分组件通常会是下面这样,一般满分是5分。 不过,有时候评分组件也会有一些特殊性(都怪产品的想法太多)。比如要求支持0.5分的评分,比如对不同的满意度使用不同的图标,再…

vscode - vscode中使用svn插件进行提交代码

本文介绍工作中在vscode上使用svn插件进行提交代码&#xff1b; 前提&#xff1a;自己需要安装svn服务端和客户端&#xff08;小乌龟&#xff09; svn服务端链接&#xff1a;https://www.visualsvn.com/server/download/ svn客户端链接&#xff1a;https://tortoisesvn.net/dow…

守护安全|AIRIOT城市天然气综合管理解决方案

城市使用天然气存在安全风险和隐患&#xff0c;天然气管理的复杂性也比较高&#xff0c;依靠传统人工难以发现安全漏洞&#xff0c;特别是在燃气场站、管网的安全监管等方面&#xff0c;场站面临作业管理、区域管控等问题&#xff0c;管线存在第三方施工发现问题不及时、监管难…

Java实战-用Java mail实现Exchange发邮件给你喜欢的人

目录1. 官方指导文章2. 需要用到com.microsoft.ews-java-api2.1 maven中添加2.2 gradle中添加3. 完整代码&#xff1a;新建一个MailUtil.java类&#xff1a;如何用java mail 实现Exchange发邮件的功能 1. 官方指导文章 官方文章&#xff1a;https://github.com/OfficeDev/ews…

设计模式(下)

四、行为型模式 4.1 模板方法模式 4.1.1 概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些…

swin Transformer

文章目录swin Transformer创新点&#xff1a;网络架构&#xff1a;Patch Partitionlinear EmbeddingSwin TransformerPatch Merging总结swin Transformer 论文&#xff1a;https://arxiv.org/pdf/2103.14030.pdf 代码&#xff1a;https://github.com/microsoft/Swin-Transfor…

基于FDB方法的供给需求优化算法改进——基于工程设计问题的综合研究

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

校园网页设计成品 学校班级网页制作模板 dreamweaver网页作业 简单网页课程成品 大学生静态HTML网页源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

ArangoDB简单入门

一、安装与启动 1、进入到某个目录 cd /home/neunhoef/ 2 获取包 wget https://download.arangodb.com/arangodb34/Community/Linux/arangodb3-linux-3.4.1.tar.gz 3、解压 tar xzvf arangodb3-linux-3.4.1.tar.gz 4、将使用的命令放到path中 export PATH"/home/neunhoef…

Ajax学习:原生jsonp实践

输入内容&#xff1a;丧失焦点 向服务器发送请求 对用户名做是否存在的检测 并且改变框的颜色 服务端&#xff1a; const {json } require(express); const express require(express)const app express(); app.get(/home, function(requset, response) {//设置响应头 名称…

分布式全局唯一ID (学习总结---从入门到深化)

目录 分布式全局唯一ID 何为 ID 为什么需要分布式ID 分布式全局唯一ID解决方案 UUID 依靠数据库自增字段生成 号段模式 Redis自增key方案 雪花算法&#xff08;SnowFlake&#xff09; 分布式全局唯一ID_什么是雪花算法SonwFlake 雪花算法作用 SnowFlake算法优点 SnowFlake…

【flutter-mobx】Flutter 状态管理- 使用 MobX实现计数器

实践flutter mobx&#xff1a; 提示&#xff1a;对下面这篇掘金文章的实践&#xff0c;通过flutter结合 mobx 实现计数器&#xff0c;过程中也添加了一些处理和注释&#xff0c;代码放在feat/mobx下 https://juejin.cn/post/6954523549386162213 https://github.com/ThinkerW…

论算法是如何优化的:四数之和

论算法是如何优化的&#xff1a;四数之和 心路历程 闲来无事&#xff0c;刷刷力扣&#xff0c;突然看到一道题目叫做四数之和&#xff0c;难度中等&#xff0c;心想&#xff0c;这不就是我大显身手的时候了吗&#xff1f;&#xff1f;&#xff1f;我直接就是一个点击进入&…

2022 CMU15-445 Project 1 Buffer Pool

通过截图 Task #1 - Extendible Hash Table 该 task 的知识点名为 可扩展动态散列 https://cloud.tencent.com/developer/article/1020586 这个部分要实现一个 extendible 哈希表&#xff0c;内部不可以用 built-in 的哈希表&#xff0c;比如 unordered_map。这个哈希表在 Buf…

Open-Dis的C++版本编译(CMake-gpu 3.21.4)以及SDL2和SDL_net库的配置使用

目录Open-DisOpen-Dis简介分布式交互仿真更多资料Open-Dis下载CMake编译教程SDL2和SDL_netSDL介绍下载SDL配置SDL2下载SDL_net配置SDL_net工程编译Open-DisOpen-Dis Open-Dis简介 Dis是国防部&#xff0c;北约和联合国实时/虚拟世界建模和仿真中使用最广泛的协议之一。 Open-…

关于二进制

关于二进制 读《程序是怎样跑起来的》 用二进制表示计算机信息的原因 计算机内部是由IC&#xff08;集成电路&#xff09;这种电子部件构成的。CPU和内存也是IC的一种&#xff0c;IC有几种不同的形状&#xff0c;有的像一条黑色的蜈蚣&#xff0c;在其两侧有数个乃至数百个引脚…

智慧水务:数字孪生污水处理厂,3D可视化一键管控

近年来&#xff0c;智慧水务、数字水务成为水务行业的热点领域。对于污水处理领域&#xff0c;如何贯彻落实双碳战略&#xff0c;积极推进智慧水厂建设&#xff0c;显得尤为关键。 可视化技术结合视频融合、BIM、5G、物联网、云计算及大数据等先进技术&#xff0c;围绕水质达标…

用DIV+CSS技术制作个人博客网站(web前端网页制作课期末作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【Docker】搭建MySQL主从复制,详细的图文展示

Docker是基于Go语言实现的云开源项目。Docker的主要目标是**“Build&#xff0c;Ship and Run Any App,Anywhere”**。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应用等等&#xff09;及其运…

[附源码]JAVA毕业设计计算机散件报价系统(系统+LW)

[附源码]JAVA毕业设计计算机散件报价系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…