gulp 一般用于处理自动化任务,默认情况无法处理模块化,也不会用于大型项目,但它可以使用各种插件来编译 htmlcssjs 等资源。

不清楚如何使用 gulp 开启任务的朋友可以参考 gulp使用指南

处理html

处理 html 资源使用到 gulp-htmlmin 这个插件,和 webpack中使用到的html-webpack-plugin 比较相似。

// gulpfile.js
const { src, dest } = require('gulp');
const htmlMin = require('gulp-htmlmin'); const htmlTask = () => {
// base 表示基本目录,编译后会保持原文件结构
  return src('./src/*.html', { base: './src' })
    .pipe(
      htmlMin({
        collapseWhitespace: true,
      })
    )
    .pipe(dest('./dist'));
}; module.exports = {
  htmlTask,
};

执行 npx gulp htmlTask ,此时将 html 资源编译输出到 dist 文件夹下

处理less

要处理布局就免不了样式文件,处理 less 文件需要用到 gulp-less,如果对于 css 兼容性还要做处理的话,就需要用到 postcss 和它所需要的插件 postcss-preset-envwebpack处理css资源 文章中有详细介绍

const { src, dest } = require('gulp');
const less = require('gulp-less');
const postcss = require('gulp-postcss');
const postCssPresetEnv = require('postcss-preset-env'); const lessTask = () => {
return src('./src/css/*.less', { base: './src' })
.pipe(less())
.pipe(postcss([postcssPresetEnv()]))
.pipe(dest('./dist'));
}; module.exports = {
  lessTask,
};

执行 npx gulp lessTask,less 文件会被处理成 css 文件

处理js

gulp-babel 用于转化代码等兼容处理,用法和 webpack中babel-loader 相似,gulp-terser 用于压缩文件,用法和 terser-webpack-plugin 相似。

const { src, dest } = require('gulp');
const terser = require('gulp-terser');
const babel = require('gulp-babel'); const jsTask = () => {
  return src('./src/js/*.js', { base: './src' })
    .pipe(babel({ presets: ['@babel/preset-env'] }))
    .pipe(terser({ mangle: { toplevel: true } }))
    .pipe(dest('./dist'));
}; module.exports = {
htmlTask,
lessTask,
jsTask,
};

执行 npx gulp jsTask,编译后文件能看到es6转换es5和压缩的代码。

html资源注入

编译后的 css 和 js 资源不会被默认添加到 html 页面中,我们需要借助插件 gulp-inject 帮助编译,并在模板 html 文件中添加魔法注释,告知资源引入的地址。

const { src, dest } = require('gulp');
const inject = require('gulp-inject'); const injectHtml = () => {
  return src('./dist/*.html')
    .pipe(
// 使用相对路径将js和css资源引入
      inject(src(['./dist/js/*.js', './dist/css/*.css']), {
        relative: true,
      })
    )
    .pipe(dest('./dist'));
}; module.exports = {
  injectHtml,
};

在 html 文件中添加了魔法注释,所以需要重新编译 html 文件,再将 js 和 css 引入到 html 页面中。依次执行 npx gulp htmlTasknpx gulp injectHtml,将编译后的 html 文件格式化,可以看到已经在指定位置引入了 js 和 css 文件。

开启自动服务

在开发的时候,通常希望开启一个服务,当文件内容发生变化时,编译后的代码也同步发生变化,能够更好的查看代码执行的效果,这时候要用到 browser-sync 来操作。

const { src, dest, watch } = require('gulp');
const browserSync = require('browser-sync'); const bs = browserSync.create();
const serve = () => {
// 当文件变化时,重新编译文件,并注入到 html 文件中
  watch('./src/*.html', series(htmlTask, injectHtml));
  watch('./src/js/*.js', series(jsTask, injectHtml));
  watch('./src/css/*.less', series(lessTask, injectHtml)); // 自动服务的配置
  bs.init({
    port: 8808,
    open: true,
    files: './dist',
    server: {
      baseDir: './dist',
    },
  });
}; module.exports = {
  serve,
};

此时服务不会中断,代码更新就会重新编译文件

组合任务

以上每个任务都是独立的,每种类型文件的编译都需要执行一次命令,开启自动服务也必须先将 html、css、js 执行编译到 dist 文件夹下才行,执行命令的次数会太繁琐,可以将他们进行一个整合。

const { series, parallel } = require('gulp');
// series 表示串行,parallel 表示并行
const buildTask = series(parallel(htmlTask, lessTask, jsTask), injectHtml);
const serveTask = series(buildTask, serve); module.exports = {
  buildTask,
  serveTask,
};

这样只需要导出两个任务,就可以覆盖 编译 和 开启自动服务 两个场景,还可以在 package.json 中配置 script 命令,就可以直接通过 npm 来执行任务,执行 npx gulp serveTask

总结

  • html 文件通过插件 gulp-htmlmin 对代码压缩
  • less 文件使用插件 gulp-less 解析, css 文件兼容性通过 gulp-postcss postcss-preset-env 处理
  • js 文件使用 gulp-babel 进行代码转换,gulp-terser 压缩代码
  • gulp-inject 配合魔法注释将资源添加到 html 页面中
  • browser-syncwatch 为编译开启自动服务
  • series parallel 串行和并行组合任务

以上就是 gulp 处理html、css、js资源的介绍, 更多有关 前端工程化 的内容可以参考我其它的博文,持续更新中~

