Grunt插件之uglify--js代码压缩与合并

2024-05-31 04:48

本文主要是介绍Grunt插件之uglify--js代码压缩与合并,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      平时在开发项目的时候,都是在本地测试,加载代码都是走localhost,页面刷新基本是秒出,所以没有考虑js文件的大小。最近项目上线,部署到了服务器上之后,测试的时候发现加载速度特别慢,一查看网络,发现有的js文件加载时间居然超过1s。没办法,把代码压缩看看。果然压缩好之后加载快了很多。而将代码压缩和混淆之后,也能提高网站的安全性。

下面是使用grunt的uglify插件的安装和使用:

前提:安装了nodejs
环境:window linux iOS 通用

首先安装grunt-cli,即grunt的命令行工具,安装好之后,会将其添加到系统环境里,在系统上的任何地方都能使用grunt命令。

使用npm安装grunt-cli, nodejs自带npm包管理工具, 安装好nodejs之后,npm也就安装上了。
在系统的任何地方执行下面的命令:

npm install -g grunt-cli

安装了grunt-cli之后并不等于安装了grunt,因为grunt是随工程安装的,这样的话,可以创建多个grunt工程,在各自的工程下安装grunt工具。想要运行某一工程的话,只需要在其工程目录下运行grunt命令即可。

创建grunt项目,并安装uglify插件。

在任意目录下执行命令安装grunt和uglify插件,执行命令(本例在uglify目录下):

npm install --save grunt grunt-contrib-uglify

安装好之后,目录下回出现node_modules子目录,里面是node模块的安装位置,grunt和uglify就被安装在里面。

初始化项目:

在uglify目录下创建空文件Gruntfile.js。
在uglify目录下执行命令:

npm init

如果没有必要的修改,就一路回车,最后输入yes。初始化项目完成之后,uglify目录下会出现package.json文件,这个文件保存了项目的基本信息和入口文件等。

现在我们来编辑项目的入口文件Gruntfile.js文件。也就是package.json的main字段指定的文件,这两者必须一致。

将以下代码复制到Gruntfile.js 里:

module.exports = function (grunt) { grunt.initConfig({  uglify: {                //制定插件的名字build: {              //制定任务的名字 options: {mangle: false   //默认混淆变量名和函数名},files: [{//将数组中的文件合并 并且压缩到combine文件里'dist/combine.js':['src/a.js','src/b.js','src/c.js','src/d.js']}]}  }  }); grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
})

运行工程:

grunt uglify

这样的话,执行uglify下的所有任务(如包含多个任务的话),如果想只运行某一个任务的话,可以这样执行:

grunt uglify:build  

这样的话就只会执行uglify下的build这个任务。

上面是代码压缩的最基本的配置,下面是更多的配置,包括:
1、代码混淆的规则
2、非ascii码的处理规则
3、压缩文件的注释
4、压缩文件的格式控制
5、批量压缩的配置
6、生成sourcemap文件
7、对IE浏览器的兼容性设置
8、更多的demo请移步github

1、代码混淆的规则

module.exports = function (grunt) { grunt.initConfig({  uglify: {                //制定插件的名字build: {  //这个任务的名字叫做buildoptions :{mangle : false   //不混淆函数名和变量名 默认会混淆},files: [{      'dist/uncombineAndMangle.js':['src/b.js'] //合并压缩}]}},compress_mangle_except: {files: {'dist/compress_mangle_except.js': ['src/b.js']},options: {mangle: {except: ['dom','JQuery']  //不混淆该数组中的变量名}}},compress_mangle_beautify: {files: {'dist/compress_mangle_beautify.js': ['src/b.js']},options: {beautify: true,    //混淆但不压缩文件 footer: '\n// This is a footer.'          //在压缩文件底部加上注释}},}); grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
})

运行所有任务

grunt uglify

运行单个任务

grunt uglify:build
grunt uglify:compress_mangle_except
grunt uglify:compress_mangle_except
...

2、非ascii码的处理规则

module.exports = function (grunt) { grunt.initConfig({  uglify: {       ASCIIOnly: {src: 'src/b.js',dest: 'dist/asciionly.js',options: {mangle: false,ASCIIOnly: true   //允许将非ascii字符编码成\uxxx格式(unicode编码)汉字会被编码}},}})grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
}

执行任务

grunt uglify:ASCIIOnly

3、压缩文件的注释

module.exports = function (grunt) { grunt.initConfig({  uglify: {       comments: {src: 'src/b.js',dest: 'dist/comments.js',options: {mangle: false,preserveComments: 'some',  //保留哪些注释  可选false all some Functionfooter: '\n// This is a footer.'          //在压缩文件底部加上注释}}}})grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
}

4、压缩文件的格式控制

module.exports = function (grunt) { grunt.initConfig({  uglify: {       maxLineLen: {src: 'src/b.js',dest: 'dist/maxLineLen.js',options: {mangle: false,maxLineLen: 1000   //设置压缩文件每行的字符长度}},exportAll: {src: 'src/b.js',dest: 'dist/exportAll.js',options: {mangle: false,                    wrap: 'testExport',         //封裝成閉包,将全局变量挂载到testExport下 然后暴露出来exportAll: true             //将函数封装成闭包之后,暴露所有全局变量}},}})grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
}

5、批量压缩的配置

module.exports = function (grunt) { grunt.initConfig({  uglify: {       batch: {expand : true,            //将占位符*展开 即使用占位符匹配文件名src: 'src/**/*.js',       //压缩src目录及所有子目录下的js文件dest: 'dist',             //压缩文件存放到dist目录下的同名目录ext: '.min.js',           //压缩文件的后缀名},}})grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
}

6、生成sourcemap文件

module.exports = function (grunt) { grunt.initConfig({  uglify: {       sourcemap_basic: {src: 'src/b.js',dest: 'dist/sourcemap_basic.js',options: {sourceMap: true,     //压缩的同时  产生sourcemap 默认保存在压缩文件的同一目录sourceMapName: 'dist/source_map_custom_name'  //指定sourcemap的文件名 不指定则以压缩文件名+.map为文件名}},sourcemap_multipleFunctionNames: {src: 'src/*.js',dest: 'dist/',expand:true,  options: {sourceMap: true,             //压缩的同时  产生 sourcemapsourceMapRoot : 'dist/maps/', //指定source的根目录sourceMapName: function(dist){    //用函数计算出sorurcemap的文件名return dist + ".func.min.js.map"}}},}})grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
}

7、对IE浏览器的兼容性设置

module.exports = function (grunt) { grunt.initConfig({  uglify: {       screwIE8: {src: 'src/b.js',dest: 'dist/screwIE8.js',options: {screwIE8: false          //是否兼容ie8及以下}},}})grunt.loadNpmTasks('grunt-contrib-uglify'); //加载插件 
}

这篇关于Grunt插件之uglify--js代码压缩与合并的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017403

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: