Nodejs 如何实现本地与在线js资源切换?
Nodejs 如何实现本地与在线js资源切换?
如果本地路径有对应js资源,无需从网络加载,如果没有就从网络加载, 如何实现这一点?
不借助服务端脚本,在纯静态页面中可以做到js切换功能么? 这样在本地打开页面时,不用从网络加载,性能会好很多
当然可以。在纯静态页面中,我们可以通过JavaScript动态地判断本地是否有对应的JS资源文件,如果没有,则从网络加载。这种方法可以显著提高性能,尤其是在本地开发环境中。
示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Local and Online JS Switching</title>
</head>
<body>
<script>
// 定义本地和在线资源的URL
const localPath = 'local.js';
const onlinePath = 'https://example.com/online.js';
// 创建一个函数来检查本地文件是否存在
function checkLocalFile(path) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('HEAD', path, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
resolve(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304);
}
};
xhr.onerror = function() {
resolve(false);
};
xhr.send();
});
}
// 动态加载JS文件
async function loadScript(url) {
const script = document.createElement('script');
script.src = url;
document.body.appendChild(script);
}
// 主逻辑
(async () => {
try {
const isLocalFileAvailable = await checkLocalFile(localPath);
if (isLocalFileAvailable) {
console.log('Local file found, loading from local.');
await loadScript(localPath);
} else {
console.log('Local file not found, loading from online.');
await loadScript(onlinePath);
}
} catch (error) {
console.error('Error:', error);
}
})();
</script>
</body>
</html>
解释
-
定义资源路径:
localPath
是本地资源的路径。onlinePath
是在线资源的URL。
-
检查本地文件是否存在:
- 使用
XMLHttpRequest
发送一个 HEAD 请求来检查文件是否存在。如果状态码在 200 到 299 之间或为 304(未修改),则认为文件存在。
- 使用
-
动态加载JS文件:
- 创建一个
<script>
元素,并设置其src
属性为指定的 URL,然后将其添加到文档中。
- 创建一个
-
主逻辑:
- 使用
async
函数异步执行逻辑,首先检查本地文件是否存在,如果存在则加载本地文件,否则加载在线文件。
- 使用
这种方法确保了在本地开发环境中尽可能使用本地资源,从而提高性能和加载速度。
从来没见过这么做的。 在写 js 资源之前,就决定好它是来来自网络还是本地,如果你觉得网络慢的话,就在本地放一份。
我能说我没明白你的意思么?你指的是类似于 304 Not Modified
之类的状态码么?
浏览器一直这么做的,而且做的比你想得好。
不止检测本地资源,还检测本地资源是否够新鲜。
HTML5 的 File API 允许读用户选择的文件用来上传。写文件的API似乎停止了。
http://www.w3.org/TR/file-upload/ http://www.w3.org/TR/file-writer-api/
要实现本地与在线JS资源的自动切换,可以通过在客户端(即浏览器)中检查本地文件是否存在来决定是从本地加载还是从网络加载。这可以在纯静态页面中实现,不需要服务端脚本的支持。
以下是一个简单的实现方案:
- 创建一个函数来检测本地文件是否存在。
- 根据检测结果动态设置
<script>
标签的src
属性。
由于浏览器环境中无法直接访问本地文件系统(出于安全原因),你可以通过一些技巧来间接实现这一目标。例如,可以使用fetch
API尝试从相对路径加载本地文件,然后根据响应状态判断文件是否存在。
function loadScript(url, localPath) {
fetch(localPath)
.then(response => {
if (response.ok) {
// 如果本地文件存在,则创建指向本地文件的 script 标签
const script = document.createElement('script');
script.src = localPath;
document.head.appendChild(script);
} else {
// 如果本地文件不存在,则从远程地址加载
const script = document.createElement('script');
script.src = url;
document.head.appendChild(script);
}
})
.catch(() => {
// 如果请求本地文件失败(可能是由于CORS或其他错误),则从远程地址加载
const script = document.createElement('script');
script.src = url;
document.head.appendChild(script);
});
}
// 使用示例
loadScript(
'https://example.com/remote-script.js',
'./local-script.js'
);
上述代码中,loadScript
函数接受两个参数:一个是远程脚本的URL,另一个是本地脚本的路径。它首先尝试从本地路径加载脚本。如果成功,说明本地文件存在,并创建一个指向该文件的<script>
标签。如果失败或出现错误,将从远程地址加载脚本。
需要注意的是,这种方法依赖于浏览器支持fetch
API,并且可能需要处理跨域资源共享(CORS)问题。此外,由于浏览器的安全限制,这种方式可能在某些情况下不可行,尤其是当页面以file://
协议在本地文件系统中打开时。