当前位置: 首页 > news >正文

成都网站备案查询免费的cms

成都网站备案查询,免费的cms,成都包装设计公司,那个网站可以免费建站Service Worker原理 1.基本概念与使用场景:a.什么是Service Worker#xff1f;它的主要用途是什么#xff1f;b.Service Worker和Web Worker有什么不同#xff1f;c.预缓存和缓存的区别 2. 实现细节:a.描述Service Worker的生命周期。b.如何注册和注销一个Service Worker它的主要用途是什么b.Service Worker和Web Worker有什么不同c.预缓存和缓存的区别 2. 实现细节:a.描述Service Worker的生命周期。b.如何注册和注销一个Service Workerc.怎样使用Service Worker实现资源缓存d.如何确保Service Worker更新后的代码能够被使用e.在Service Worker中如何实现离线数据同步 3.与其他技术的交互:a.Service Worker与Push Notification是如何集成的b.如何使用Service Worker与Background Sync API关键API c.与IndexedDB的交互中Service Worker通常扮演什么角色 4.性能与策略:a.描述一下缓存策略的种类例如Cache First、Network First等。如何选择 b.使用Service Worker可能会带来哪些性能问题如何避免c.在Service Worker中如何实现策略来保存用户的数据或状态1. Cache Storage API2. IndexedDB3. PostMessage API代码示例和关键步骤使用IndexedDB保存购物车信息使用Cache API保存页面状态使用PostMessage API通信 5.安全与隐私:a.Service Worker有哪些安全限制对于HTTPS的要求为什么Service Worker只在HTTPS下工作你如何确保Service Worker不会成为跨站脚本攻击XSS的目标1. 描述Service Worker的重要性2. 识别潜在的安全风险3. 实施的安全措施4. 持续监控和更新 6.问题与挑战:7.其他: 1.基本概念与使用场景: a.什么是Service Worker它的主要用途是什么 ServiceWorker 是一个运行在浏览器背后的独立线程它拥有访问网络的能力可以实现资源缓存、消息推送、后台数据同步等功能. 资源缓存它能拦截和缓存网络请求提高加载速度和优化用户体验。消息推送即便在应用或浏览器未运行的情况下Service Worker也能接收后台推送通知。后台数据同步使用 Background Sync API, 它可以在后台同步数据这在断网或网络不稳定时特别有用。 b.Service Worker和Web Worker有什么不同 主要目的 Service Worker它主要用于拦截网络请求、管理缓存、提供接收推送通知。它是构建Progressive Web Apps (PWA)的核心技术之一。Web Worker它的主要目的是允许开发者在背景线程上执行JavaScript这样可以避免主线程的长时间计算导致的UI阻塞。 生命周期 Service Worker安装、激活和终止。这使得Service Worker可以管理资源缓存、更新策略等。Web Worker没有特定的生命周期它基本上就是一个可以并行执行的线程一旦它完成了任务或被主线程终止它就会结束。 应用场景 Service Worker它主要用于拦截网络请求、管理缓存、提供接收推送通知。它是构建Progressive Web Apps (PWA)的核心技术之一。Web Worker用于执行CPU密集型任务例如图像处理、大数据计算或复杂数学运算而不阻塞UI。 总的来说虽然这两者都在背景线程上执行任务但Service Worker更注重于网络和资源的管理而Web Worker更偏向于为主线程提供计算上的帮助。 c.预缓存和缓存的区别 预缓存Pre-caching和缓存Caching都是用于存储资源的技术但它们在应用生命周期和使用场景上有所不同。 预缓存Pre-caching 时间点预缓存通常在Service Worker的安装Installation阶段进行。指定缓存资源。 目的预缓存的主要目的是加速后续访问(包括离线)。通过预缓存关键资源。 选择性只针对核心和关键资源进行如主要的HTML, CSS, JavaScript文件和主要图片等。 手动管理手动指定哪些文件需要被预缓存。 缓存Caching 时间点缓存一般在应用运行期间进行通常是在Service Worker的fetch事件中处理。当用户访问过一个资源后资源被缓存起来。 目的用于提速重复访问同一资源通过从缓存中读取资源而不是从网络中重新获取从而提高性能。 自动性取决于缓存策略和HTTP头信息。 动态管理缓存的资源通常是动态的可能会随着用户与应用的交互而改变。例如用户上传了一个新图片这个图片可能就会被缓存起来。 2. 实现细节: a.描述Service Worker的生命周期。 注册Registration在主线程的JavaScript代码中注册Service Worker。一旦注册成功浏览器会自动进入安装阶段。 安装Installation进行资源预缓存的最佳时机。缓存静态资源。 等待Waiting一旦安装完成新的Service Worker会处于“等待”状态。这个状态会持续到没有其他活动的Service Worker为止之后新的Service Worker会进入“激活”状态。 激活Activation激活阶段主要用于更新和清理旧缓存。一旦Service Worker被激活它就能控制所有打开的客户端或页面。 运行Running在运行阶段Service Worker会拦截页面的网络请求监听push事件等。它也能通过postMessage API与主线程进行通信。 终止Termination为了节省资源浏览器会在Service Worker不再活动或需要时将其终止。但需要时它会被自动重新唤醒。 更新Update 重点安装install、激活activate和运行 (Running)。 安装install预缓存一些资源确保应用在离线状态下也可以访问这些资源。例如在我之前的TodoList PWA项目中我利用安装事件来缓存了应用的核心静态文件如HTML、CSS、JavaScript和主要的图片资源。 self.addEventListener(install, function(event) {event.waitUntil(caches.open(app-static-v1).then(function(cache) {return cache.addAll([/,/index.html,/styles.css,/main.js,/icon.png]);})); }); 在主线程监听install事件 关键API: caches.open:打开一个缓存 cache.addAll:添加数组中所有缓存 激活activate这个阶段主要用于管理缓存例如删除旧的缓存资源比如版本更新、缓存策略改变。在我的实际开发经历中我使用此阶段来确保用户不会访问到过期的资源。 下面是一段激活阶段用于清理旧缓存的示例代码 self.addEventListener(activate, event {const cacheWhitelist [my-cache-v2]; // 新版本的缓存名列表event.waitUntil(caches.keys().then(cacheNames {return Promise.all(cacheNames.map(cacheName {if (cacheWhitelist.indexOf(cacheName) -1) {// 如果缓存名不在新版本列表里就删除它return caches.delete(cacheName);}}));})); });在这个例子中 activate 事件监听器被定义。使用 caches.keys() 方法获取所有的缓存名称。检查每一个缓存名称是否存在于新版本的缓存名单cacheWhitelist中。 如果不存在使用 caches.delete() 方法删除该缓存。 运行 (Running)这是Service Worker运行中最频繁的阶段。每当页面请求一个资源Service Worker都会捕获请求。**在TodoList PWA项目中我利用这一特性实现了一个网络策略先从缓存中尝试获取资源如果缓存中没有则从网络获取。**这种策略在网络不稳定的地区表现得尤为出色它提高了应用的加载速度并提升了用户体验。 下面的代码示例说明了如何在Service Worker中捕获fetch事件并实现一个简单的缓存优先策略。在这个策略中Service Worker首先会尝试从缓存中获取请求的资源。如果资源存在于缓存中它将返回缓存的版本。如果缓存中没有该资源则会从网络获取 self.addEventListener(fetch, function(event) {event.respondWith(caches.match(event.request) // 尝试从缓存中获取资源.then(function(response) {if (response) {return response; // 如果缓存中有该资源返回缓存的版本}return fetch(event.request) // 否则从网络获取资源.then(function(response) {// 考虑将新获取的资源添加到缓存中return caches.open(dynamic-cache).then(function(cache) {cache.put(event.request, response.clone());return response;});});}).catch(function() {// 如果网络也不可用或其他原因可以返回一个备用页面或资源})); });在这个代码示例中有几个关键的API和步骤 关键API self.addEventListener: 用于给Service Worker添加事件监听器。event.respondWith: 指定fetch事件的响应。caches.match: 尝试在缓存中匹配一个请求。fetch: 用于从网络获取资源。caches.open: 打开一个特定的缓存对象。cache.put: 将请求和响应对象添加到缓存中。 b.如何注册和注销一个Service Worker 在我的实习项目中我使用Service Worker来实现TodoList PWA应用的离线访问和资源缓存功能。以下是注册和注销Service Worker的方法 注册 首先我会检查浏览器是否支持Service Worker使用serviceWorker in navigator。使用navigator.serviceWorker.register(/service-worker.js)方法进行注册这里的/service-worker.js是我的Service Worker脚本的路径。register方法返回一个Promise所以我可以在.then()中处理成功的注册或使用.catch()来处理任何错误。 注销 如果需要注销Service Worker我可以首先通过navigator.serviceWorker.getRegistrations()获取所有的Service Worker注册。这个方法也返回一个Promise一旦得到所有的注册我可以遍历它们并对每一个调用registration.unregister()方法。 c.怎样使用Service Worker实现资源缓存 与生命周期回答相似 d.如何确保Service Worker更新后的代码能够被使用 关于Service Worker的更新这确实是一个很好的问题因为经常有开发者遇到缓存陈旧内容的问题。要确保Service Worker更新后的代码能够被使用我们通常采用以下策略 版本控制在Service Worker的代码中加入版本信息每次更改时都更新版本。这样浏览器会检测到新的Service Worker并开始安装过程。skipWaiting通常新的Service Worker在安装后会等待直到所有的Service Worker clients都关闭。但我们可以使用self.skipWaiting()来强制它立即开始控制新的clients。Clients.claim()在Service Worker激活时使用这个方法可以确保Service Worker立即开始控制任何新的页面。通知用户为用户提供一个提示告知他们应用有更新建议他们刷新页面或重新启动应用来获取新的内容。 在我们的项目中我们结合了以上策略确保了新的代码和内容能够及时地被用户使用从而避免了潜在的错误和混淆。 e.在Service Worker中如何实现离线数据同步 实现 使用Background Sync API当用户在离线状态下做出更改时我们会把这些更改保存在IndexedDB中并为这些更改注册一个背景同步标记。Service Worker的’sync’事件监听当网络再次可用时Service Worker会触发’sync’事件。我们在Service Worker中监听这个事件当它被触发时我们从IndexedDB中获取离线时存储的更改并尝试将它们同步到服务器。处理失败的同步如果同步失败例如因为服务器错误我们会利用Service Worker的retry机制稍后再次尝试同步。 结果通过这种方式我们确保了用户在离线时的任何操作都不会丢失并在他们重新联网时得到了处理。这大大增强了应用的健壮性和用户体验。 3.与其他技术的交互: a.Service Worker与Push Notification是如何集成的 在我之前的项目中我使用Service Worker为我们的Uber PWA应用增加了推送通知功能。这样我们可以在应用未运行或甚至在浏览器关闭的情况下发送通知给用户。 这里是我实现的主要步骤 注册Service Worker首先我确保在页面的主线程中注册了Service Worker并确保它已被成功安装和激活。 用户订阅为了发送推送通知我请求了用户的许可。一旦用户同意浏览器会返回一个PushSubscription对象这个对象包含了发送推送消息所需的所有信息。 保存订阅信息为了以后能发送通知我将这个PushSubscription对象发送到我们的后端并保存在数据库中。 发送通知当我们需要发送推送通知时我们的后端使用保存的PushSubscription信息来触发通知。这个通知请求发送到推送服务如FCM或VAPID。 Service Worker监听在Service Worker脚本中我添加了一个push事件的监听器。当通知到达时这个事件会被触发并允许我们自定义通知的内容和行为。 显示通知最后在push事件的监听器中我使用self.registration.showNotification()方法来显示实际的通知。 在实现这个功能的过程中我确保优化了用户体验如在不同情况下为通知设置了不同的优先级并处理了用户点击通知后的行为。通过结合Service Worker和Push Notification我们为用户提供了实时的通知服务从而增强了应用的用户体验和用户参与度。 b.如何使用Service Worker与Background Sync API Background Sync API 是一个允许在网络恢复后进行延迟操作的Web API。这意味着当用户处于离线状态或网络连接不稳定时应用程序仍然可以完成某些操作例如发送数据然后等待网络连接恢复后再实际执行这些操作。这种技术通常与 Service Worker 一起使用以实现更复杂的离线功能和性能优化。 关键API SyncManager.register(tag) 在主线程中注册一个同步事件。当网络连接恢复时Service Worker 中的 sync 事件将被触发。 syncManager.register(mySyncEvent);Service Worker 中的 ‘sync’ 事件 在 Service Worker 文件中你可以监听 sync 事件并在触发时执行相关代码。 self.addEventListener(sync, function(event) {if (event.tag mySyncEvent) {event.waitUntil(doSomething());} });示例 假设你有一个表单用户填写表单后点击“提交”按钮。如果用户当前离线你可以使用 Background Sync 来延迟提交操作。 // 在页面中 if (serviceWorker in navigator SyncManager in window) {navigator.serviceWorker.ready.then(function(registration) {return registration.sync.register(submitForm);}).catch(function() {// 同步注册失败}); }// 在 Service Worker 中 self.addEventListener(sync, function(event) {if (event.tag submitForm) {event.waitUntil(// 你的提交表单逻辑);} });c.与IndexedDB的交互中Service Worker通常扮演什么角色 4.性能与策略: a.描述一下缓存策略的种类例如Cache First、Network First等。 service Worker是实现几种缓存策略的关键 缓存策略 Cache First首先检查缓存中是否有所需资源。如果有则从缓存中取出如果没有则通过网络获取。我们用这种策略来缓存那些不经常改变的静态资源。 Network First先尝试从网络获取资源。如果请求成功将资源放入缓存如果请求失败再从缓存中检索。这种策略适用于数据或内容经常变化的情况。 Cache Only只从缓存中获取资源如果资源不在缓存中则失败。我们用这种策略在应用的某些部分确保速度。 Network Only总是从网络获取资源。适用于始终需要从服务器获取最新信息的场景。 在Uber PWA应用的开发中我们主要采用了Cache First和Network First的策略以确保用户能够在没有网络连接时仍能访问应用的主要部分同时确保某些关键信息如定位或价格更新始终是最新的。 缓存策略的选择取决于多个因素包括应用类型、用户需求、网络环境等。以下是一些常用的缓存策略和选择它们的理由 Cache First缓存优先 适用场景静态资源、不经常变动的数据。优点快速响应减少网络请求。缺点可能返回过期或陈旧的数据。 Network First网络优先 适用场景实时数据如新闻、股票价格。优点始终尝试返回最新数据。缺点如果网络慢或不可用会影响用户体验。 Cache Then Network先缓存后网络 适用场景适用于渐进式加载先从缓存加载旧数据然后再从网络更新。优点快速响应也能更新数据。缺点可能会导致页面内容跳动或重新渲染。 Network Only仅网络 适用场景对实时性要求非常高的情况比如实时聊天。优点始终获取最新数据。缺点完全依赖网络。 Cache Only仅缓存 适用场景已知资源一定在缓存中的情况。优点无需网络快速响应。缺点如果资源不在缓存中会失败。 如何选择 考虑数据新鲜度如果数据需要是最新的使用Network First或Network Only。 考虑性能和响应时间如果性能是关键因素使用Cache First或Cache Only。 考虑离线支持如果应用需要在离线状态下工作考虑使用Cache First、Cache Only或。 考虑复杂性更复杂的策略如Cache Then Network可能需要更多的逻辑来实现。 测试和评估最终不论选择哪种策略都需要进行充分的测试来确定其是否符合你的应用需求。 b.使用Service Worker可能会带来哪些性能问题如何避免 过度缓存初次尝试使用Service Worker时我发现应用可能会缓存过多不常用的资源导致用户首次访问时消耗大量的数据。为了解决这个问题我仔细筛选了要预缓存的资源只缓存核心资源并在Service Worker更新时及时清理旧的缓存。比如多媒体内容例如视频和音频文件通常很大除非它们是应用的核心部分否则没必要预缓存 缓存过期随着应用迭代有些缓存的资源可能已经过期或不再使用。为了避免这种情况我在Service Worker中实现了版本管理确保在新版本发布时过期的资源能被及时清理。在Service Worker脚本的顶部定义一个版本变量。这个变量应该每次发布新版本时更新。 缓存策略选择不同的资源和请求需要不同的缓存策略。例如对于一些频繁更新的API请求我使用“网络优先”的策略确保用户总是获得最新数据。而对于一些静态资源我使用“缓存优先”策略以提高加载速度。 同步更新的挑战利用Service Worker的Background Sync功能进行后台数据同步时可能会遇到网络不稳定导致的同步失败。为了处理这种情况我实现了一个重试机制并确保在网络恢复时尝试再次同步。 c.在Service Worker中如何实现策略来保存用户的数据或状态 在Service Worker中实现策略来保存用户的数据或状态通常会用到以下几种技术 1. Cache Storage API Service Worker有访问Cache Storage的权限通常用于缓存静态资源但也可以用于保存用户状态或其他数据。 2. IndexedDB IndexedDB是一个运行在浏览器中的非关系型数据库Service Worker可以访问它。它适用于保存大量的结构化数据包括文件、Blob等。 3. PostMessage API 使用postMessage APIService Worker可以与页面进行通信获取或设置用户状态。 代码示例和关键步骤 假设我们要保存用户的购物车信息 使用IndexedDB保存购物车信息 // In Service Worker self.addEventListener(fetch, function(event) {if (event.request.url.endsWith(/add-to-cart)) {event.respondWith(// ...handle request);event.waitUntil(updateCartInIndexedDB(event.request));} });async function updateCartInIndexedDB(request) {const cartData await fetch(request).then(res res.json());const db await openIndexedDB();const tx db.transaction([cart], readwrite);const store tx.objectStore(cart);store.put(cartData); }async function openIndexedDB() {return new Promise((resolve, reject) {const request indexedDB.open(myDatabase, 1);request.onsuccess function() {resolve(request.result);};request.onerror function() {reject(request.error);};request.onupgradeneeded function(e) {const db e.target.result;if (!db.objectStoreNames.contains(cart)) {db.createObjectStore(cart);}};}); }使用Cache API保存页面状态 // 在Service Worker中 self.addEventListener(fetch, function(event) {if (event.request.url.endsWith(/some-page)) {event.respondWith(caches.match(event.request).then(function(response) {return response || fetch(event.request);}));event.waitUntil(updatePageCache(event.request));} });async function updatePageCache(request) {const response await fetch(request);const cache await caches.open(my-cache);cache.put(request, response); }使用PostMessage API通信 在Service Worker中 self.addEventListener(message, function(event) {if (event.data.type SET_USER_STATE) {// Save user stateconst userState event.data.userState;saveUserState(userState);} });在页面中 if (serviceWorker in navigator) {navigator.serviceWorker.controller.postMessage({type: SET_USER_STATE,userState: {loggedIn: true,},}); }这样通过Cache Storage、IndexedDB和postMessage你可以在Service Worker中保存并管理用户数据和状态。 5.安全与隐私: a.Service Worker有哪些安全限制 基础回答 Service Worker的主要安全限制包括 只在HTTPS上运行为了防止中间人攻击Service Worker只能在HTTPS或者localhost上注册和运行。 同源限制Service Worker只能拦截和处理与其相同源的请求这是为了避免跨站请求伪造CSRF等安全问题。 Cookie和HeaderService Worker不能访问Cookie和HTTP Header这样能减少跨站脚本攻击XSS的可能。 全局作用域隔离Service Worker运行在与页面不同的全局作用域中减少了它能够访问的DOM元素。 结合项目经验 例如在我之前的项目中我们利用Service Worker来做缓存和离线访问其中就涉及到了这些安全限制 HTTPS限制我们的所有服务都是部署在HTTPS上的所以这个限制没有影响到我们。 同源限制在Service Worker中我们只处理了来自同一源的API请求和资料没有涉及到跨域资源因此遵循了这一限制。 Cookie和Header由于不能访问Cookie和Header我们使用了一些其他方式来处理身份验证和状态管理。 通过这样的回答方式你不仅回答了面试官的问题还通过实际的项目经验展示了你对Service Worker安全限制的理解和应用。这种答题方式通常更能得到面试官的认可。 对于HTTPS的要求为什么Service Worker只在HTTPS下工作 基础解释 首先解释 HTTPS 和 HTTP 的基本区别。强调 HTTPS 提供了额外的安全层因为它使用 SSL/TLS 来加密所有传输的数据。然后你可以指出 Service Worker 的工作原理包括拦截网络请求和缓存资源等都具有很高的安全风险。在非 HTTPS 的环境下中间人攻击更容易发生可能导致 Service Worker 的恶意注册和篡改。 结合项目经验 如果你有与 Service Worker 和 HTTPS 相关的实际项目经验这将是一个很好的切入点。例如你可以说 “在我之前的项目中我们实现了一个用于缓存页面资源和提高加载速度的 PWAProgressive Web App。由于 Service Worker 具有拦截请求和缓存内容的能力因此非常重要的一点是确保所有事务都是安全的。这就是为什么我们确保只在 HTTPS 下注册和使用 Service Worker。这不仅符合浏览器的要求而且也确保了用户数据的完整性和隐私。” 这样的回答展示了你不仅理解这一要求的理论背景而且还有实际操作经验。 通过这两点你可以全面而具体地解答面试官的问题同时展示你的专业知识和项目经验。 你如何确保Service Worker不会成为跨站脚本攻击XSS的目标 在面试中你可以通过以下几个步骤结合你的项目经验来回答这个问题 1. 描述Service Worker的重要性 首先你可以简要介绍Service Worker在你项目中的角色比如用于缓存策略、离线访问、推送通知等。 例子 “在我们的Uber打车PWA应用程序中Service Worker主要用于优化TodoList的离线访问体验通过缓存策略以及与IndexedDB结合提供更快的加载速度和更好的用户体验。” 2. 识别潜在的安全风险 明确指出Service Worker由于其强大的能力也可能成为XSS攻击的目标。 例子 “由于Service Worker可以拦截网络请求和操作缓存如果被恶意脚本控制它可以对网站的安全造成威胁。” 3. 实施的安全措施 描述在项目中你如何确保Service Worker不会被用于XSS攻击。 例子 “我们只从信任的源加载Service Worker脚本并且使用了Subresource IntegritySRI来验证脚本的完整性。”“我们采用了内容安全策略CSP以限制脚本的来源和执行行为。”“在应用程序中所有与Service Worker相关的操作都进行了严格的输入验证和输出编码以防止恶意脚本注入。” 4. 持续监控和更新 提及你如何保持与安全漏洞相关的知识更新并定期检查Service Worker的安全性。 例子 “我们定期进行代码审查和安全扫描以及紧跟Service Worker和Web安全的最新发展确保我们的实践始终是最佳的。” 通过这种方式你不仅回答了问题还展示了你是如何在实际项目中应用这些最佳实践的这将增加你的专业可信度。 6.问题与挑战: 描述一次你在使用Service Worker时遇到的问题以及你是如何解决的。你认为Service Worker的哪些方面需要进一步改进 7.其他: 在使用Service Worker时哪些浏览器特性或API与之搭配使用可以获得更好的效果如何确保Service Worker与现有的服务器策略例如ETag、Cache-Control等协同工作 ServiceWorker 让你的网页拥抱服务端的能力
http://www.w-s-a.com/news/758076/

