项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况
随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了不少,如:grunt,gulp,webpack,百度团队的fis3等,在前端的领域都占有自己的一席之地,webpack可以说是后起之秀,加之vuejs,reactjs,angularjs等MVVM框架的出现,配合webpack开发,成为业内常见的一种开发模式
在公司项目开发的时候,选用了gulp+webpack进行配合开发,正好写写总结算是复习吧
gulp传送门 :——> gulp中文网
——> gulp官网
webpack官网:——> webpack中文网
——> webpack官网
在官网可以学习最基础的基本配置,在网上也可以找到一些大神的分享
gulp的思想是基于流的思想,进行构建工具,类似管道的结构,由于gulp是基于node,所以在开发进行配置之前,首先要安装nodejs才能进行配置
进入到项目的根目录,在根目录下执行命令行命令初始化项目:
npm init
在项目的根目录,我们可以看到会出现一个名为:package.json的文件,是整个项目的项目信息清单
同时在项目根目录下新建一个gulpfile.js文件,开始配置gulp文件
一些gulp的基本语法结构,可以在gulp的api文档中可以查找到 -->gulp中文api文档
其中包括gulp常使用的关键字:src,dest,watch,pipe,task等
准备工作做好之后,开始进行配置:
gulp:
需要先全局安装gulp
npm install gulp -g
完成之后,在配置项目中安装gulp
npm install gulp --save-dev
需要注意的是,在后面添加 --sav-dev,才能将安装的gulp的信息,添加到package.json清单文件当中
安装完成之后,在配置文件gulpfile.js中引入gulp模块
var gulp = require('gulp');
sass:
在sass的配置的时候,首先要全局安装基于ruby的sass编译环境,在命令行中要安装:
npm install ruby -g npm install gulp-sass -g npm install gulp-sass
安装完成之后,开始配置gulp中sass的配置
var sass = require("gulp-sass"); //编译sass // gulp-sass var sassSrc = [ './src/styles/style.scss' ]; //新建编译sass文件的gulp任务 gulp.task('sass',function(){ return gulp.src(sassSrc) .pipe(sass()).pipe( gulp.dest( './klm/styles/' ) ); });
webserver:
基于gulp还可以配置前端自己本地的服务器,在后端没有开发接口出来之前,可以自己配置mock数据
配置代码如下:
//mockApi //配置mock数据的路径 var mockbase = path.join(__dirname, './mock'); var mockApi = function(res, pathname, paramObj, next) { switch (pathname) { case '/api/vote': var data = fs.readFileSync(path.join(mockbase, 'classify.json'), 'utf-8'); res.setHeader('Content-Type', 'application/json'); res.setHeader('Content-type', 'application/javascript'); res.end(data); // console.log(typeof data); // console.log(paramObj.callback); return ; default: } next(); }; gulp.task('webserver', function () { gulp.src( './' ) // 服务器目录(./代表根目录) .pipe(webserver({ // 运行gulp-webserver livereload:true, // 启用LiveReload port:1000, // open: true // 服务器启动时自动打开网页 //middleware为处理数据的中间件 middleware: function(req, res, next) { var urlObj = url.parse(req.url, true), method = req.method, paramObj = urlObj.query; // mock数据 mockApi(res, urlObj.pathname, paramObj, next); } })); });
webpack:
gulp还可以结合webpack对js组件进行按需加载,webpack对于js模块化的开发思想,有着很强的支持,和gulp结合可以相互弥补,解决很多相互之间的补足之处,
webpack作为近两年前端项目构建工具的后起之秀,到成为主流,和行业的发展离不开,学习webpack使用到项目当中,能提高开发效率等,webpack官网有着详细的入门教程,
需要学习的同学,可以在上面的官网传送门,到官网去学习
// 要进行自动化的文件 var jsFiles = [ './src/scripts/entry.js' ]; gulp.task("packjs",function(){ return gulp.src(jsFiles) .pipe(webpack({ //插件项 // plugins: [ // new HtmlWebpackPlugin({ // title: 'jquery', // filename: './jquery.js' // }) // ], //输入 entry: { app:jsFiles //文件引入路径 }, output: { path:"", //输出路径 // publicPath: 'http://mycdn.com/', //cdn filename: 'bundle.js' }, // 新添加的module属性 module: { loaders: [ //.css 文件使用 style-loader 和 css-loader 来处理 { test: /\.css$/, loader: 'style-loader!css-loader' }, //.js 文件使用 jsx-loader 来编译处理 { test: /\.js$/, loader: 'jsx-loader?harmony' }, // vue加载器 // {test: /\.vue$/,loader: 'vue'}, //.scss 文件使用 style-loader、css-loader 和 sass-loader 来编译处理 { test: /\.scss$/, loader: 'style!css!sass?sourceMap'}, //图片文件使用 url-loader来处理,小于8kb的直接转为base64 { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}, {test: /\.html$/, loader: 'html'} ] }, //其它解决方案配置 resolve: { root: 'E:/akari丶/workspace/gulp-webpack', //绝对路径 extensions: ['', '.js', '.json', '.scss'], alias: { // AppStore : 'js/stores/AppStores.js', // ActionType : 'js/actions/ActionType.js', // AppAction : 'js/actions/AppAction.js' } } })) //输出路径 .pipe(gulp.dest('./klm/js')); });
同时,在安装多个模块的时候,我们可以类似这样的安装:
npm install gulp gulp-sass webpack --save-dev
下面这些是我自己自己的配置文件:
var gulp = require('gulp'); var concat = require('gulp-concat'); //文件管道 var stripDebug = require('gulp-strip-debug'); //调试工具 var uglify = require('gulp-uglify'); //丑化 var autoprefix = require('gulp-autoprefixer'); //浏览器内核名称前缀 var minifyCSS = require('gulp-minify-css'); //压缩css var connect = require('gulp-connect'); //服务器连接 var livereload = require('gulp-livereload'); // 网页自动刷新(服务器控制客户端同步刷新) var webserver = require('gulp-webserver'); // 本地服务器 var jshint = require('gulp-jshint'); //检测js是否存在错误 var sass = require("gulp-sass"); //编译sass var named = require('vinyl-named'); //重新命名 var webpack = require('gulp-webpack'); //js模块打包 var cssmin = require('gulp-cssmin'); //压缩css var imagemin = require("gulp-imagemin"); //图片压缩 var url = require("url"); //node.js url模块 var fs = require("fs"); //node.js 文件模块 var path = require("path"); //node.js 路径模块 var coffee = require('gulp-coffee'); var base64 = require("gulp-base64"); //base64 var gutil = require("gutil"); // //image min gulp.task('imagemin', function () { gulp.src('./src/img/*') .pipe(imagemin()) .pipe(gulp.dest('./klm/images/')); }); //mockApi var mockbase = path.join(__dirname, './mock'); var mockApi = function(res, pathname, paramObj, next) { switch (pathname) { case '/api/vote': var data = fs.readFileSync(path.join(mockbase, 'classify.json'), 'utf-8'); res.setHeader('Content-Type', 'application/json'); res.setHeader('Content-type', 'application/javascript'); res.end(data); // console.log(typeof data); // console.log(paramObj.callback); return ; default: } next(); }; gulp.task('webserver', function () { gulp.src( './' ) // 服务器目录(./代表根目录) .pipe(webserver({ // 运行gulp-webserver livereload:true, // 启用LiveReload port:1000, // open: true // 服务器启动时自动打开网页 //middleware为处理数据的中间件 middleware: function(req, res, next) { var urlObj = url.parse(req.url, true), method = req.method, paramObj = urlObj.query; // mock数据 mockApi(res, urlObj.pathname, paramObj, next); } })); }); // gulp-sass var sassSrc = [ './src/styles/style.scss' ]; gulp.task('sass',function(){ return gulp.src(sassSrc) .pipe(autoprefix('last 2 versions')) .pipe(sass()).pipe( gulp.dest( './klm/styles/' ) ); }); // CSS concat, auto-prefix and minify var styleSrc = [ './klm/styles/styles.css' ]; gulp.task('styles', function() { gulp.src(styleSrc) .pipe(concat('styles.css')) .pipe(cssmin()) .pipe(minifyCSS()) //可以使用外部工具进行实现:编辑器插件 .pipe(gulp.dest('./klm/styles/')); // .pipe(autoprefix('last 2 versions')); }); // 要进行自动化的文件 var jsFiles = [ './src/scripts/entry.js' ]; gulp.task("packjs",function(){ return gulp.src(jsFiles) .pipe(webpack({ //插件项 // plugins: [ // new HtmlWebpackPlugin({ // title: 'jquery', // filename: './jquery.js' // }) // ], //输入 entry: { app:jsFiles //文件引入路径 }, output: { path:"", //输出路径 // publicPath: 'http://mycdn.com/', //cdn filename: 'bundle.js' }, // 新添加的module属性 module: { loaders: [ //.css 文件使用 style-loader 和 css-loader 来处理 { test: /\.css$/, loader: 'style-loader!css-loader' }, //.js 文件使用 jsx-loader 来编译处理 { test: /\.js$/, loader: 'jsx-loader?harmony' }, // vue加载器 // {test: /\.vue$/,loader: 'vue'}, //.scss 文件使用 style-loader、css-loader 和 sass-loader 来编译处理 { test: /\.scss$/, loader: 'style!css!sass?sourceMap'}, //图片文件使用 url-loader来处理,小于8kb的直接转为base64 { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}, {test: /\.html$/, loader: 'html'} ] }, //其它解决方案配置 resolve: { root: 'E:/akari丶/workspace/gulp-webpack', //绝对路径 extensions: ['', '.js', '.json', '.scss'], alias: { // AppStore : 'js/stores/AppStores.js', // ActionType : 'js/actions/ActionType.js', // AppAction : 'js/actions/AppAction.js' } } })) //输出路径 .pipe(gulp.dest('./klm/js')); }); // default gulp task gulp.task('default', ['packjs',"styles",'sass','webserver',"imagemin"], function() { // watch for scss changes var watchSass = [ './src/**/*.scss', './src/styles/*.scss' ]; gulp.watch(watchSass, function() { gulp.run('sass'); }); // watch for CSS changes gulp.watch('./src/styles/*.css', function() { gulp.run('styles'); }); // watch for JS changes var watchJs = [ './src/scripts/**/*.js', './src/scripts/*.js' ]; gulp.watch(watchJs, function() { // gulp.run('jshint', 'scripts'); gulp.run('packjs'); }); // watch for html changes // gulp.watch("./src/page/*.html",function(){ // gulp.run("html"); // }); });
值得一提的是,在命令行中编译执行gulp的时候,在命令行直接输入gulp回车,就可以执行gulp配置中default默认执行的gulp任务了,同时,watch里面所监控的文件,在文件发生改动的时候,就是执行相应的任务
之前上传过一份简单的配置在githup里面,有需要的童鞋可以下载看一下 -->gulp基本配置仓库地址,
由于在工作中开发的时候,并不需要和后端进行数据对接,只是简单的html模板的编写,所以并不需要很复杂的gulp配置,不足之处,请在评论中指出,请多指教~
不管是gulp也好,webpack也好,不管是什么工具,适合自己的,适合团队的,适合项目的,或许才是最好的,要结合开发现状和团队等等因素,就像我们开发的时候,要考虑技术选型一样重要