使用UglifyJS实现一条指令打包发布项目实例

news2024/11/25 4:38:05

        在前端页面开发中,使用Vue、Angular、React等框架构建的项目通常都会自动配置集成相关代码压缩发布的工具,开发者只需要执行指定命令即可完成项目的整体压缩发布操作。对于没有使用框架的项目,需要开发者手动配置使用相关工具完成对应操作,本文介绍使用UglifyJS实现代码打包压缩的方法。

1、建立示例项目

        按照一般项目目录添加目录及文件如下:

         Demo目录为项目根目录,src目录下包含全部源文件。源文件包含一个index.html及其引用的三个js文件。

        a.js包含了一个求和的方法:

         b.js包含一个求积的方法:

         index.js包含页面load方法,用于演示求和求积方法:

         页面打开就显示两个运算结果:

         此时,页面加载了全部的四个源文件,且都未经过压缩打包,能看到全部的源代码包括注释:

 2、打包目标

        为减少请求,将a.js、b.js、index.js合并为一个index.js(实际项目中根据实际需求考虑是否需要合并),使用一条指令(npm run build)就能完成打包发布操作。打包后文件存放于demo/dist/目录,不修改源文件。

3、安装UglifyJS

        UglifyJS是个包含JS解释器、代码最小化、压缩、美化的工具集,是前端开发打包的最常用工具之一。UglifyJS基于Node.js开发,所以要确保安装了Node.js环境。首先使用指令完成项目的node初始化配置:

npm init -y

        项目初始化完成后,为项目添加并安装UglifyJS依赖包:

npm install uglify-js --save-dev

        以上步骤完成后,项目的打包工具就安装完成了,此时项目多了package.json及安装的node_modules:

 4、配置打包指令及脚本

        在package.json的脚本节点添加打包指令:

        当使用npm run build 指令时就会调用 node build.js 执行build.js脚本文件。

        接下来就是编写build.js脚本文件,在项目根目录新建build.js文件。

        脚本文件需要完成的工作有:

4.1、清除原有dist目录中的文件。

        编写清空目录方法,清空dist目录:

const fs = require('fs');
const path = require('path');
const UglifyJS = require("uglify-js");

//递归清空目录
function clearDirectory(dirPath) {
    if (!(fs.existsSync(path) && fs.statSync(path).isDirectory())) return;
    const files = fs.readdirSync(dirPath);
    for (const file of files) {
        const filePath = path.join(dirPath, file);
        if (fs.statSync(filePath).isFile()) {
            fs.unlinkSync(filePath);
        } else {
            clearDirectory(filePath);
            fs.rmdirSync(filePath);
        }
    }
}

const targetDirectory = 'dist';
clearDirectory(targetDirectory);

4.2、将src目录中的文件全部拷贝到dist目录中

        编写目录拷贝方法将src目录下文件全部拷贝到dist目录下:

//递归目录拷贝
function copyDirectory(sourceDir, targetDir) {
    fs.mkdirSync(targetDir, { recursive: true });
    const files = fs.readdirSync(sourceDir);
    for (const file of files) {
        const sourcePath = path.join(sourceDir, file);
        const targetPath = path.join(targetDir, file);
        if (fs.statSync(sourcePath).isFile()) {
            fs.copyFileSync(sourcePath, targetPath);
        } else {
            copyDirectory(sourcePath, targetPath);
        }
    }
}

const sourceDirectory = 'src';
copyDirectory(sourceDirectory, targetDirectory);

4.3、将a.js、b.js、index.js 合并打包为新的index.js

        调用UglifyJS将以上三个js打包合并为一个index.js:

let result = UglifyJS.minify({
    "src/a.js": fs.readFileSync("src/a.js", "utf8"),
    "src/b.js": fs.readFileSync("src/b.js", "utf8"),
    "src/index.js": fs.readFileSync("src/index.js", "utf8")
});
fs.writeFileSync('dist/index.js', result.code);

4.4、删除index.html中多余的a.js和b.js引用

        通过替换字符串的方式,删除index.html中多云的js引用:

//替换代码文件中的字符串
function replaceStringInFile(filePath, searchStr, replaceStr) {
    let fileContent = fs.readFileSync(filePath, 'utf8');
    const regex = new RegExp(searchStr, 'g');
    fileContent = fileContent.replace(regex, replaceStr);
    fs.writeFileSync(filePath, fileContent, 'utf8');
}
replaceStringInFile("dist/index.html", '<script src="a.js"></script>', '');
replaceStringInFile("dist/index.html", '<script src="b.js"></script>', '');

4.5、删除复制到dist中多余的a.js和b.js

//删除多余的文件
fs.unlinkSync("dist/a.js");
fs.unlinkSync("dist/b.js");
console.log("build done.");

