之前實現差別化或者說項目上線以前會有一個項目的異化合並打包。這種事情之前通常都是運維或者是後端同事去幹,用的通常是 ant 或者是本身寫個腳本什麼的,在這裏咱們就不說了【實際上是沒有玩過】。可是這樣作的缺點也是很明顯,缺點以下:html
上線以前合併的項目前端人員無法看到或者說要發佈到測試環境後才能夠看到,對前端哥哥來講實在是不友好,固然了你要是說直接 copy 一份覆蓋後用 live-server 啓動不就能夠了嗎?能夠是能夠可是這樣作太 low 不說,萬一作的時候手一抖又出現好多 bug。因此做爲一個有志青年,這種髒活累活仍是不要本身去作,咱們要工機器也就是工具去幫咱們作。前端
因此就有這篇文章了!git
基於上面的需求咱們來一步步實現功能。es6
這裏我們先定義一下概念,這樣對接下來的思路說明能更加的清晰些。github
基於上面的【一些概念聲明】,咱們寫出了下面的步驟:npm
project-merge 平臺名稱 |-bin |-dev 開發環境 | |-standard 標準項目 | |-yunying 具體項目【多加這一步是由於咱們平臺是項目定製的,每一個平臺都會有不少項目,好比小程序、公衆號、APP、pc官網等等】 | |-shenzhen 差別化項目 | |-yunying 差別化具體項目 |-dist 生產環境 | |-shenzhen 打包後的差別化項目 |-yunying 差別化具體項目 |-gulpfile.js gulp任務管理 |-gulpTaskConfig.json 項目配置文件
根據上面的項目目錄結構簡單說明:json
下面是具體說說 gulpTaskConfig.json 項目配置文件配置。gulp
key | value | 是否必填 | 說明 |
---|---|---|---|
taskname | string | 是 | 任務名,用於在命令行輸入,例如: gulp test |
standard | string | 是 | 指定標準版位置 |
different | string | 是 | 指定差別化版本路徑 |
target | string | 是 | 指定打包生產目錄路徑 |
port | string | 否 | 指定端口位置,用於同時啓動多個任務時須要配置 |
note | string | 否 | 任務說明 |
needBabel | boolean | 否 | 是否須要 babel 編譯,默認不開啓,老項目某些代碼不能經過編譯 |
var gulp = require('gulp'); var del = require('del'); var path = require('path'); var browserSync = require('browser-sync'); var reload = browserSync.reload; var babel = require('gulp-babel'); //拿到對應的配置項 var gulpTaskConfig = require('./gulpTaskConfig.json'); gulpTaskConfig.forEach(item => { const DEL = `${item.taskname}_del`; const BUILD = `${item.taskname}_build_without_js`; const BUILDJS = `${item.taskname}_build_with_js`; const SERVER = `${item.taskname}_server`; //每次打包時,先刪除目標項目內容 gulp.task(DEL, function() { del([`${item.target}/**/*`]); }); /**合併除js之外文件 */ gulp.task(BUILD, function() { gulp.src([`${item.standard}/**/!(*.js)`, `${item.different}/**/!(*.js)`]).pipe(gulp.dest(item.target)); }); /**babel 編譯js */ gulp.task(BUILDJS, function() { const paths = gulp.src([`${item.standard}/**/*.js`, `${item.different}/**/*.js`]); if (item.needBabel) { paths .pipe( babel({ presets: ['@babel/env'], }), ) .pipe(gulp.dest(item.target)); } else { paths.pipe(gulp.dest(item.target)); } }); /**起server */ gulp.task(SERVER, function() { browserSync({ server: { baseDir: `${item.target}`, reloadDebounce: 1000, }, port: item.port || 8080, }); }); //執行任務 gulp.task(item.taskname, function() { gulp.run(DEL, BUILD, BUILDJS, SERVER); gulp.watch(`${item.different}/**`, [BUILD, BUILDJS]).on('change', reload); }); });
步驟:小程序
[ { taskname: 'yunying', //運營管理平臺 standard: './dev/standard/yunying', different: './dev/shenzhen/yunying', target: './dist/shenzhen/yunying', note: '運營管理平臺', port: '4000', }, { taskname: 'weixin', //微信公衆號 standard: './dev/standard/weixin', different: './dev/shenzhen/weixin', target: './dist/shenzhen/weixin', note: '微信公衆號', port: '5000', }, ];
如:後端
gulp yunying gulp weixin
具體項目源碼,能夠到個人 github 查看傳送門