В процессе ежедневной разработки нам часто необходимо изменить некоторые статические файлы, размещенные на 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 вы фактически читаете Local D: /workassetss/atp.js без загрузки онлайн -файлов из Интернета.
Это очень просто в реализации этой функции, ключевые моменты следующие:
1. Откройте HTTP -сервис локально и прослушайте порт 80;
2. Измените файл системных хостов, добавьте «127.0.0.1 A.Mycdn.com» и свяжите доменное имя CDN с адресом локального сервера;
3. Настройте локальную службу HTTP. После получения запроса GET проверьте, существует ли соответствующий файл на локальном жестком диске. Если он существует, верните содержимое файла. Если его не существует, верните соответствующий контент на строке.
Как видите, ключевая часть - создать локальную службу HTTP. В этом отношении существует много учебных пособий, таких как установка программного обеспечения для сервера, таких как Apache или NGNIX локально, а затем настройка соответствующих правил пересылки. Тем не менее, я лично думаю, что этот метод все еще немного сложный. В этой статье я хочу представить еще один метод, который не требует установки серверного программного обеспечения.
Поскольку мы разрабатываем и отлаживаем локально, у нас нет высоких требований для производительности и параллелизма, поэтому нам на самом деле не нужно профессиональное программное обеспечение для HTTP, такое как Apache/NGNIX. Нам нужен только сценарий, который может предоставить HTTP -услуги. Например, используйте Nodejs для его реализации.
Кода -копия выглядит следующим образом:
/**
* Автор: OldJ
*
**/
var http = require ("http"),
url = require ("url"),
path = require ("path"),
fs = require ("fs"),
local_folders,
base_url;
local_folders = [// локальный путь, агент будет искать файл в каталоге в этом списке, если не найдено, перейдите по онлайн -адресу
"D:/работа/активы"
];
base_url = "http://10.232.133.214"; // онлайн -путь, если файл не может быть найден, обратитесь к этому адресу
Функция LoadFile (pathname, ответ) {
var i, l = local_folders.length,
FN;
console.log («Попробуйте загрузить» + pathname);
for (i = 0; i <l; i ++) {
fn = local_folders [i] + pathname;
if (path.existsync (fn) && fs.statsync (fn) .isfile ()) {
fs.readfile (fn, function (err, data) {
response.writehead (200);
response.write (data);
response.end ();
});
возвращаться;
}
}
response.writehead (302, {
«Местоположение»: BASE_URL + PATHNAME
});
response.end ();
}
http.createserver (
функция (запрос, ответ) {
var req_url = request.url,
ПАТНА;
// Обработка запросов, аналогичные 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 ("запрос на '" + pathname + "" получен. ");
LoadFile (pathname, ответ);
}). Слушай (80);
Обратите внимание, что вы изменяете значения переменных local_folders и base_url выше, на которые вам нужны значения. Сохраните этот файл, например, сохраните его как локальный CDN-proxy.js, а затем выполните «Узел локального CDN-proxy.js» в командной строке, и локальный сервер будет работать. Конечно, не забудьте связать хозяев.
При доступе к пути через HTTP приведенный выше сценарий сначала будет искать в соответствующем локальном каталоге. Если это найдено, он вернет содержимое соответствующего файла. Если это не найдено, он прыгнет непосредственно на соответствующий адрес на линии. Для ситуаций, когда его нельзя найти, есть еще один способ справиться с этим. Локальный сервер загружает соответствующий контент из онлайн и возвращает его. Однако для этого требования достаточно прыжка 302.
В дополнение к версии Nodejs, я также написал версию Python:
Кода -копия выглядит следующим образом:
#-*-кодирование: UTF-8-*-
#
# Автор: OldJ
#
Импорт ОС
Импорт Basehttpserver
Local_folders = [
"D:/работа/активы"
]
Base_url = "http://10.232.133.214"
Класс WebRequestHandler (basehttpserver.basehttprequesthandler):
def do_get (self):
Печать "Запрос на '%s получен". % self.path
для папки в local_folders:
fn = os.path.join (папка, self.path.replace ("/", os.sep) [1:])
Если os.path.isfile (fn):
self.send_response (200)
self.wfile.write (open (fn, "rb"). Read ())
перерыв
еще:
self.send_response (302)
self.send_header ("location", "%s%s"%(base_url, self.path))
server = basehttpserver.httpserver (("0,0.0.0", 80), WebRequestHandler)
server.serve_forever ()
Как видите, код в версии Python намного проще, чем в версии Nodejs.
Функции приведенных выше двух кодов являются относительно простыми, такие как тип MIME, контент-длина и другая информация заголовка без выходного контента, и никакая специальная обработка не выполнена для возможных операций блокировки (например, чтения тайм-аута файла и т. Д.). В местных средах разработки они уже работают в версиях, и вы можете продолжать расширять эти два сценария, чтобы удовлетворить больше потребностей.