gulp-upload-manifest
如果你有自己的资源上传接口,开发前端页面的时候最终需要引用上传之后的资源(如:cdn),上传并替换资源的工作可以通过该插件完成
安装
npm install gulp-upload-manifest
使用
假设你有上传文件的接口如下:
Request URL:http://mysite.com/upload
Request Method:POST
Content-Type:multipart/form-data
Content-Disposition: form-data; name="prefix"
Content-Disposition: form-data; name="resource"; filename="app.js"
Content-Type: text/javascript
假设该接口返回的内容如下:
{
url: 'http://mysite.com/autoupload/app.js',
success: true,
}
新建的app工程目录如下:
app
├── app.html
└── asset
├── a.css
├── a.js
└── b.js
app.html文件内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>my app test</title>
<link rel="stylesheet" href="asset/a.css">
</head>
<body>
</body>
<script src="asset/a.js"></script>
<script src="asset/b.js"></script>
</html>
gulpfile.js 如下
const gulp = require('gulp');
const useref = require('gulp-useref');
const uploadManifest = requier('gulp-upload-manifest')
var revReplace = require("gulp-rev-replace");
const filter = require('gulp-filter')
gulp.task('upload', function(){
var options = {
url: "http://mysite.com/upload",
formData: {
prefix: '1'
},
uploadName: 'resource',
rspFun: function(rsp){
if(rsp.success){
return rsp.url;
} else{
return null;
}
}
}
var exceptHtmlFilter = filter(['**/*', '!**/*.html'], {restore: true});
var dist_path = 'dist';
gulp.src('./app/app.html')
.pipe(useref())
.pipe(gulp.dest(dist_path))
.pipe(exceptHtmlFilter)
.pipe(uploadManifest(options))
.pipe(gulp.dest(dist_path))
.on('finish', function() {
var manifest = gulp.src("./"+dist_path+"/upload-manifest.json");
gulp.src('./'+dist_path+'/app.html')
.pipe(debug())
.pipe(revReplace({manifest: manifest}))
.pipe(gulp.dest('dist'))
})
})
执行完upload
任务后将会在dist
目录下生成upload-manifest.json
文件,该文件表示本地的资源文件同上传到服务器的资源文件的映射,并且dist/app.html
中的资源将被替换成如下(app.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>my app test</title>
<link rel="stylesheet" href="http://mysite.com/autoupload/a.css">
</head>
<body>
</body>
<script src="http://mysite.com/autoupload/combined.js"></script>
</html>
API
uploadManifest(options)
options
以下字段都必须在调用接口的时候设置
options.url
type: string
上传文件的接口地址
options.formData
type: string
default: {}
上传文件的接口需要的额外参数,参考formData
options.uploadName
type: string
上传文件接口中要上传文件对应的name
options.rspFun
type: function
return type: string
调用上传文件之后的回调函数, 第一个参数为返回的内容,该函数需要返回最终的url地址(即你的html页面中引用的地址),如果失败返回null
options.rspFun = function(response) {
if(response.success) return response.url;
else return null
}