当前位置: 首页 > ds >正文

第三十九天(WebPack构建打包Mode映射DevTool源码泄漏识别还原)

webpack作用

运行效率高, 不打包时无法执行调用js文件中再调用的js

打包器配置文件 , 入口文件要加./ 进到配置文件目录下 输入 npx webpack

安全方面:

Webpack 是一个强大的模块打包工具,它主要用于将 JavaScript 代码和其他资源(如 CSS、图片、字体等)打包成浏览器能够高效加载的文件。下面是使用 Webpack 的一些常见原因和优势:

  1. 模块化支持

Webpack支持模块化开发,可以将代码分割成多个文件(模块),然后将这些文件按需打包成一个或多个最终的输出文件。这对于管理复杂应用程序的代码非常重要,特别是现代JavaScript应用程序中,大多数代码和资源都已是模块化的。

例如,你可以将前端代码分为多个模块(如组件、工具函数等),然后让 Webpack 负责打包这些模块,并管理它们之间的依赖关系。

  1. 处理各种资源

Webpack 不仅仅是处理 JavaScript 文件,还能处理多种类型的资源:

CSS:你可以使用 Webpack 将 CSS 文件打包到最终的输出中。

Sass / Less:Webpack 配合相应的加载器(如 sass-loader、less-loader)可以处理 Sass 或 Less 文件。

图片和字体:通过 file-loader 或 url-loader,Webpack 可以处理图片、字体文件等静态资源。

HTML 文件:可以使用 html-webpack-plugin 插件自动生成 HTML 文件并插入打包后的资源。

  1. 代码分割(Code Splitting)

Webpack 支持 代码分割,它可以将大型的 JavaScript 应用程序拆分成多个小的文件(chunks),并按需加载这些文件。这样,初次加载时,浏览器只会加载最小的必需代码,而不是所有的代码,从而提高页面加载速度。

例如,你可以按页面或功能进行代码分割,只加载用户需要的部分,而不是一次性加载整个应用程序。

  1. 性能优化

Webpack 提供了多种方式来优化性能:

压缩和优化:在生产模式下,Webpack会自动压缩JavaScript和CSS文件,减小文件大小,从而加速加载速度。

Tree Shaking:Webpack 能够识别并删除未使用的代码,这样在最终打包时只会包含必要的代码,减少最终打包文件的体积。

缓存优化:通过配置 hash 和 chunkhash,Webpack 可以为输出的文件生成唯一的哈希值,这有助于缓存优化。这样,浏览器可以缓存大部分静态资源,而只有在资源内容更改时才会重新下载。

  1. 热模块替换(HMR)

Webpack 提供了 热模块替换(HMR) 功能,允许开发者在不刷新浏览器页面的情况下更新应用程序的部分模块。这对于开发时快速预览修改、提高开发效率非常有用。

  1. 兼容性和 Polyfill

Webpack 可以与 Babel 配合使用,将现代 JavaScript 转译成兼容旧浏览器的代码。通过 Babel 和 Webpack 配合,你可以确保代码在不同浏览器中的兼容性。

  1. 自动化任务

Webpack 配置可以结合其他工具自动化一些常见的任务:

自动生成 HTML 文件,并将打包的 JS 和 CSS 插入其中。

自动处理样式表(Sass、Less)。

自动优化图片文件。

自动生成文件哈希和版本控制。

  1. 插件系统

Webpack 提供了强大的插件机制。你可以通过使用插件(如 HtmlWebpackPlugin、CleanWebpackPlugin、MiniCssExtractPlugin 等)来扩展 Webpack 的功能,定制化自己的构建流程。

  1. 支持不同的开发环境

Webpack 可以根据不同的环境(开发、生产)使用不同的配置。你可以使用 mode 配置来选择开发模式或生产模式,Webpack 会根据模式做出相应的优化。例如,在生产模式下,它会自动启用代码压缩和优化功能。

  1. 生态系统和社区支持

Webpack 拥有非常活跃的社区,很多流行的前端框架(如 React、Vue)和库都提供了针对 Webpack 的最佳实践和插件,使得集成变得更加简便。

