前端自动化构建配置清单

  为了节省http请求次数、节约带宽,加速页面渲染速度,达到更好用户体验的目的。现在普遍的做法是在上线之前做静态资源的打包构建,也就是静态资源的合并压缩;

  这里使用的是gulp,当然现在有更强大的模块化构建工具webpack,大家可以尝试一下,但是不管用什么工具,只要能解决对应的问题,就是好工具;

  大家注意,使用gulp需要先安装node哦,具体安装教程请百度一下

资源构建无非就是下面几个步骤:

  1. css、js、image的合并压缩
  2. 给css、js、image合并后添加版本号(hash),生成对应的manifest文件,这一步非常重要
  3. 根据manifest文件来替换HTML文件和css文件中的对应资源路径

看起来就几个步骤,做起来还是挺麻烦的:

1、首先先在根目录打开命令行做项目依赖初始化:

npm init -y

2、在根目录创建一个gulpfile.js文件

3、安装gulp的依赖,通过npm来安装,如下,并在gulpfile中引入(commonjs规范,使用require来引入模块)

var gulp = require(‘gulp‘);
var rev = require(‘gulp-rev‘); // 创建版本号(hash)值
var revCollector = require(‘gulp-rev-collector‘); // 将版本号添加到文件后
var sequence = require(‘run-sequence‘); // 让gulp任务同步运行
var clean = require(‘gulp-clean‘); // 清除dist构建目录
var htmlmin = require(‘gulp-htmlmin‘); // 压缩html
var cssnano = require(‘gulp-cssnano‘); // css压缩
var autoprefixer = require(‘gulp-autoprefixer‘); // 自动处理css兼容后缀
var babel = require(‘gulp-babel‘); // es6转es5
var concat = require(‘gulp-concat‘); // 文件合并
var uglify = require(‘gulp-uglify‘); // js混淆
var imagemin = require(‘gulp-imagemin‘); // 图片压缩
var browserSync = require(‘browser-sync‘).create(); // 启动本地服务,修改免F5刷新
var useref = require(‘gulp-useref‘); // 替换HTML中资源的引用路径

4、在开始编写任务之前,先新建一个path对象,用来统一配置和保存静态资源路径

// 路径配置
var path = {
    // 静态资源输入路径
    input: {
        html: [‘./src/*.html‘],
        css: [‘./src/css/*.css‘],
        js: [‘./src/js/*.js‘],
        images: [‘./src/images/*‘],
        lib: [‘./src/lib/**/*‘]
    },
    // 静态资源输出路径
    output: {
        html: ‘./dist‘,
        css: ‘./dist/css‘,
        js: ‘./dist/js‘,
        images: ‘./dist/images‘,
        lib: ‘./dist/lib‘,
    },
    // manifest文件保存路径
    rev:{
        baseRev:‘./rev‘,
        css:‘./rev/css‘,
        js:‘./rev/js‘,
        images:‘./rev/images‘
    }
};

5、编写gulp任务

 // 1、统一将html中的资源替换成压缩合并后的文件名并将HTML特定标签中的文件合并
