日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript、CSS、HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果。
比如,我们的 CDN 域名是:http://a.mycdn.com,本地对应的目录是:D:\\workassets,我们希望所有对 http://a.mycdn.com/* 的访问被映射到本地的 D:\\workassets\\* 下。如访问 http://a.mycdn.com/s/atp.js 时,实际上是读取的是本地的 D:\\workassetss\\atp.js,而不需要从网上下载线上的文件。
实现这个功能很简单,关键点如下:
1、在本地开启一个 HTTP 服务,监听 80 端口;
2、修改系统 hosts 文件,添加“127.0.0.1 a.mycdn.com”,将 CDN 域名绑定为本地服务器地址;
3、配置本地 HTTP 服务,接收到一个 GET 请求后,先检查本地硬盘上是否存在对应的文件,如存在,则返回这个文件的内容,如不存在,则返回线上对应的内容。
可以看到,关键部分是需要搭建一个本地的 HTTP 服务。这方面有很多教程,比如在本地安装 Apache 或 Ngnix 等服务器软件,再配置相应的转发规则等。不过个人觉得这类方法还是有点复杂,本文要介绍的,是另外的不需要安装服务器软件的方法。
因为我们是在本地开发调试,对性能、并发性的要求并不高,因此我们其实并不需要一个像 Apache/Ngnix 这样的专业的 HTTP 软件,我们只需要一段能提供 HTTP 服务的脚本即可。比如用 nodejs 来实现。
var http = require(\"http\"),
url = require(\"url\"),
path = require(\"path\"),
fs = require(\"fs\"),
local_folders,
base_url;
local_folders = [ // 本地路径,代理将在这个列表中的目录下寻找文件,如果没有找到则转到线上地址
\"D:/work/assets\"
];
base_url = \"http://10.232.133.214\"; // 线上路径,如果找不到文件,则转向到这个地址
function loadFile(pathname, response) {
var i, l = local_folders.length,
fn;
console.log(\"try to load \" + pathname);
for (i = 0; i < l; i++) {
fn = local_folders[i] + pathname;
if (path.existsSync(fn) && fs.statSync(fn).isFile()) {
fs.readFile(fn, function (err, data) {
response.writeHead(200);
response.write(data);
response.end();
});
return;
}
}
response.writeHead(302, {
\"Location\":base_url + pathname
});
response.end();
}
http.createServer(
function (request, response) {
var req_url = request.url,
pathname;
// 处理类似 http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css 的请求
pathname = req_url.indexOf(\"??\") == -1 ? url.parse(request.url).pathname : req_url;
console.log(\"Request for \'\" + pathname + \"\' received.\");
loadFile(pathname, response);
}).listen(80);
本文地址:https://www.stayed.cn/item/9255
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我