结论:

Webpack 是现代前端开发中不可或缺的工具,特别是对于构建复杂的、模块化的应用程序。它的优势在于模块化处理、资源管理、性能优化、代码分割和插件扩展,使得构建和部署变得更加高效和灵活。如果你的应用程序规模较大,或者涉及到多个资源文件,使用Webpack打包将带来显著的性能和开发体验提升。

未使用web Pack 时

sum.js 写了一个加法函数 ,count.js 写了一个 减法函数 main.js 继承他们两个,然后调用方法,传值进去计算,然后将值答应出来, web.html 引用main.js ,然后在浏览器中访问html文件,查看是否能输出main.js 中的 内容

count.js

export default function count(x,y){
    return x-y;
}

sum.js

export default function sum(x,y){
    return x+y;
}

main.js

import count from './count';
import sum from './sum';

console.log(count(2,1));
console.log(sum(1,2));

web.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>

访问时会报错,因为没有调用其他两个js ,但是如果每次都要将其他的js一起引用的话,会很麻烦,所以打包器就出现了,它会先将其他的js文件打包到一起,然后生成一个新的js文件,这时候引用这个js文件时就能实现功能了

#WebPack技术:

1、打包模式差异 开发 和生产

2、打包代码差异

3、打包文件差异

参考:

印记中文 - 深入挖掘国外前端新领域,为国内 Web 前端开发人员提供优质文档!

webpack | webpack中文文档 | webpack中文网

一文看懂webpack打包操作

npm i webpack --dev

npm i webpack-cli --dev

例子:打包JS,NodeJS,HTML等

配置型文件打包 :

先创建一个webpack.config.js 文件

const path = require('path');
const webpack = require('webpack');
 
module.exports = {
    mode: 'development', // 开发环境模式
    entry: './main.js',  // 入口文件  注意: ./是必带的  不带会报错
 
    output: {
        filename: 'bundle.js',  //输出文件名
        path: path.resolve(__dirname, 'dist'),   //输出目录的绝对路径
    }
}
 

在终端中输入 npx webpack ,这样便打包好了,同一级中便会生成一个dist目录,目录下面放了一个bundle.js 文件 这个就是刚刚打包好的文件了

然后在html中引入这个文件就能将值打印出来了

加载的bundle.js 文件是这样的

这里在源代码中的webpack:// 下面就有刚才的三个js文件

上面是用开发环境模式,下面用生产环境模式 打包 看看有什么区别

const path = require('path');
const webpack = require('webpack');
 
module.exports = {
    mode: 'production', // 生产环境模式
    entry: './main.js',  // 入口文件  注意: ./是必带的
 
    output: {
        filename: 'bun1.js',  //输出文件名
        path: path.resolve(__dirname, 'dist'),   //输出目录的绝对路径
    }
}
 

终端中输入 npx webpack

html中引用 打包好的js文件

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="dist/bun1.js"></script>
</body>
</html>

源代码中就没有了webpack:// ,而加载的js文件 也变成了短短一句 , 这是因为开发时能看到的更多,当要上线时就要改成 生产模式

当上线时还是用的开发模式打包的会就会造成js源码泄露

node.js打包 就不能用上面一样的方式打包了,不然会报错

将上一章的fil.js 打包

const path = require('path');
const nodExternals = require('webpack-node-externals');
 
 
module.exports = {
    entry: './file.js',  // 入口文件  注意: ./是必带的
    output: {
        filename: 'bun2.js',  //输出文件名
        path: path.resolve(__dirname, 'dist'),   //输出目录的绝对路径
    },
    target: 'node',
    externals:[nodExternals()],
    mode: 'production', // 生产环境模式
};
 

将打包好的js文件运行

可以正常访问

 源代码中什么js文件都没有 一般node.js 是不需要打包的,毕竟没打包之前也看不到加载的js文件

简单来说,webpack具备以下功能:

1、支持js模块化

2、处理css兼容性

3、将多个html/css/js文件压缩合并

#源码泄漏:

1、mode配置

production(生产),development(开发),开发模式下会存在泄漏

还原:浏览器webpack://

 