gulp.task(‘html‘,function () {
    var options = {
        removeComments: true, //清除HTML注释
        collapseWhitespace: true, //压缩HTML
        removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
        minifyJS: true, //压缩页面JS
        minifyCSS: true //压缩页面CSS
    };
    return gulp.src(path.input.html)
        .pipe(useref())
        .pipe(htmlmin(options))
        .pipe(gulp.dest(path.output.html))
})
// 2、删除掉上一步操作生成的css、js合并文件(因为在后面的添加版本号过程中也会生成,避免重复)
gulp.task(‘del‘,function () {
    return gulp.src([path.output.css,path.output.js])
        .pipe(clean());
});
// 2、css合并压缩并加版本号
gulp.task(‘css‘, function () {
    return gulp.src(path.input.css)
        .pipe(concat(‘all.min.css‘))
        .pipe(autoprefixer())
        .pipe(cssnano())
        .pipe(rev())
        .pipe(gulp.dest(path.output.css))
        .pipe(rev.manifest())
        .pipe(gulp.dest(path.rev.css))
});
// 3、js合并压缩并加版本号
gulp.task(‘js‘, function () {
    return gulp.src(path.input.js)
        .pipe(concat(‘all.min.js‘)) // 合并
        .pipe(babel({               // 转es5
            presets: [‘es2015‘]
        }))
        .pipe(uglify())             // 混淆
        .pipe(rev())
        .pipe(gulp.dest(path.output.js))
        .pipe(rev.manifest())
        .pipe(gulp.dest(path.rev.js))
});
// 4、图片压缩并加版本号
gulp.task(‘img‘, function () {
    return gulp.src(path.input.images)
        // .pipe(imagemin())           // 压缩图片
        .pipe(rev())
        .pipe(gulp.dest(path.output.images))
        .pipe(rev.manifest())
        .pipe(gulp.dest(path.rev.images))
});
// 5、给文件添加版本号,针对于已经替换引用路径的HTML文件,在dist目录下
gulp.task(‘rev‘, function () {
    return gulp.src([path.rev.baseRev+‘/**/*.json‘, path.output.html+‘/**/*.html‘, path.output.html+‘/**/*.css‘])
        .pipe(revCollector({
            replaceReved: true, // 一定要添加,不然只能首次能成功添加hash
            dirReplacements: {
                ‘css‘: ‘css/‘,
                ‘js‘: ‘js/‘,
                ‘images‘: ‘images/‘,
                ‘lib‘: ‘lib/‘,
            }
        }))
        .pipe(gulp.dest(‘dist‘));
});

// 6、复制其他库到构建目录(只要保持html和库的相对路径一致,就可以不用替换路径)
gulp.task(‘copy‘,function () {
    return gulp.src(path.input.lib)
        .pipe(gulp.dest(path.output.lib))
});

// 7、移除rev目录和dist构建目录
gulp.task(‘clean‘, function() {
    return gulp.src([‘./dist‘,‘./rev‘])
        .pipe(clean());
});
// 8、监控文件的改变,页面动态刷新
/*gulp.task(‘serve‘, function() {
    browserSync.init({
        port: 3000,
        server: {
            baseDir: [‘./src/‘],  // 启动服务的目录 默认 index.html
            index: ‘index.html‘   // 自定义启动文件名
        }
    });
});*/
// 9、监控文件变化,自动重新构建
/*gulp.task(‘watch‘,function () {
    gulp.watch(‘./src/!**!/!*‘, [‘clean‘,‘html‘,‘del‘,‘css‘,‘js‘,‘img‘,‘rev‘,‘copy‘]);
})*/
// 9、build
gulp.task(‘default‘,function (callback) {
    // sequence的作用是让所有任务同步执行,gulp默认的是异步执行
    sequence(‘clean‘,‘html‘,‘del‘,‘css‘,‘js‘,‘img‘,‘rev‘,‘copy‘,function () {
        console.log(‘构建完成‘);
    })
})
时间: 2024-11-16 20:55:05

前端自动化构建配置清单的相关文章

浅谈前端自动化构建

