項目構建包括以下內容:javascript
咱們對平時開發的代碼區分了兩種環境:css
開發環境 developmenthtml
生產環境 production前端
而咱們使用的庫也分爲兩種依賴:java
開發依賴 devDependenciesnode
生產依賴 dependenciesgit
開發套路:程序員
準備工做:建立js文件es6
下載插件:github
配置編碼
const gulp = require('gulp'); const eslint = require('gulp-eslint'); // 語法檢查 必須有一個eslint的配置文件 gulp.task('eslint', function () { // 讀取全部的js文件, 返回值就是一個可讀流 return gulp.src(['src/js/*.js']) // 對流中的文件/數據進行語法檢查 .pipe(eslint()) .pipe(eslint.format()) .pipe(eslint.failAfterError()) .pipe(livereload()); })
在package.json中配置eslint的檢查項
"eslintConfig": { "parserOptions": { "ecmaVersion": 7, "sourceType": "module", "ecmaFeatures": { "module": true } } } //package.json文件內容,eslint的檢查項放置位置 "author": "", "license": "ISC", "dependencies": {}, "devDependencies": {}, "eslintConfig": { "parserOptions": { "ecmaVersion": 7, "sourceType": "module", "ecmaFeatures": { "module": true } } }
gulp eslint
下載插件:
配置編碼
const babel = require('gulp-babel'); // babel能將es6模塊化語法轉換爲commonjs模塊化語法 // 能將es6及其以上的語法轉換爲es5及其如下的語法 gulp.task('babel', () => // 讀取全部js文件 gulp.src('src/js/*.js') // 進行語法轉換 .pipe(babel({ presets: ['@babel/preset-env'] //此處須要修改,官網有誤 })) // 輸出出去,輸出路徑 .pipe(gulp.dest('build/js')) );
gulp babel
下載插件:
配置編碼
const browserify = require('gulp-browserify'); const rename = require("gulp-rename"); //重命名文件,爲了避免與babel產生的文件命名起衝突,能夠保留banel產生的js文件 gulp.task('browserify', function() { // 只要放入口文件 return gulp.src('build/js/app.js') .pipe(browserify()) // 重命名文件 .pipe(rename("built.js")) .pipe(gulp.dest('build/js')) });
gulp browserify
下載插件:
配置編碼
const uglify = require('gulp-uglify'); const rename = require('gulp-rename'); gulp.task('uglify', function() { return gulp.src('./build/js/built.js') .pipe(uglify()) .pipe(rename('dist.min.js')) .pipe(gulp.dest('./dist/js/')) }); gulp.task('js-prod', gulp.series('js-dev', 'uglify')); //順序執行
gulp js-prod
準備工做:建立less文件
下載插件:
配置編碼
const less = require('gulp-less'); gulp.task('less', function () { return gulp.src('./src/less/*.less') .pipe(less()) .pipe(gulp.dest('./build/css')) });
gulp less
下載插件
配置編碼
//第一種方案,採用gulp-clean-css const cleanCSS = require('gulp-clean-css'); const LessAutoprefix = require('less-plugin-autoprefix'); const autoprefix = new LessAutoprefix({ browsers: ["cover 99.5%", "not dead"] }); const connect = require('gulp-connect');合併css文件 gulp.task('css', function () { return gulp.src('./src/less/*.less') .pipe(less({ plugins: [autoprefix] //自動擴展樣式的兼容性前綴 })) //將less文件轉換成css文件 .pipe(concat('dist.min.css')) //合併css文件 .pipe(cleanCSS({compatibility: 'ie8'})) //壓縮css文件 .pipe(gulp.dest('./dist/css')) }); //第二種方案,採用gulp-cssmin const cssmin = require('gulp-cssmin');合併css文件 const LessAutoprefix = require('less-plugin-autoprefix'); const autoprefix = new LessAutoprefix({ browsers: ["cover 99.5%", "not dead"] }); //與LessAutoprefix相配合,使用autoprefixer從less轉換後爲css添加前綴,由於有些瀏覽器對一些帶有前綴的css才能識別 const connect = require('gulp-connect'); gulp.task('css', function () { return gulp.src('./src/less/*.less') .pipe(concat('dist.min.css')) .pipe(less({ plugins: [autoprefix] })) .pipe(cssmin()) .pipe(gulp.dest('./dist/css')) });
gulp css
下載插件:
配置編碼
var htmlmin = require('gulp-htmlmin'); //壓縮html任務 gulp.task('html', () => { return gulp.src('src/*.html') .pipe(htmlmin({ collapseWhitespace: true, // 去除空格 removeComments: true // 去掉註釋 })) .pipe(gulp.dest('dist')); });
修改頁面引入
<link rel="stylesheet" href="css/dist.min.css"> <script type="text/javascript" src="js/dist.min.js"></script>
gulp html
下載插件
配置編碼:
const livereload = require('gulp-livereload'); //全部的任務最後加上 .pipe(livereload()) 這條代碼決定自動編譯哪一個任務 gulp.task('watch', function() { livereload.listen(); gulp.watch('src/less/*.less', gulp.series('less')); gulp.watch('src/js/*.js', gulp.series('js')); });
gulp watch
下載插件
配置編碼
// 自動化 --> 自動編譯 --> 自動刷新瀏覽器(熱更新) --> 自動打開瀏覽器 gulp.task('watch', function() { livereload.listen(); // 開啓服務器 connect.server({ name: 'Dev App', root: ['build'], //提供服務的根路徑 port: 3000, //開啓端口號 livereload: true //是否實時刷新 }); // 自動打開瀏覽器,開啓連接 open('http://localhost:3000'); // 監視指定文件,一旦文件發生變化,就執行後面的任務 gulp.watch('src/less/*.less', gulp.series('less')); gulp.watch('src/js/*.js', gulp.series('js-dev')); });
gulp watch
// gulp.series()同步順序執行,同一時間只能執行一個任務 速度慢 // gulp.parallel()異步執行,同一時間執行多個任務 速度快 gulp.task('js-dev', gulp.series('eslint', 'babel', 'browserify')); gulp.task('js-prod', gulp.series('js-dev', 'uglify')); gulp.task('build', gulp.parallel('js-dev', 'less')); // 生產環境的指令: gulp prod gulp.task('prod', gulp.parallel('js-prod', 'css', 'html')); // 開發環境的指令: gulp start gulp.task('start', gulp.series('build', 'watch'));
// 引入gulp const gulp = require('gulp'); const eslint = require('gulp-eslint'); const babel = require('gulp-babel'); const browserify = require('gulp-browserify'); const rename = require("gulp-rename"); const less = require('gulp-less'); const livereload = require('gulp-livereload'); const connect = require('gulp-connect'); const open = require("open"); const uglify = require('gulp-uglify'); const LessAutoprefix = require('less-plugin-autoprefix'); // https://github.com/browserslist/browserslist const autoprefix = new LessAutoprefix({ browsers: ["cover 99.5%", "not dead"] }); const cssmin = require('gulp-cssmin'); const concat = require('gulp-concat'); const htmlmin = require('gulp-htmlmin'); // 語法檢查 必須有一個eslint的配置文件 gulp.task('eslint', function () { // 讀取全部的js文件, 返回值就是一個可讀流 return gulp.src(['src/js/*.js']) // 對流中的文件/數據進行語法檢查 .pipe(eslint()) .pipe(eslint.format()) .pipe(eslint.failAfterError()) .pipe(livereload()); }) // 語法轉換 // babel能將es6模塊化語法轉換爲commonjs模塊化語法 // 能將es6及其以上的語法轉換爲es5及其如下的語法 gulp.task('babel', () => // 讀取全部js文件 gulp.src('src/js/*.js') // 進行語法轉換 .pipe(babel({ presets: ['@babel/preset-env'] //此處須要修改,官網有誤 })) // 輸出出去 .pipe(gulp.dest('build/js')) .pipe(livereload()) ); // 將commonjs的模塊化語法轉換成瀏覽器能識別語法 gulp.task('browserify', function() { // 只要放入口文件 return gulp.src('build/js/app.js') .pipe(browserify()) // 重命名文件 .pipe(rename("built.js")) .pipe(gulp.dest('build/js')) .pipe(livereload()); }); // 壓縮js代碼 gulp.task('uglify', function () { return gulp.src('./build/js/built.js') .pipe(uglify()) .pipe(rename('dist.min.js')) .pipe(gulp.dest('dist/js')) }) // 將less編譯成css gulp.task('less', function () { return gulp.src('./src/less/*.less') .pipe(less()) .pipe(gulp.dest('./build/css')) .pipe(livereload()); }); // 壓縮css gulp.task('css', function () { return gulp.src('./src/less/*.less') .pipe(concat('dist.min.css')) .pipe(less({ plugins: [autoprefix] })) .pipe(cssmin()) .pipe(gulp.dest('./dist/css')) }); // 壓縮html gulp.task('html', () => { return gulp.src('src/*.html') .pipe(htmlmin({ collapseWhitespace: true, // 去除空格 removeComments: true // 去掉註釋 })) .pipe(gulp.dest('dist')); }); // 自動化 --> 自動編譯 --> 自動刷新瀏覽器(熱更新) --> 自動打開瀏覽器 gulp.task('watch', function() { livereload.listen(); // 開啓服務器 connect.server({ name: 'Dev App', root: ['build'], port: 3000, livereload: true //熱更新 }); // 打開瀏覽器 open('http://localhost:3000'); // 監視指定文件,一旦文件發生變化,就執行後面的任務 gulp.watch('src/less/*.less', gulp.series('less')); gulp.watch('src/js/*.js', gulp.series('js-dev')); }); // 配置默認任務 --> 執行以上多個任務 gulp.task('js-dev', gulp.series('eslint', 'babel', 'browserify')); gulp.task('js-prod', gulp.series('js-dev', 'uglify')); // gulp.task('default', gulp.parallel('eslint', 'babel', 'browserify')); gulp.task('build', gulp.parallel('js-dev', 'less')); // 生產環境的指令: gulp prod gulp.task('prod', gulp.parallel('js-prod', 'css', 'html')); // 開發環境的指令: gulp start gulp.task('start', gulp.series('build', 'watch'));