專案構建介紹
ES6 專案構建
- 基礎架構
- 任務自動化(gulp)
- 編譯工具(babel、webpack)
- 程式碼實現
基礎架構
編譯 es5 es3(適用於ie8)
任務自動化(gulp)
什麼是任務自動化
減少人工操作,自動監聽操作與響應。
什麼是gulp
自動化構建工具。
gulp的作用
完工自動化,背後用 nodejs 做開發,提供了很多外掛,完成不同任務。
瞭解如何使用gulp完成任務自動化
gulp中文文件、api、外掛
編譯工具(babel、webpack)
什麼是babel、webpack
babel:js 的編譯器
webpack:解決模組化的工具
babel的核心用法
解決相容性問題、編譯,如何和 gulp 結合。
瞭解webpack及webpack-stream的作用
webpack-stream 是 webpack 對 gulp 的支援,gulp 是通過 stream (二進位制的流)的方式進行操作。
程式碼實現
建立一個ES6前端工程
完成目錄結構、自動構建、伺服器搭建
專案目錄建立
根目錄 es6-lottery,建立3部分:前端、服務端、工具。
app/
前端程式碼
app/css/
樣式app/js/
jsapp/js/class/
類app/js/class/test.js
初始化類檔案app/js/class/index.js
入口檔案
app/views/
模板 htmlapp/views/error.ejs
初始化模板檔案,錯誤檔案(ejs,伺服器程式碼通過express做,其使用的模板引擎是 ejs 模板引擎)app/views/index.ejs
入口檔案
server/
伺服器
- server/下,命令列
express -e .
express腳手架在當前目錄使用 ejs 模板引擎,npm install
tasks/
工具
tasks/util/
常見指令碼
tasks/util/args.js
初始化指令碼檔案
package.json
命令列 npm init
,配置依賴包
.babelrc
babel 編譯配置檔案
gulpfile.babel.js
gulp 配置檔案,指令碼使用了 es6 語法 需要加上 babel
命令列處理,建立JS編譯任務指令碼
命令列處理
命令列引數解析
// tasks/util/args.js
import yargs from 'yargs'; // 處理命令列引數,識別命令列
const args = yargs // 命令列引數處理
.option('production',{ // 區分開發環境和正式環境
boolean:true,
default:false,
describe:'min all scripts'
})
.option('watch',{ // 監聽開發環境中的檔案
boolean:true,
default:false,
describe:'watch all files'
})
.option('verbose',{ // 詳細輸出命令列日誌
boolean:true,
default:false,
describe:'log'
})
.option('sourcemaps',{ // 資源對映,強制生成 sourcemaps
describe:'force the creation of sroucemaps'
})
.option('port',{ // 伺服器埠
string:true,
default:8080,
describe:'server port'
})
.argv // 命令列以字串進行解析
export default args;
複製程式碼
js 處理指令碼
建立 /tasks/script.js
import gulp from 'gulp';
import gulpif from 'gulp-if'; // gulp if 判斷
import concat from 'gulp-concat'; // gulp 檔案拼接
import webpack from 'webpack'; // 打包
import gulpWebpack from 'webpack-stream'; // gulp 基於 stream
import named from 'vinyl-named'; // 檔案重新命名標誌
import livereload from 'gulp-livereload'; // 熱更新
import plumber from 'gulp-plumber'; // 處理檔案資訊流
import rename from 'gulp-rename'; // 檔案重新命名
import uglify from 'gulp-uglify'; // js,css 壓縮
import {log,colors} from 'gulp-util'; // 命令列輸出,log 和 color 的輸出
import args from './util/args'; // 命令列引數解析
gulp.task('scripts',()=>{ // 建立指令碼命令
return gulp.src(['app/js/index.js']) // 開啟檔案
.pipe(plumber({
errorHandle:function(){ // 處理錯誤,結合 webpack
}
}))
.pipe(named()) // 檔案重新命名
.pipe(gulpWebpack({ // 編譯,結合 webpack
module:{
loaders:[{
test:/\.js$/,
loader:'babel'
}]
}
}),null,(err,stats)=>{ // 處理錯誤
log(`Finished '${colors.cyan('scripts')}'`,stats.toString({
chunks:false
}))
})
.pipe(gulp.dest('server/public/js')) // 輸出路徑
.pipe(rename({ // 重新命名
basename:'cp',
extname:'.min.js'
}))
.pipe(uglify({compress:{properties:false}, output:{'quote_keys':true}})) // 檔案壓縮
.pipe(gulp.dest('server/public/js')) // 輸出路徑
.pipe(gulpif(args.watch,livereload())) // 監聽檔案變化
})
複製程式碼
建立模板、服務任務指令碼
模板處理指令碼
建立 /tasks/pages.js
import gulp from 'gulp';
import gulpif from 'gulp-if';
import livereload from 'gulp-livereload';
import args from './util/args';
gulp.task('pages',()=>{ // 建立 pages 任務
return gulp.src('app/**/*.ejs') // 開啟檔案,app 下的所有 ejs 檔案
.pipe(gulp.dest('server')) // 拷貝
.pipe(gulpif(args.watch,livereload())) // 監聽 熱更新
})
複製程式碼
css 處理指令碼
建立 /tasks/css.js
import gulp from 'gulp';
import gulpif from 'gulp-if';
import livereload from 'gulp-livereload';
import args from './util/args';
gulp.task('css',()=>{
return gulp.src('app/**/*.css')
.pipe(gulp.dest('server/public'))
})
複製程式碼
伺服器任務指令碼
// tasks/server.js
import gulp from 'gulp';
import gulpif from 'gulp-if';
import liveserver from 'gulp-live-server'; // 啟動指令碼作為伺服器
import args from './util/args';
gulp.task('serve',(cb)=>{ // 建立 serve 任務
if(!args.watch) return cb(); // 如果不監聽,返回 cb
var server = liveserver.new(['--harmony','server/bin/www']); // 建立伺服器
server.start(); // 啟動伺服器
gulp.watch(['server/public/**/*.js','server/views/**/*.ejs'],function(file){
server.notify.apply(server,[file]); // 通知伺服器做處理
}) // 監聽 server/ 下的 js 和 ejs 檔案
gulp.watch(['server/routes/**/*.js','server/app.js'],function(){
server.start.bind(server)()
}); // 監聽路由和應用介面變化
})
複製程式碼
檔案自動監聽,專案構建測試
監聽 js css ejs 變化,對應執行響應指令碼檔案
// tasks/browser.js
import gulp from 'gulp';
import gulpif from 'gulp-if';
import gutil from 'gulp-util'; // gulp 常用工具集合
import args from './util/args';
gulp.task('browser',(cb)=>{ // 建立任務
if(!args.watch) return cb();
gulp.watch('app/**/*.js',['scripts']); // app/中 js發生變化,執行 script 指令碼
gulp.watch('app/**/*.ejs',['pages']);
gulp.watch('app/**/*.css',['css']);
});
複製程式碼
每次清空生成檔案
// tasks/clean.js
import gulp from 'gulp';
import del from 'del'; // 做刪除處理
import args from './util/args';
gulp.task('clean',()=>{ // 建立任務
return del(['server/public','server/views']) // 清空兩個目錄
})
複製程式碼
串聯指令碼
// tasks/build.js
import gulp from 'gulp';
import gulpSequence from 'gulp-sequence'; // 處理包執行順序
gulp.task('build',gulpSequence('clean','css','pages','scripts',['browser','serve'])); // 清目錄->拷css->編譯模板->執行指令碼->陣列browser->serve
複製程式碼
預設任務指令碼
// tasks/default.js
import gulp from 'gulp';
gulp.task('default',['build']); // 命令列 gulp,自動會找 default 任務
複製程式碼
全域性安裝 gulp 後,命令列執行 gulp
,會依次執行指令碼。
引入 tasks 目錄檔案
// gulpfile.babel.js
import requireDir from 'require-dir';
requireDir('./tasks'); // 引入 tasks 目錄檔案,並執行
複製程式碼
配置 .babelrc
{
"presets":["es2015"],
"plugins":["transform-decorators-legacy"]
}
複製程式碼
熱更新
// server/app.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(require('connect-livereload')()); // 接收熱更新,新增這句話,注意順序
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
複製程式碼
自動更新完成
命令列 gulp --watch
監聽
localhost: 3000 開啟