前言 现在的前端开发已经不再仅仅只是静态网页的开发了,日新月异的前端技术已经让前端代码的逻辑和交互效果越来越复杂,更加的不易于管理,模块化开发和预处理框架把项目分成若干个小模块,增加了最后发布的困难,没有一个统一的标准,让前端的项目结构千奇百怪.前端自动化构建在整个项目开发中越来越重要. 我们首先来回想一下之前我们是如何来开始做一个项目的. ① 首先要确定这个项目要使用什么样的技术来实现,然后开始规划我们的项目目录,接着就要往项目增加第三方库依赖,比如: 拷贝 CSS库(Yui Reset |

前端自动化构建——需求和工具选择

今天突然心血来潮,想把前端的一些人工工作流程自动化,其实之前已经在用grunt进行自动化构建,但总是觉得还是有些事情未做好.首先说说,前端平时需要做那些自动化吧: 1. 先讲HTML,每个项目每个页面都需要统一的头部,其他标题,关键字,作者等meta自行修改,body部分每个页面各自填充,但使用的框架统一. 2. CSS,我使用的是less来编写,所以需要编译成css,另外,编译过程,一些css属性需要自动添加浏览器前缀,例如border-radius,属性最好自动按照类型排序,一些css的编写

前端自动化构建工具——gulp

gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到某一工程目录下 跟grunt一般,也是需要package.json包依赖文件和一个入口文件 gulpfile.js(其他名字识别不了) 然后就类似的先装上gulp npm install gulp --save-dev 最基本的使用方式是这样:(使用jshint插件校验js代码) var jshin

近期总结:generator-web,前端自动化构建的解决方案

本文结合最近的工作经验,总结出一个较简洁的前端自动化构建方案,主张css和js的模块化,并通过grunt的自动化构建,有效地解决css合并,js合并和图片优化等问题,对于提高前端性能和项目代码质量有一定参考价值,欢迎阅读和点评:) github地址:https://github.com/liuyunzhuge/generator-web demo地址:https://liuyunzhuge.github.io/generator-web/ 有兴趣的同学,在阅读文章,学习或使用demo的过程中,有

前端自动化构建工具Webpack开发模式入门指南

Webpack Webpack是时下最流行的模块打包器 它的主要任务就是将各种格式的JavaScript代码,甚至是静态文件 进行分析.压缩.合并.打包,最后生成浏览器支持的代码 特点: 代码拆分方案:webpack可以将应用代码拆分成多个块,每个块包含一个或多个模块,块可以按需异步加载,极大提升大规模单页应用的初始加载速度 智能的静态分析:webpack的智能解析器几乎可以处理任何第三方库 Loader加载器:webpack只能处理原生js模块,但是loader可以将各种资源转换为js模块 p

前端自动化构建工具

全局安装是把包安装在Node安装目录下的node_modules文件夹中,一般在 \Users\用户名\AppData\Roaming\ 目录下,可以使用npm root -g查看全局安装目录 本地(局部)安装是把包安装在指定项目(要在指定的根目录下输入命令)的node_modules文件夹下(若没有,会自动创建一个node_modules文件夹) 具体区别,推荐博文:  全局安装和本地(局部)安装的区别 本地安装可以让每个项目拥有独立的包,不受全局包的影响,方便项目的移动.复制.打包等,保证不

基于gulp搭建的前端自动化构建框架

Gulp-cli 基于gulp搭建的前端自动化构建.适用于中小型项目,快速构建前端项目框架. 项目启动 // 常用命令 项目编译: npm run build 项目编译并启动: npm run start 项目地址 如对你有帮助,希望给个Star !哈哈哈!! git clone [email protected].com:perfectSymphony/Gulp-cli.git 项目目录 ├── README.md # 项目说明 |-- bin # (在gulpfile文件中使用到)解析lay

「移动开发」iuap mobile玩转前端自动化构建

提起iuapmobile studio,相信大家已经不再陌生了,是进行移动应用开发的强大集成工具与必备神器.借助强大的iuap mobile studio,可以实现对开发.测试.调试.打包.发布全程管理.同时iuap mobile studio又是一个极具开放性的平台工具,可以与绝大多数优秀的前端框架.技术很好地集成.今天我们就来看看在iuap mobile上如何玩转这些如火如荼的前端自动化构建技术.说起目前主流前端自动化构建技术,少不了npm.grunt.gulp.browserify.web

浅谈前端自动化构建(摘抄)

前言 现在的前端开发已经不再仅仅只是静态网页的开发了,日新月异的前端技术已经让前端代码的逻辑和交互效果越来越复杂,更加的不易于管理,模块化开发和预处理框架把项目分成若干个小模块,增加了最后发布的困难,没有一个统一的标准,让前端的项目结构千奇百怪.前端自动化构建在整个项目开发中越来越重要. 我们首先来回想一下之前我们是如何来开始做一个项目的. ① 首先要确定这个项目要使用什么样的技术来实现,然后开始规划我们的项目目录,接着就要往项目增加第三方库依赖,比如: 拷贝 CSS库(Yui Reset |