相关文章:

  • 延安网站建设公司电话手机上那个网站做农产品推广比较好
  • 增城哪家网站建设好如何做网站实名认证
  • 常州地区做网站个人购物网站需要备案吗
  • 网站建设公司 跨界鱼科技专业做服务器的网站都有哪些
  • 欧洲网站服务器网站建设费用计入什么科目
  • 网站的色调苏州策划网站模板建站公司
  • 怎么看网站用的什么后台公路建设项目可行性研究报告编制办法哪个网站查最新版
  • 可以看的网站的浏览器有哪些专业APP客户端做网站
  • 如何做网站推广自己的产品推荐个网站好吗
  • 网站经营范围wordpress注入点
  • 学校网站开发协议夫妻网络网站建设
  • 福州网站seo推广优化微信商家小程序怎么弄
  • 免费网站推广工具在游戏网站做中介合法
  • 网站建设前的规划网站建设公司六安
  • 公司注册网站开发的行业表述南宁在百度上建网站
  • 创建企业网站国内网站用django做的
  • 云主机网站的空间在哪制作微网站的平台
  • 长沙做网站 青创互联wordpress4.4.1
  • 宜昌哪里有专业做网站的网站开发做什么的
  • 3小说网站开发东莞网站公司哪家好
  • 做网站安全联盟解ps网站设计概述
  • 聊城公司做网站wordpress连接域名
  • 宣传网站建设的意义台州行app官网下载
  • 温州 网站优化网站开发公司前置审批
  • 网站开发具体的工作内容网站下载app免费
  • seo网站建设时文章频率昆山网站建设ikelv
  • 中天建设中瑞物资网站优化建立生育支持政策体系
  • 网站页面的宽度大网站怎样选域名
  • icp网站备案流程wordpress post 405
  • 网站怎样上传到空间重庆有多少网站