5、打包结果

        执行指令 npm run build,打包完成后项目根目录多了dist目录,里边包含了输出的文件:

         dist目录中index.html已经去掉了a.js和b.js的引用,index.js是合并压缩后的代码:

function sum(e){let n=0;for(let t=0;t<e.length;t++)n+=e[t];return n}function multiply(e){let n=1;for(let t=0;t<e.length;t++)n*=e[t];return n}function load(){document.getElementById("pSum").innerText="sum([1,2,3,4,5])="+sum([1,2,3,4,5]),document.getElementById("pMultiply").innerText="multiply([1,2,3,4,5])="+multiply([1,2,3,4,5])}

        发布版页面效果与开发版一致,但是加载文件少了,且js已经压缩:

 6、开启source map

        如果有需要在发布环境查看压缩前的源代码,可以在打包压缩的时候开启source map:

let result = UglifyJS.minify({
    "src/a.js": fs.readFileSync("src/a.js", "utf8"),
    "src/b.js": fs.readFileSync("src/b.js", "utf8"),
    "src/index.js": fs.readFileSync("src/index.js", "utf8")
}, {
    sourceMap: {
        url: "index.js.map",
        root: "../"
    }
});
fs.writeFileSync('dist/index.js', result.code);
fs.writeFileSync('dist/index.js.map', result.map);

        就是在调用UglifyJS.minify()方法时,多传了一个配置sourceMap的参数。

        url: "index.js.map" 表示文件压缩后会自动在index.js的末尾加上指定映射文件url的注释代码:

         root: "../" 用于指定源文件的位置,必须确保 root配置的值加上UglifyJS.minify()方法中第一个参数的key值所拼接的路径文件能够正常访问。本例中即必须确保 "../" 加上 "src/a.js", "../" 加上 "src/b.js","../" 加上 "src/index.js" 三个路径能正常访问,才能在页面加载时浏览器能自动通过隐射加载到对应源文件。

        重新运行npm run build 可以发现dist目录下就多了一个index.js.map文件:

        再看发布页面,浏览器会自动加载隐射的源文件,在压缩后的index.js中添加断点,会自动定位到源文件中对应的位置:

         以上,项目打包发布差不多就这些了。

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

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

相关文章

【OBS】SpringBoot + Vue + el-upload 通过临时 URL 上传文件到 OBS

华为云OBS的官方文档&#xff08;链接&#xff1a;https://support.huaweicloud.com/sdk-java-devg-obs/obs_21_0901.html#section1&#xff09;中关于上传文件的内容&#xff0c;只提供了使用JAVA获取临时上传链接&#xff0c;并使用JAVA创建请求上传纯文本的方法。想要把这部…

离线分析fsimage文件进行数据深度分析

以离线分析FsImage文件进行数据深度分析 整个方案的基本架构&#xff1a; FsImage文件时HDFS存放在NameNode中的镜像文件&#xff0c;里面包括了整个HDFS集群的目录和文件信息&#xff0c;(类似于一个索引目录部分数据的文件)&#xff0c;而且HDFS提供了命令可以将FsImage文件…

【严重】VMware Aria Operations for Networks 远程代码执行漏洞(存在POC)

漏洞描述 VMware Aria Operations for Networks (前名为vRealize Network Insight)是 VMware 公司提供的一款网络可视性和分析工具&#xff0c;用于优化网络性能或管理各种VMware和Kubernetes部署。 VMware Aria Operations for Networks 6.x版本中由于 createSupportBundle…

How to fix the global rice crisis 如何应对全球稻米危机 | 经济学人20230401版双语精翻

4月1日《经济学人》周报封面即社论区&#xff08;Leaders&#xff09;精选文章&#xff1a;《如何应对全球稻米危机》&#xff08;How to fix the global rice crisis&#xff09;。 “民以食为天”语出《孟子公孙丑上》&#xff0c;强调&#xff1a;人民的生命福祉和国家的繁荣…

每日一练 | 华为认证真题练习Day62

1、广播地址是网络地址中主机位全部置为1的一种特殊地址&#xff0c;它也可以做为主机地址使用。 A. True B. False 2、如图所示&#xff0c;如果管理员希望能够提升此网络的性能&#xff0c;则下面哪一种方法最合适&#xff1f; A. 使用交换机把每台主机连接起来&#xff0c…

java8 (jdk 1.8) 新特性——Stream ApI以及具体实例

在java8 中&#xff0c;有两个最重要的改变&#xff0c;一个就是之前了解的Lmbda java8 (jdk 1.8) 新特性——Lambda ,还有一个就是Stream Api 1. 什么是Stream API 简单来说就是一个类库&#xff0c;里边有一些方法方便我们对集合数据进行操作&#xff0c;就好像使用 SQL 语…

是单例模式,不是单身

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击学习更多 &#x1f310;关键&#xff1a;JavaScript 单例 设计模式 单例模式的定义是&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问…

