webpack+gulp+qshell+npm-scripts實現一個命令完成[打包+同步cdn+上傳服務器]javascript
因爲咱們用的七牛雲存儲,因此cdn也是走的七牛,因此並不適用於其餘的cdn,可是思路能夠借鑑java
打包目前我這邊用的是webpack,網上已經有不少文章了,這裏就不做過多闡述了,只是說一下publicPath這個參數,若是要作cdn同步確定是要配置這個參數的,目前我是這樣配置的:node
http://youCdnPath/${process.env.npm_package_name}/
上面的process.env.npm_package_name就是你packge.json裏面的name字段webpack
這塊的實現我用的是gulp配合gulp-ssh來實現的,會先刪除現有文件而後上傳,不會因爲文件指紋變更致使文件的堆積,而後全部的靜態資源都走的cdn,因此,只上傳了dist目錄下不包括static目錄的文件,具體配置以下:git
/* yarn add gulp gulp-ssh */ const gulp = require('gulp') const GulpSSH = require('gulp-ssh') // 須要上傳到服務器的路徑 const remotePath = '/home/wwwroot/default/hyan_weixin/public/pages/h5/2018/0125zaosangrenhe' const config = { ssh: { // 正式 host: 'xx.xx.xx.xx', port: 22, username: 'root', password: 'xxxxxxxx' }, remotePath: remotePath, commands: [ // 刪除現有文件 `rm -rf ${remotePath}` ] } let gulpSSH = new GulpSSH({ ignoreErrors: false, sshConfig: config.ssh }) /** * 上傳前先刪除服務器上現有文件... */ gulp.task('execSSH', () => { console.log('刪除服務器上現有文件...') return gulpSSH.shell(config.commands, {filePath: 'commands.log'}) .pipe(gulp.dest('logs')) }) /** * 上傳文件到服務器 */ gulp.task('deploy', ['execSSH'], () => { console.log('2s後開始上傳文件到服務器...') setTimeout(() => { return gulp.src(['./dist/**', '!./dist/static/**']) .pipe(gulpSSH.dest(config.remotePath)) }, 2000) })
這塊用的到是我本身開發的一個npm插件qiniu-qupload,配置起來也很方便,這段代碼我放在./scripts/cdn.js目錄下,具體內容以下:github
const qiniuUploader = require('qiniu-qupload') const path = require('path') const qnConf = { "ak" : "youAK", "sk" : "youSK", "src_dir" : `${path.resolve(process.cwd(), './dist/static').replace(/\\/g, '\\')}`, "bucket" : "youBucket", "key_prefix" : "11test/static/", "overwrite" : true, "rescan_local" : true, "log_file" : "qnupload.log", "file_type" : 0 } qiniuUploader(qnConf)
把上面對應的字段換成你本身的七牛的配置就好了,通常這些參數就能夠了,另外,須要特別說明一下src_dir這個參數,mac和windows不同,上面的爲windows平臺的示例,mac應該爲path.resolve(process.cwd(), './test')可是我沒驗證,具體說明和其餘完整的配置參數可參考qshell-qupload官方文檔web
這一步就比較簡單了,直接在package.json裏面的scripts字段加個命令就好了,具體以下:shell
{ "name": "11test", "scripts": { "dev": "node build/dev-server.js", "build": "node build/build.js", "deploy": "gulp deploy", "build-cdn-deploy": "npm run build && node scripts/cdn.js && npm run deploy" } }
而後直接執行npm run build-cdn-deploy就好了npm