2、devtool配置

参考:开发安全典型漏洞之webpack源码泄露及防护

在使用webpack打包部署代码时,如果参数devtool配置不当,将会在部署代码文件中生成对应匹配的soucemap文件(源码映射),如果将参数devtool配置为“source-map”、“cheap-source-map”、“hidden-source-map”、“nosources-source-map”、“cheap-module-source-map”等值时,打包后将生成单独的map文件。

 配置文件

const path = require('path');
const webpack = require('webpack');
 
module.exports = {
    mode: 'production', // 生产环境模式
    entry: './main.js',  // 入口文件  注意: ./是必带的
 
    output: {
        filename: 'app-map.js',  //输出文件名
        path: path.resolve(__dirname, 'dist'),   //输出目录的绝对路径
    },
    //直接配置 devtool ,避免使用configureWebpack
  devtool:  'source-map',
};
 

打包

这里不但暴露了js文件还有加载的js文件中有个.map

右键js文件,复制地址,再访问,在地址后面加.map

打开后就可以进行还原了

还原项目:shuji,reverse-sourcemap

npm install --global shuji

shuji xxx.js.map -o xxxxxxx

npm install --global reverse-sourcemap

reverse-sourcemap --output-dir ./ xxx.js.map

识别项目:https://github.com/SunHuawei/SourceDetector

安装还原项目 直接打开终端输入上面命令即可

 先将网页中的.map 文件下载下来,直接鼠标右键点击文件,选择另存为,将.map 文件保存

然后打开ever thing 搜索shiju 打开ishuju.cmd 文件位置 将刚刚下载好的.map 文件放进去

然后再右键点击在终端中打开

先输入一个cmd ,然后再输命令

然后打开test目录 三个js文件就在里面了,打开看一下

完全和上面的是一样的

reverse-sourcemap 还原 直接在刚才的终端窗口中输入命令即可,之后就会会在文件下生成一个名叫webpack 的文件夹 里面放的就是那三个js文件 了

还有一个浏览器插件 ,一款能自动识别map文件并还原的插件工具

http://www.xdnf.cn/news/18255.html

相关文章:

  • 数据结构:二叉搜索树(Binary Search Tree)
  • Android Studio中创建Git分支
  • 高级堆结构
  • 编排之神-Kubernetes存储专题--ConfigMap演练
  • 网络编程3(网络层,数据链路层)
  • linux下timerfd和posix timer为什么存在较大的抖动?
  • 从零开始:SpringBoot与KingbaseES的完美融合实践
  • JavaScript性能优化实战(三):DOM操作性能优化
  • Ansible 管理变量和事实
  • 【撸靶笔记】第二关:GET -Error based -Intiger based
  • 【LeetCode】单链表经典算法:移除元素,反转链表,约瑟夫环问题,找中间节点,分割链表
  • 计算机网络 TCP三次握手、四次挥手超详细流程【报文交换、状态变化】
  • nn.Module模块介绍
  • USB 2.0声卡
  • 考研复习-操作系统-第一章-计算机系统概述
  • k8s-单主机Master集群部署+单个pod部署lnmp论坛服务(小白的“升级打怪”成长之路)
  • 什么是GD库?PHP中7大类64个GD库函数用法详解
  • 【撸靶笔记】第五关:GET - Double Injection - Single Quotes - String
  • Qt——主窗口 mainWindow
  • GaussDB常用术语缩写及释义
  • 【Golang】:错误处理
  • AI Search进化论:从RAG到DeepSearch的智能体演变全过程
  • 第12章《学以致用》—PowerShell 自学闭环与实战笔记
  • 第七十七章:多模态推理与生成——开启AI“从无到有”的时代!
  • 计算机程序编程软件开发设计之node..js语言开发的基于Vue框架的选课管理系统的设计与实现、基于express框架的在线选课系统的设计与实现
  • Jenkins - CICD 注入环境变量避免明文密码暴露
  • Python中f - 字符串(f-string)
  • Hadoop入门
  • 前端基础知识版本控制系列 - 05( Git 中 HEAD、工作树和索引之间的区别)
  • 图论水题4