webpack03

什么是source-map

将代码编译压缩之后,,可以通过source-map映射会原来的代码,,,在调试的时候可以准确找到原代码报错位置,,,进行修改
source-map有很多值:

  • eval : 会在eval执行的代码后面添加 source-map
  • source-map : 生成一个独立source-map,,在整个打包后的js后面
  • eval-source-map : 会在eval执行代码的后面添加source-map…但是这个source-map是以Data url(base64编码)嵌入进去的。。。。为什么写在eval()中,因为这种source-map的魔法注释,只有在eval()函数中才生效,,其他函数不生效
  • inline-source-map : 生成sourcemap,在打包js的后面,但是是以Data url 形式
  • cheap-source-map : 会生成sourcemap,但是会更高效一些,因为他没有生成列映射(column mapping),也就是说,,只会定位到哪一行错了,,不会定位到哪一列
  • cheap-module-source-map: 在cheap-source-map 的基础上,对来自于loader的source-map会处理的更好,,,,,当代码被loader处理过,,比如说ts-loader,,使用cheap-source-map映射出的代码,是有一些差距的,,需要使用cheap-module-source-map
  • hidden-source-map : 会生成sourcemap,但是不会对 source-map文件进行引用,,相当于删除了打包文件中对sourcemap的引用注释
  • nosources-source-map : 会生成sourcemap,但是生成的sourcemap只有错误信息的提示,不会生成源代码文件

vue脚手架使用的是 source-map
react脚手架使用 cheap-module-source-map ,

开发或者测试阶段: 推荐使用 source-mapcheap-module-source-map
发布阶段: 不写


source-map 结构

在这里插入图片描述

  • version : 版本
  • file: 打包之后生成的文件名
  • mapping : source-map的核心,描述编译后代码的每一行,以及他和源代码的映射关系
  • names: 丑化js之后,,转换之前的变量 和 丑化的变量,,的对应关系
  • sources : 源文件js,的位置
  • sourcesContent: 源文件内容数组,,与sources对应
  • sourceRoot: 源文件的相对根目录,,可以和sources中的路径拼接,构成完整路径

浏览器会根据注释去加载source-map,还原源代码

wepack中mode模式:

  • none
  • development
  • production : 默认

developmentproduction 下面分别有自己的配置,,相当于设置一个,就等于默认使用了配置好的参数,,,

development模式下的 source-map 是 eval,production默认是没有source-map

babel

Babel是一种javascript编译器:

  • es6转换成浏览器兼容的javascript
  • typescript转换
  • jsx转换 ===》 vue中也可以用jsx

本质是一个工具链,和postcss很类似,,,是一种微内核架构,只会保留自己的核心代码,,, 自己可以写插件扩展功能

babel命令行使用
插件的使用

babel他可以脱离webpack使用,,,命令行使用需要@babel/cli

  • 插件的使用
    1. 安装依赖
    npm install @babel/core @babel/cli -D
    # 安装插件
    # 转换箭头函数
    npm install @babel/plugin-transform-arrow-functions
    # 将let或者const转换为var
    npm install @babel/plugin-transform-block-scoping
    
    1. 命令行使用插件
    npx babel ./src/main.js --out-file dist/index.js --plugins=@babel/plugin-transform-arrow-functions,@babel/plugin-transform-block-scoping
    
  • preset 预设的使用
    Babel中除了插件(Plugins)外,,还有一种叫预设(Presets)的概念,,,预设是Babel的一组插件的组合,,针对特定的目标,封装了多个插件的配置,,让开发者不需要一个个手动配置插件。。他会帮你去找对应的插件解析,,预设的分类:
  • @babel/preset-env : 将高级js ===》 浏览器识别的js
  • @babel/preset-react : 支持 jsx编译
  • @babel/preset-typescript : 支持typescript编译
  1. 安装依赖 npm i @babel/preset-env
  2. 命令行使用
npx babel ./src/main.js --out-file dist/index.js --presets @babel/preset-env
webpack整合babel
  1. 安装依赖 npm i babel-loader
  • 通过插件