数据结构05:树与二叉树[C++][线索二叉树:先序、中序、后序]

图源&#xff1a;文心一言 考研笔记整理1.4W字&#xff0c;小白友好、代码先、中序可跑&#xff0c;后序代码有点问题仅作记录~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、写BUG、画导图、画配图~&#x1f9e9;&#x1f9e9; 参考用书&#xff1a;王道考研《2024…

领域事件解读

文章目录 EventBus简介DDD领域事件架构简析快速入门pom依赖bean配置PublisherSubscriber 设计原理PublisherSubscriber 事件总线(EventBus)&#xff0c;设计初衷是解耦系统模块&#xff0c;将系统中的各类业务操作抽象为事件模型&#xff0c;我们把产生事件的部分称之为事件的发…

电容笔哪个厂家的产品比较好?时下热门的平替苹果笔

苹果原装的Pencil&#xff0c;在市场上可是炙手可热的&#xff0c;而且苹果的这款pencil&#xff0c;也不是什么便宜的。当然&#xff0c;你可以用这个苹果笔搭配iPad&#xff0c;不过&#xff0c;如果你不想花很多钱&#xff0c;那就可以换一支普通的平替电容笔。就当前的技术…

一篇搞定C语言操作符(详解含示例)

目录 一.操作符是什么&#xff1f; 基本特征 语义 优先级 结合性 二.操作符的分类 三.操作符各类详解 1.算数操作符&#xff08; - * / %&#xff09; &#xff08;1&#xff09;优先级&#xff1a; &#xff08;2&#xff09;除法操作符&#xff08;…

数学基础-标量,向量,张量

前言 数学中&#xff0c;如何描述事务&#xff0c;以棍子为例子&#xff1a; 棍子的长度棍子方向棍子转向… 标量 单纯的形容事务的一个特征&#xff0c;如果体积&#xff0c;长度。 向量 指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带…

利用腾讯云推流做7*24小时云直播

早在10年前&#xff0c;直播刚刚火的的时候&#xff0c;我就写过一个基于RTMP推流的直播工具&#xff0c;但没有利用起来&#xff0c;一直荒废了。想想真是可惜&#xff0c;不过谁怪咱精力有限切没有商业头脑呢。 最近刷B站&#xff0c;一位UP分享了无人值守的云直播方案&…

21JS12——内置对象

文章目录 一、内置对象二、查文档1、 MDN2、如何学习对象中的方法 三、Math对象1、Math对象2、案例-封装自己的数学对象3、Math的几个方法&#xff08;1&#xff09;绝对值&#xff08;2&#xff09;三个取整方法&#xff08;3&#xff09;随机数方法random&#xff08;&#x…

【深度学习】3-2 神经网络的学习- mini-batch学习

机器学习使用训练数据进行学习。使用训练数据进行学习&#xff0c;就是针对训练数据计算损失函数的值&#xff0c;也就是说,训练数据有100个的话&#xff0c;就要把这 100个损失函数的总和作为学习的指标。 求多个数据的损失函数&#xff0c;要求所有训练数据的损失函数的综合…

INTERSPEECH2023|达摩院语音实验室入选论文全况速览

近日&#xff0c;语音技术领域旗舰会议INTERSPEECH 2023公布了本届论文审稿结果&#xff0c;阿里巴巴达摩院语音实验室有17篇论文被大会收录。 01 论文题目&#xff1a;FunASR: A Fundamental End-to-End Speech Recognition Toolkit 论文作者&#xff1a;高志付&#xff0c;…

基于 AntV G2Plot 来实现一个 堆叠柱状图 加 折线图 的多图层案例

前言 最近研究了一下antv/g2的组合图例&#xff0c;并尝试做了一个不算太难的组合图&#xff0c;下面介绍一下整个图里的实现过程。 最终效果图 先来看一下最终的效果图 该图表有两部分组成&#xff0c;一部分是柱状图&#xff0c;准确说是堆叠的柱状图&#xff0c;一个柱…

【TA100】图形 3.5 Early-z和Z-prepass

一、深度测试&#xff1a;Depth Test 1.回顾深度测试的内容 深度测试位于渲染管线哪个位置 ○ 深度测试位于逐片元操作中、模板测试后、透明度混合前 为什么做深度测试 ● 深度测试可以解决&#xff1a;物体的可见遮挡性问题 ○ 我们可以用一个例子说明 ■ 图的解释&…

windows应急整理

windows应急整理 Virustotal 网站分析恶意样本 BrowingHistoryView 查看浏览器所有历史记录,可能会请求攻击者的恶意网站或者下载东西 启动项检查 开机启动项文件夹 msconfig 注册表run 键值查看 启动项 临时文件检查,temp 目录权限特殊,容易成为被利用对象 %temp%查看 tem…