├── README.md
├── dev //開發環境打包代碼
├── dist //生產環境打包代碼
├── favicon.ico
├── gulp //gulp配置
├── gulpfile.babel.js //babel配置
├── package.json
├── src
│ ├── html //index入口文件
│ │ ├── ejs
│ │ │ └── footer.ejs
│ │ └── index.html
│ ├── imgs //圖片
│ │ └── 123.jpeg
│ ├── js //js
│ │ ├── index.js
│ │ └── moduleA.js
│ ├── lang //國際化語言文件
│ │ ├── en.json
│ │ └── zh-cn.json
│ ├── scss //sass文件
│ │ ├── common
│ │ │ └── _reset.scss
│ │ └── index.scss
│ └── static //靜態文件
│ └── jquery-3.2.1.min.js
└── user.config.js.config //開發配置文件
複製代碼
//gulpfile.babel.js文件
import requireDir from 'require-dir'
requireDir('./gulp/task')
requireDir('./gulp')
複製代碼
項目分爲開發環境和生產環境兩個主要任務,/gulp/dev.js是開發環境任務,/gulp/prod.js是生產環境任務,/gulp/task/文件夾下是其餘任務css
npm 命令html
"scripts": {
"start": "npm run dev",//開發環境
"dev": "gulp dev",
"build": "gulp prod"//生產環境
},
複製代碼
gulp.task('dev',
gulp.series(
'clean:dev',
'html:dev',
gulp.parallel('scss:dev', 'js:dev', 'static:dev', 'favicon:dev'),
'img:dev',
'server'
))
複製代碼
開發環境使用 browser-sync 搭建服務器,使用 http-proxy-middleware 代理請求jquery
同時建立user.config.js.config文件,供開發配置服務端口和請求代理配置使用,須要複製一份改成user.config.js,防止多人開發衝突。webpack
開發環境不進行代碼壓縮等處理,打包後代碼放在dev文件夾下git
/gulp/task/server.js文件中建立server任務es6
gulp.task('server', function () {
browserSync.init({
server: "./dev",
port: userConfig.port,
middleware: proxyMiddleware
});
});
複製代碼
gulp.task('prod',
gulp.series(
'clean',
'html:prod',
gulp.parallel('scss:prod', 'js:prod', 'static:prod', 'favicon:dist'),
'img:prod'
))
複製代碼
gulp.task('clean:prod',function () {
return gulp.src('./dist', {read: false,allowEmpty: true})
.pipe(gulpClean());
})
gulp.task('clean:dev',function () {
return gulp.src('./dev', {read: false,allowEmpty: true})
.pipe(gulpClean());
})
gulp.task('clean',gulp.parallel('clean:prod','clean:dev'))
複製代碼
<script src="/js/index.js"></script>
複製代碼
//若是須要多個入口文件,則繼續配置
let entries = [
{
name: 'index',
entry: ['src/js/index.js']
}
]
複製代碼
//使用browserify和babel打包js文件
function makeBundle(name,entry){
if(!bundleArr[name]){
let b = browserify({
entries: entry,
debug: devServer,
extensions: ['es6'],
})
.transform(html2js)
.transform(babelify)
.on('error', function (err) { console.error(err); })
bundleArr[name] = b
}
return bundleArr[name]
}
//直接打包不檢測更新
function bundle(name,entry){
let b = makeBundle(name,entry)
return b
.bundle()
.pipe(source(`${name}.js`))
.pipe(buffer())
.pipe(replace('@img', 'img'))
.pipe(gulp.dest('dev/js'))
.pipe(gulpif(devServer,global.browserSync.reload({stream: true})))//文件變化刷新瀏覽器
}
//開發環境打包
let devArrFun = entries.map(i=>{//循環入口,每一個文件都打包
return devFun.bind(null,i.name,i.entry)
})
//打包js並檢測更新
function devFun(name,entry) {
devServer = true
let b = makeBundle(name,entry)
b.plugin(watchify);
//文件變化從新打包js
b.on('update',bundle.bind(null,name,entry))
return bundle(name,entry)
}
//生產環境打包
let prodArrFun = entries.map(i=>{
return bundle.bind(null,i.name,i.entry)
})
gulp.task('js',gulp.parallel(prodArrFun))
//開發環境任務
gulp.task('js:dev',gulp.parallel(devArrFun))
//將dev中文件轉入dist文件夾中
gulp.task('js:dev2dist',function () {
return gulp.src('dev/js/*.js')
.pipe(uglify())
.pipe(md5(6, './dist/*.html'))
.pipe(gulp.dest('dist/js'))
})
//生產環境任務
gulp.task('js:prod',gulp.series('js','js:dev2dist'))
複製代碼
<link rel="stylesheet" href="/css/index.css">
複製代碼
function scss() {
return gulp
.src('./src/scss/*.scss')//查找入口文件
.pipe(gulpif(devServer,sourcemaps.init()))//開發環境添加sourcemap配置
.pipe(sass().on('error', sass.logError))
.pipe(postcss([autoprefixer()]))//添加瀏覽器前綴
.pipe(replace('../imgs', '../imgs'))//處理圖片路徑
.pipe(replace('../../imgs', '../imgs'))
.pipe(gulpif(devServer,sourcemaps.write()))
.pipe(gulp.dest('./dev/css'));//開發環境存放文件
}
gulp.task('scss',scss)
gulp.task('scss:dev', function () {
devServer = true
//開發環境監聽文件變化從新打包並刷新瀏覽器
gulp.watch(['./src/scss/*.scss','./src/scss/*/*.*'], function (event) {
return scss().pipe(global.browserSync.reload({stream: true}));
});
return scss()
});
gulp.task('scss:dev2dist',function () {
return gulp.src('./dev/css/*.css')
.pipe(webpcss())//處理webp文件
.pipe(cleanCSS())//壓縮文件
.pipe(md5(6, './dist/*.html'))//添加hash,並替換html中的文件名稱
.pipe(gulp.dest('./dist/css'));//生產環境保存文件
})
gulp.task('scss:prod', gulp.series('scss','scss:dev2dist'));
複製代碼
const srcArr = ['./src/imgs/*.{png,gif,jpg,jpeg}','./src/imgs/*/*.{png,gif,jpg,jpeg}']
function img(){
return gulp
.src(srcArr)
.pipe(gulp.dest('./dev/imgs'))
}
gulp.task('img',img)
gulp.task('img:dev',function () {
gulp.watch(srcArr, function (event) {
return img(event.path)
.pipe(global.browserSync.reload({stream: true}))
});
return img();
})
gulp.task('img:dev2dist',function () {
return gulp
.src(srcArr)
.pipe(imagemin())//壓縮圖片
.pipe(md5(6, ['./dist/*.html', './dist/css/*.css', './dist/js/*.js']))//添加hash,替換文件名
.pipe(gulp.dest('./dist/imgs'))
})
gulp.task('img:prod',gulp.series('img','img:dev2dist'))
複製代碼
<script src="/static/jquery-3.2.1.min.js"></script>
複製代碼
<%- include('ejs/footer',{type: common.type}) %>
複製代碼
//該配置會打包出index.html(中文)以及index-en.html(英文)兩個頁面
//html入口文件
let htmlConfig = [
{
entry: 'src/html/index.html',
name: 'index.html',//打包後文件名
lang: 'zh-cn'//ejs語言配置文件,對應/src/lang下的json文件
},
{
entry: 'src/html/index.html',
name: 'index-en.html',
lang: 'en'
},
]
複製代碼
//en.json
{
"footer": "footer"
}
//zh-cn.json
{
"footer": "福特兒"
}
複製代碼
<div><%= footer %></div>
複製代碼
//index.html
<div>福特兒</div>
//index-en.html
<div>footer</div>
複製代碼
咱們還可以使用ejs其餘語法編寫好比:按條件渲染生成不一樣html處理頁面差別、用變量處理dom元素屬性、生成不一樣class處理語言顯示等問題,這些就須要靠你的智慧了。github
任務代碼web
//處理ejs模板
function html(config){
return gulp
.src(config.entry)
.pipe(data(function(file) {//加載語言配置
return JSON.parse(fs.readFileSync(`src/lang/${config.lang}.json`))
}))
.pipe(replace('../imgs', './imgs'))//替換圖片路徑
.pipe(replace('../../imgs', './imgs'))
.pipe(ejs().on('error', handleError))//錯誤處理
.pipe(rename(config.name))//替換文件名
.pipe(gulp.dest('dev'))
}
let htmlDevArr = htmlConfig.map(config=>{
return function (config) {
//監聽變化從新打包而且刷新瀏覽器
gulp.watch([config.entry,'src/html/*/*.*','src/lang/*'], function (event) {
return html(config).pipe(global.browserSync.reload({stream: true}));
});
return html(config)
}.bind(null,config)
})
//開發環境命令
gulp.task('html:dev',gulp.parallel(htmlDevArr))
gulp.task('html:dev2dist',function () {
return gulp
.src('dev/*.html')
.pipe(htmlmin({ collapseWhitespace: true }))//壓縮html
.pipe(gulp.dest('dist'))
})
let htmlProdArr = htmlConfig.map(config=>{
return function (config) {
return html(config)
}.bind(null,config)
})
//生產環境命令
gulp.task('html:prod',gulp.series(gulp.parallel(htmlProdArr),'html:dev2dist'))
複製代碼
const notify = require("gulp-notify");
module.exports = function(){
var args = Array.prototype.slice.call(arguments)
notify.onError({
title: 'compile error',
message: '<%=error.message %>'
}).apply(this, args)
this.emit();
}
複製代碼