gulp来处理html、css、js资源啦的更多相关文章

  1. NanUI文档 - 打包并使用内嵌式的HTML/CSS/JS资源

    NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript相互掉用(待更新...) 如何处理Nan ...

  2. WebJars 进行 css js 资源文件管理

    WebJars是将这些通用的Web前端资源打包成Java的Jar包,然后借助Maven工具对其管理,保证这些Web资源版本唯一性,升级也比较容易.关于webjars资源,有一个专门的网站http:// ...

  3. Asp.net 引用css/js资源文件

    注意Page.ResolveUrl之前的双引号,不是单引号 <script type="text/javascript" src="<%= Page.Reso ...

  4. Gulp:静态资源(css,js)版本控制

    为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源: 然后涉及到的html模板里的src也要做相应的修改,静态资源需要优化(压缩合并) 文件目录 ...

  5. gulp为css,js添加版本号

    由于cdn缓存,更改样式后会有一段时间不生效,解决方法就是给css,js加上版本号效果如下: 1.安装gulp插件 npm install --save-dev gulp-rev (version:9 ...

  6. 开源组件NanUI一周年 - 使用HTML/CSS/JS来构建.Net Winform应用程序界面

    NanUI是什么 NanUI基于ChromiumFX项目进行开发,它能让你在你的Winform应用程序中使用HTML5/CSS3/Javascript等网页技术来呈现用户界面(类似Electron). ...

  7. gulp插件构建项目 压缩js、css、image、zip、web服务、跨域等插件

    推荐一个很好文: https://github.com/lin-xin/blog/issues/2 匹配符 *.**.!.{} gulp.src('./js/*.js') // * 匹配js文件夹下所 ...

  8. gulp自动刷新和css、js压缩

    之前搭建过Grunt,但是用起来有点繁琐,后来有人跟我说gulp更多简单.所以今天又搭建一个gulp.在使用gulp前应该有nodeJs环境,安装完nodejs后,就可以开始gulp的搭建了. 先新建 ...

  9. 运用Gulp压缩文件编译文件。包括css js html image

    安装node.js  npm  以及安装gulp等方法我就不在这里赘述了. 接下里我主要介绍的是Gulpfile文件里面的配置该如何书写. var gulp = require('gulp');//引 ...

  10. Spring MVC程序中得到静态资源文件css,js,图片

    转载自:http://www.blogjava.net/fiele/archive/2014/08/24/417283.html 用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题, ...

随机推荐

  1. OFFICE-利用Word邮件合并功能联动编辑《目标责任成本调整说明》

    正文 00.开始以及目标 0.1 开始 众所周知的原因,X建工的很多文档都提供了一个填写模板,这是个好事.但是捏,当他们把模板放下来要来填数的时候,你会发现所有的数据,都是在不同的文档中搬来搬去,这点 ...

  2. Layui 2.8.0 正式发布,官网全新文档站朴实归来

    前言 两年前 Layui 官网宣布了下线声明,说实话当时内心确实感慨万千毕竟这个免费为我们后端程序员提供的一个前端快熟开发框架的官网就这样下线了确实十分的惋惜,但是庆幸的是官网的下线,只是单纯一个网站 ...

  3. Syncthing 忽略模式

    忽略模式 概要 .stignore 描述 这是 Syncthing 同步文件夹的忽略模式语法指南 语法 .stignore 文件可包含一系列路径匹配模式,对指定文件的处理方式由第一个匹配到它的模式决定 ...

  4. 2023-04-14:n对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手, 人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的ID, 情侣们按顺序编号,第一对

    2023-04-14:n对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手, 人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的ID, 情侣们按顺序编号,第一对 ...

  5. 2021-09-01:三数之和。给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    2021-09-01:三数之和.给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. ...

  6. gitlab-runner 中的 Docker-in-Docker

    笔者个人理解:gitlab-runner 安装后就是一个监听状态的 runner,而通过 gitlab-runner register 注册的"实例"其实只是预定义的配置节,当消息 ...

  7. Kafka 杂谈

    开始之前 首先,此篇文章会有很多地方会和 RocketMQ 比较,不太熟悉 RocketMQ 可以去看看我之前写的RocketMQ基础概念剖析&源码解析,先有个大概的印象,可能会帮助你更好的理 ...

  8. [MAUI]模仿Chrome下拉标签页的交互实现

    @ 目录 创建粘滞效果的圆控件 贝塞尔曲线绘制圆 创建控件 创建形变 可控形变 形变边界 形变动画 创建手势控件 创建页面布局 更新拖拽物位置 其它细节 项目地址 今天来说说怎样在.NET MAUI中 ...

  9. 美女同事的烦恼:如何配置 Apache SkyWalking 告警?

    小婉 技术部基本上是一个和尚庙,女生非常少,即使有女生也略微有点抽象,小婉就不一样,她气质绝佳. 上午,同事小婉刚才从老板办公室里出来,看上去一脸不悦的样子.为了表示对同事的关(ba)心(gua),我 ...

  10. 你是怎么学习 Java 技术的?

    一.Java 语言 Java 语言不只是一门语言. Java 学习不是一蹴而就就可以达成的,它是一个循序渐进,由浅入深,由表及里的过程.尤其需要注意的是不能有浅尝辄耻,不求甚解的态度.每个地方只抓一点 ...