const path = require("path");
module.exports = {
    mode:"development",
    devtool: "source-map",
    entry:"./src/main.js",
    output:{
        filename:"bundle.js",
        path: path.resolve(__dirname,"./dist")
    },
   module:{
        rules:[
            {
                test:/\.js$/,
                exclude:/node_modules/,
                use:[
                    {
                        loader:"babel-loader",
                        options:{
                            plugins:[
                                "@babel/plugin-transform-arrow-functions",
                                "@babel/plugin-transform-block-scoping"
                            ]
                        }
                    }
                ]
            }
        ]
   }
}

  • 通过预设
const path = require("path");
module.exports = {
    mode:"development",
    devtool: "source-map",
    entry:"./src/main.js",
    output:{
        filename:"bundle.js",
        path: path.resolve(__dirname,"./dist")
    },
   module:{
        rules:[
            {
                test:/\.js$/,
                exclude:/node_modules/,
                use:[
                    {
                        loader:"babel-loader",
                        options:{
                            "presets":[
                                "@babel/preset-env"
                            ]
                            // plugins:[
                            //     "@babel/plugin-transform-arrow-functions",
                            //     "@babel/plugin-transform-block-scoping"
                            // ]
                        }
                    }
                ]
            }
        ]
   }
}

使用多个preset:

  "presets":[
              ["@babel/preset-env",{
                  useBuiltIns:"usage",
                     corejs:3.8
                 }],
                 ["@babel/preset-react"],
                 ["@babel/preset-typescript"]
             ]
什么是polyfill

polyfill: 填充材料,,填充物,,可以理解成补丁,,主要是为了给在旧版本浏览器不支持的js新特性加补丁,,poilyfill是一种代码实现,,他提供了现代JavaScript特性的“模拟实现”,,当目标环境不支持该特性时,,polyfill会为其提供一个实现,让旧的浏览器支持这些新特性,,,比如Promise ,Symbol

Babel提供的polyfill插件:@babel/plugin-transform-runtime
在使用@babel/preset-env时,可以配置polyfill来提供支持,,需要配置useBuiltIns,这个useBuiltIns 有三个属性:

  • false : 打包后的文件不使用polyfill来配置
  • usage :会根据源代码中的语言特性,自动检测所需要的polyfill,,,, 这样可以让最终包里面的polyfill最小化,
  • entry : 这个会根据browserlist目标 导入所有的polyfill,包会变大
    "presets":[
	          ["@babel/preset-env",{
	                  useBuiltIns:"usage",
	                     corejs:3.8
	                 }]
	             ]
babel编译器执行过程

源代码 ===》 词法分析(Lexical Analyse) ===> 将词法分析的每个词变成tokens ==》token : {type:类型,value:值}. ===> 语法分析 ===>>
不同语言进行不同的翻译 ===》 抽象语法树 AST ===〉 遍历这个树(traversal) ===》 访问节点值(visitor) ===> 将每一个节点通过插件进行转换 ===〉 变成新的AST ===》 AST转换成目标代码

babel的配置文件

babel的配置也可以写到一个独立的文件,,

  • babel.config.json
  • .babelrc.json

rc: run commands. 或者。run configuration的缩写

名词
  • 魔法注释: 浏览器会处理的注释,,类似:打包之后的js引入source-map一样
  • 多包管理 : 比如element-plus ,,每一个组件都是一个包,都有自己的入口文件,有package.json

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H266/VVC 帧内预测中 ISP 技术

帧内子划分 ISP ISP 技术是在 JVET-2002-v3 提案中详细介绍其原理,在 VTM8 中完整展示算法。ISP是线基内预测(LIP)模式的更新版本,它改善了原始方法在编码增益和复杂度之间的权衡,ISP 算法的核心原理就是利用较近的像…

day05_Spark SQL

文章目录 day05_Spark SQL课程笔记一、今日课程内容二、Spark SQL 基本介绍(了解)1、什么是Spark SQL**为什么 Spark SQL 是“SQL与大数据之间的桥梁”?****实际意义**为什么要学习Spark SQL呢?**为什么 Spark SQL 像“瑞士军刀”&#xff1…

Win11+WLS Ubuntu 鸿蒙开发环境搭建(二)

参考文章 penHarmony南向开发笔记(一)开发环境搭建 OpenHarmony(鸿蒙南向开发)——标准系统移植指南(一) OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(二&…

【杂谈】-50+个生成式人工智能面试问题(四)

7、生成式AI面试问题与微调相关 Q23. LLMs中的微调是什么? 答案:虽然预训练语言模型非常强大,但它们并不是任何特定任务的专家。它们可能对语言有惊人的理解能力,但仍需要一些LLMs微调过程,开发者通过这个过程提升它…

【深度学习】数据预处理

为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始, 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中,我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样,pan…

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂,在苦难中萃取的坚韧才值得珍视; 痛苦同样不必美化,从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角, 但每个人又都是自己生活剧本里的英雄。滑雪,是姿态优雅的“贴地飞行”,也有着成…

城市生命线安全综合监管平台

【落地产品,有需要可留言联系,支持项目合作或源码合作】 一、建设背景 以关于城市安全的重要论述为建设纲要,聚焦城市安全重点领域,围绕燃气爆炸、城市内涝、地下管线交互风险、第三方施工破坏、供水爆管、桥梁坍塌、道路塌陷七…

请求方式(基于注解实现)

1.编写web.xml文件配置启动信息 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app><display-name>Archetype Created Web Application</di…

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包&#xff0c;其会先下载KEGG官网上的通路图&#xff0c;然后整合输入数据对通路图进行再次渲染&#xff0c;从而对KEGG通路图进行一定程度上的个性化处理&#xff0c;并且丰富其信息展示。&#xff08;KEGG在线数…

数据结构:DisjointSet

Disjoint Sets意思是一系列没有重复元素的集合。一种常见的实现叫做&#xff0c;Disjoint-set Forest可以以接近常数的时间复杂度查询元素所属集合&#xff0c;用来确定两个元素是否同属一个集合等&#xff0c;是效率最高的常见数据结构之一。 Wiki链接&#xff1a;https://en…

更好的世界:用定制托管对象上下文(NSManagedObjectContext)防止产生“空白”托管对象(下)

概述 用 SwiftUI CoreData 这对“双剑合璧”的强力开发组合&#xff0c;我们可以事倍功半、非常 easy 的开发出界面元素丰富且背后拥有持久数据库支持的 App。 不过&#xff0c;在某些情况下它们被误用或错用也可能带来一些“藏形匿影”的顽疾。 在本篇博文中&#xff0c;您…

个人在技术领导力方面的自我反思与提升

大家好&#xff01;我是 [数擎 AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | A…

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B&#xff5c;开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行&#xff0c;在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…

排列高手

这篇主要是求再排位为 {1&#xff0c;3&#xff0c;4&#xff0c;....&#xff0c;n&#xff0c;2}的最优顺序下求mex。 但不知道为什么这样是最优 子数列的个数公式&#xff1a; 对于一个长度为N的数组&#xff0c; #include <bits/stdc.h> using namespace std; lon…

公众号如何通过openid获取unionid

通过接口 https://api.weixin.qq.com/cgi-bin/user/info?access_tokenxxxxxxx&langzh_CN 返回的数据如下&#xff1a; 前提是必须绑定 微信开放平台 token如何获取呢 代码如下&#xff1a; String tokenUrl "https://api.weixin.qq.com/cgi-bin/token"; …

软件测试预备知识④—NTFS权限管理、磁盘配额与文件共享

在软件测试的实际环境搭建与管理过程中&#xff0c;了解和掌握NTFS权限管理、磁盘配额以及文件共享等知识至关重要。这些功能不仅影响系统的安全性和稳定性&#xff0c;还对测试数据的存储、访问以及多用户协作测试有着深远的影响。 一、NTFS权限管理 1.1 NTFS简介 NTFS&am…

类结构——构造方法

类结构——构造方法 构造方法的基本特性默认构造方法构造方法重载使用this关键字私有构造方法总结 构造方法&#xff08;Constructor&#xff09;是Java编程语言中的一个重要概念&#xff0c;用于初始化新创建的对象。在对象实例化时被调用&#xff0c;并负责设置对象的初始状态…

【linux系统之redis6】redis的安装与初始化

下载redis的linux对应的安装包&#xff0c;并上传到linux虚拟机里面 解压压缩包 tar -zxzf redis-6.2.6.tar.gz解压后&#xff0c;进入redis文件 cd redis-6.2.6执行编译 make && make install看到下图&#xff0c;就说明redis安装成功了 默认的安装路径&#xff0c…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…