一文讲透Vue3服务器端渲染: 比较SSR和SSG的应用和优势

‍♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。

吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解决技术难题。

 吾之文章,可使汝在编程之路上,少走弯路,更上层楼,攀技术之巅峰。

若此篇文章对阁下有所裨益, 敬请-点赞 ⭐ - 收藏  - 关注

目录

一、Vue 3服务器端渲染(SSR)概述

基本概念

Vue 3中的实现方式

案例说明

二、Vue 3静态站点生成(SSG)基础

工作原理

在Vue 3中使用SSG

案例说明

三、性能对比:Vue 3 SSR vs SSG

加载时间

服务器负载

案例说明

四、SEO优化:SSR与SSG在搜索引擎优化中的角色

SSR (服务器端渲染)对SEO的影响

SSG (静态站点生成)对SEO的影响

最佳实践

五、用户体验(UX):SSR与SSG的考量

首屏加载时间

交互性

案例说明

六、缓存策略:在Vue 3 SSR和SSG中的应用

SSR中的缓存策略

SSG中的缓存策略

案例说明

七、构建与部署:SSR与SSG的流程差异

SSR项目的构建和部署

SSG项目的构建和部署

案例说明

八、动态内容处理:SSR与SSG的解决方案

SSR中处理动态内容

SSG中处理动态内容

案例说明

九、安全性考虑:SSR与SSG的安全隐患及防护

SSR的安全问题

SSG的安全问题

防护措施的案例说明

十、总结

用户体验

缓存策略

构建与部署

处理动态内容

安全问题


一、Vue 3服务器端渲染(SSR)概述

基本概念

服务器端渲染(SSR)是一种技术,它允许JavaScript框架在服务器上生成完整的HTML页面,然后将这些页面发送到客户端。这与传统的客户端渲染(CSR)不同,在CSR中,HTML页面最初是空的,所有内容的渲染都是在浏览器中通过JavaScript完成的。

SSR的主要优势包括:

  • 更快的首屏加载时间:用户可以更快地看到页面的第一屏内容,因为服务器已经预先渲染了页面。

  • 更好的搜索引擎优化(SEO):由于页面内容在服务器上已经生成,搜索引擎爬虫可以更容易地抓取和索引站点内容。

  • 更好的社交媒体分享:当页面被分享到社交媒体时,预渲染的HTML可以确保正确的预览图和描述。

Vue 3中的实现方式

在Vue 3中,SSR可以通过使用官方支持的SSR库或框架来实现,例如@vue/server-renderer。这个库提供了将Vue组件渲染为服务器端HTML字符串的能力。

实现Vue 3 SSR的基本步骤通常包括:

  1. 创建Vue应用:使用createSSRApp方法创建一个Vue应用实例,这与客户端应用的创建方式类似,但专门用于SSR。

  2. 服务器设置:在Node.js服务器上设置一个服务,用于处理入站请求,并为每个请求创建新的Vue应用实例。

  3. 组件渲染:使用renderToString函数从@vue/server-renderer将Vue应用实例渲染为HTML字符串。

  4. HTML响应:将渲染好的HTML字符串作为响应发送给客户端。

  5. 客户端激活:客户端接收到HTML后,Vue客户端应用会"激活"这些静态标记,使其变为动态的,可以响应用户交互。

案例说明

假设我们有一个简单的Vue 3应用,我们想要在服务器上渲染它。以下是一个简化的例子:

// server.js
const { createSSRApp } = require('vue');
const { renderToString } = require('@vue/server-renderer');
const express = require('express');
const app = express();

app.get('*', async (req, res) => {
  const vueApp = createSSRApp({
    data() {
      return { message: 'Hello, SSR!' };
    },
    template: `
{{ message }}
` }); try { const appContent = await renderToString(vueApp); const html = ` Vue 3 SSR Example ${appContent} `; res.send(html); } catch (err) { res.status(500).send('Server Error'); } }); app.listen(3000, () => { console.log('Server is running on port 3000'); });

在这个例子中,我们使用了Express.js作为服务器框架。对于任何请求,我们都创建一个新的Vue应用实例,然后使用renderToString函数将其渲染为HTML字符串。最后,我们将这个HTML字符串作为响应发送给客户端。

这个简单的例子展示了Vue 3 SSR的基本概念和实现方式。在实际的生产环境中,你可能需要考虑更多的因素,比如路由、状态管理、数据预取等。

二、Vue 3静态站点生成(SSG)基础

工作原理

静态站点生成(SSG)是一种预渲染技术,它在构建时生成所有必要的HTML页面。与服务器端渲染(SSR)不同,SSG不需要服务器动态生成页面内容,因为所有页面在构建阶段就已经生成好了。

SSG的主要优势包括:

  • 更快的加载速度:静态文件可以直接由CDN提供,减少了服务器处理时间。

  • 更高的安全性:没有服务器端动态执行代码,减少了安全漏洞的风险。

  • 更低的托管成本:静态文件可以托管在任何静态文件服务器上,通常成本较低。

在Vue 3中使用SSG

在Vue 3中,可以使用像VitePress或VuePress这样的静态站点生成器,或者使用像Vite或Webpack这样的构建工具配合SSG插件来实现静态站点的生成。

以下是使用VuePress作为静态站点生成器的基本步骤:

  1. 安装VuePress:在你的Vue项目中安装VuePress作为一个依赖。

  2. 创建文档:按照VuePress的约定,创建Markdown文件和配置文件。

  3. 构建静态站点:运行VuePress构建命令,生成静态文件。

  4. 部署站点:将生成的静态文件部署到静态文件服务器或CDN上。

案例说明

假设我们有一个Vue 3项目,并且我们想要使用VuePress来生成静态站点。以下是一个简化的例子:

首先,安装VuePress:

npm install -D vuepress

然后,在项目根目录下创建一个名为docs的文件夹,并在其中创建一个README.md文件:

# Hello VuePress

Welcome to your VuePress site.

接下来,添加一个scripts字段到你的package.json文件中,以便能够使用npm命令来启动VuePress:

{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
}

现在,你可以使用以下命令来本地运行VuePress:

npm run docs:dev

当你准备好生成静态站点时,运行以下命令:

npm run docs:build

VuePress将在docs/.vuepress/dist目录下生成静态文件。最后,你可以将这个dist目录的内容部署到任何静态文件托管服务,如GitHub Pages、Netlify或Vercel。

这个简单的例子展示了如何在Vue 3项目中使用VuePress进行静态站点生成。在实际的生产环境中,你可能需要配置更多的VuePress选项,添加自定义主题,或者集成其他构建工具来满足更复杂的需求。

三、性能对比:Vue 3 SSR vs SSG

加载时间

SSR (服务器端渲染)

  • 首屏加载时间通常比纯客户端渲染快,因为服务器发送的HTML页面已经包含了渲染好的内容。

  • 对于动态内容丰富的应用,每次用户请求都需要服务器实时渲染页面,这可能导致延迟。

SSG (静态站点生成)

  • 首屏加载时间通常非常快,因为页面是预先生成的静态HTML文件,可以直接从CDN或静态文件服务器快速提供。

  • 对于所有用户,加载时间是一致的,因为每个页面都是预先生成的,没有服务器渲染的延迟。

服务器负载

SSR

  • 服务器负载较高,因为每个页面请求都需要服务器计算和渲染。

  • 对于高流量网站,服务器可能需要更多的资源来处理并发请求,这可能需要更强大的硬件或更多的服务器实例。

SSG

  • 服务器负载较低,因为页面是静态的,服务器只需提供文件即可,不需要额外的渲染计算。

  • 静态文件可以被缓存并分发到全球的CDN节点,进一步减轻原始服务器的负载。

案例说明

假设我们有一个博客网站,我们可以选择使用SSR或SSG来提供内容。以下是两种情况的性能对比案例:

SSR案例

  • 我们使用Nuxt.js(Vue的SSR框架)来构建博客网站。

  • 每当用户访问博客文章时,服务器都会实时渲染页面并提供给用户。

  • 在流量高峰期,服务器可能会遇到性能瓶颈,因为它需要为每个请求渲染页面。

SSG案例

  • 我们使用VuePress来生成博客的静态页面。

  • 所有博客文章在构建阶段就已经生成好了,并被部署到CDN上。

  • 用户访问任何博客文章时,都会从最近的CDN节点快速加载静态内容。

  • 服务器几乎不承受负载,因为所有请求都由CDN处理。

在这个例子中,SSG提供了更快的加载时间和更低的服务器负载。然而,如果博客需要实时更新或显示用户个性化内容,SSR可能是更好的选择,因为它可以提供动态渲染的页面。选择SSR或SSG取决于网站的具体需求,包括内容更新频率、用户个性化需求和预算等因素。

四、SEO优化:SSR与SSG在搜索引擎优化中的角色

搜索引擎优化(SEO)是网站开发中的一个重要方面,它影响着网站在搜索引擎结果页(SERP)上的排名。SSR和SSG都对SEO有积极影响,但它们的工作方式略有不同。

SSR (服务器端渲染)对SEO的影响

SSR通过在服务器上生成完整的HTML页面,确保了搜索引擎爬虫在抓取网站内容时能够看到完整的页面。这对于SEO非常有利,因为:

  • 完整的内容:爬虫可以立即看到完整的页面内容,包括由JavaScript动态生成的部分。

  • 快速的内容索引:由于内容已经在服务器上渲染,搜索引擎可以更快地索引网站。

  • 提升用户体验:快速的首屏加载时间可以减少跳出率,间接提升SEO排名。

SSG (静态站点生成)对SEO的影响

SSG生成的静态HTML页面同样对SEO友好,因为:

  • 即时可用的内容:静态页面上的内容在部署时就已经是最终形态,无需等待JavaScript执行。

  • 高效的页面加载:静态页面可以快速从CDN加载,提供更好的用户体验。

  • 减少服务器错误:静态页面减少了服务器运行时错误的可能性,这些错误可能会影响SEO。

最佳实践

无论选择SSR还是SSG,以下是一些SEO最佳实践:

  • 元标签和结构化数据:确保所有页面都有适当的</code>、<code><meta name="description"></code>标签以及结构化数据(如Schema.org),以便搜索引擎理解页面内容。</p> </li> <li> <p><strong>内容优先</strong>:在HTML中,内容应该位于前面,而不是被大量的JavaScript或样式代码所覆盖。</p> </li> <li> <p><strong>语义化的HTML标签</strong>:使用正确的HTML标签(如<code><header></code>、<code><footer></code>、<code><article></code>等)来帮助搜索引擎理解页面结构。</p> </li> <li> <p><strong>优化URL结构</strong>:使用清晰、描述性的URL,避免过长或含有大量参数的URL。</p> </li> <li> <p><strong>使用SSL</strong>:确保网站使用HTTPS,这是搜索引擎排名的一个因素。</p> </li> <li> <p><strong>移动友好</strong>:确保网站对移动设备友好,使用响应式设计,并通过Google的移动友好测试。</p> </li> <li> <p><strong>减少重定向</strong>:尽量减少页面重定向,因为它们可能会减慢页面加载速度并影响用户体验。</p> </li> <li> <p><strong>优化图片</strong>:确保所有图片都有<code>alt</code>属性,并对图片进行压缩以减少加载时间。</p> </li> <li> <p><strong>增强内链</strong>:在网站内部合理设置锚文本和链接,以帮助搜索引擎抓取更多页面。</p> </li> <li> <p><strong>监控和分析</strong>:使用工具如Google Search Console和Google Analytics来监控SEO表现,并根据数据进行优化。</p> </li> </ul> <p>通过遵循这些最佳实践,无论是使用SSR还是SSG,都可以提高网站的搜索引擎排名,吸引更多的访问者。</p> <p></p> <h2 id="%E4%BA%94%E3%80%81%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C(UX)%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E8%80%83%E9%87%8F"><strong>五、用户体验(UX):SSR与SSG的考量</strong></h2> <p>用户体验(UX)是指用户在使用产品或服务时的感受和体验。在Web开发中,SSR和SSG对用户体验有着直接的影响,特别是在首屏加载时间和页面交互性方面。</p> <h3 id="%E9%A6%96%E5%B1%8F%E5%8A%A0%E8%BD%BD%E6%97%B6%E9%97%B4">首屏加载时间</h3> <p><strong>SSR (服务器端渲染)</strong>:</p> <ul> <li> <p>SSR可以提供更快的首屏加载时间,因为服务器发送的HTML页面已经包含了渲染好的内容,用户无需等待JavaScript下载和执行即可看到页面。</p> </li> <li> <p>对于需要频繁更新内容的动态网站,SSR可能会导致服务器响应时间增加,特别是在高流量情况下。</p> </li> </ul> <p><strong>SSG (静态站点生成)</strong>:</p> <ul> <li> <p>SSG通常提供最快的首屏加载时间,因为静态文件可以被缓存并通过CDN快速提供,无需服务器端的任何计算。</p> </li> <li> <p>静态页面一旦生成,对于所有用户来说,加载时间是一致的,这提供了稳定的用户体验。</p> </li> </ul> <h3 id="%E4%BA%A4%E4%BA%92%E6%80%A7">交互性</h3> <p><strong>SSR</strong>:</p> <ul> <li> <p>虽然SSR提供了快速的首屏内容,但页面的完全交互性需要等待JavaScript下载、解析和执行完成。</p> </li> <li> <p>如果JavaScript文件很大,或者客户端设备性能较差,这可能会导致用户在可视内容和可交互内容之间感受到延迟。</p> </li> </ul> <p><strong>SSG</strong>:</p> <ul> <li> <p>SSG生成的页面在加载时已经是完全交互的,因为所有的HTML、CSS和JavaScript都是预先加载的。</p> </li> <li> <p>对于包含大量客户端JavaScript逻辑的网站,SSG可能需要额外的客户端代码来处理页面交互,这可能会影响性能。</p> </li> </ul> <h3>案例说明</h3> <p>假设我们有一个电商平台,我们可以选择使用SSR或SSG来提供产品列表。</p> <p><strong>SSR案例</strong>:</p> <ul> <li> <p>我们使用Vue SSR框架(如Nuxt.js)来构建电商平台。</p> </li> <li> <p>当用户访问产品列表页面时,服务器实时渲染页面并提供给用户,用户可以快速看到首屏内容。</p> </li> <li> <p>但是,用户可能需要等待额外的JavaScript加载和执行,才能与页面上的元素(如添加到购物车按钮)进行交互。</p> </li> </ul> <p><strong>SSG案例</strong>:</p> <ul> <li> <p>我们使用Vue SSG工具(如Gridsome)来生成电商平台的静态页面。</p> </li> <li> <p>所有产品列表页面在构建时就已经生成好了,并被部署到CDN上。</p> </li> <li> <p>用户访问产品列表时,页面几乎立即加载,并且可以直接与页面进行交互,因为所有的资源都已经预加载。</p> </li> </ul> <p>在这个例子中,SSG提供了更快的首屏加载时间和即时的页面交互性。然而,如果产品信息需要频繁更新,或者需要根据用户行为动态展示内容,SSR可能是更好的选择,因为它可以提供实时渲染的页面。选择SSR或SSG取决于网站的具体需求,包括内容更新频率、用户交互复杂度和性能优化等因素。</p> <p></p> <h2 id="%E5%85%AD%E3%80%81%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5%EF%BC%9A%E5%9C%A8Vue%203%20SSR%E5%92%8CSSG%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8"><strong>六、缓存策略:在Vue 3 SSR和SSG中的应用</strong></h2> <p>缓存是提高网站性能和用户体验的关键技术。在SSR和SSG中,有效的缓存策略可以显著减少服务器负载,加快内容交付速度,并提高网站的整体性能。</p> <h3 id="SSR%E4%B8%AD%E7%9A%84%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5">SSR中的缓存策略</h3> <p>在服务器端渲染(SSR)中,页面是动态生成的,这意味着每次用户请求都需要服务器处理。为了提高性能,可以采用以下缓存策略:</p> <ol> <li> <p><strong>页面级缓存</strong>:对于不经常变化的页面或页面的特定部分,可以在服务器上实现页面级缓存。这样,服务器可以直接返回缓存的HTML,而不是每次都重新渲染。</p> </li> <li> <p><strong>服务端数据缓存</strong>:如果页面依赖于数据库或API的数据,可以在服务器上缓存这些数据。这样,数据检索操作可以从缓存中快速完成,减少数据库查询。</p> </li> <li> <p><strong>CDN缓存</strong>:即使是动态内容,也可以利用CDN的边缘缓存来存储页面的副本。通过设置合适的缓存头(如<code>Cache-Control</code>),可以控制内容在CDN上的缓存时间。</p> </li> <li> <p><strong>客户端缓存</strong>:通过设置HTTP缓存头,可以让浏览器缓存静态资源(如CSS和JavaScript文件),减少后续请求的加载时间。</p> </li> </ol> <h3 id="SSG%E4%B8%AD%E7%9A%84%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5">SSG中的缓存策略</h3> <p>在静态站点生成(SSG)中,所有页面在构建时就已经生成,因此缓存策略主要集中在如何高效分发和更新这些静态资源:</p> <ol> <li> <p><strong>CDN全站缓存</strong>:由于页面是静态的,可以将整个网站部署到CDN上,并充分利用CDN缓存来提供快速的全球内容交付。</p> </li> <li> <p><strong>增量构建</strong>:对于大型网站,不需要为每次更新重新生成整个站点。可以使用支持增量构建的SSG工具,只更新改变的部分。</p> </li> <li> <p><strong>浏览器缓存</strong>:为静态资源设置长期的缓存策略,直到资源内容实际发生变化。通常通过在文件名中包含内容哈希(如<code>bundle.abc123.js</code>)来实现。</p> </li> <li> <p><strong>服务工作线程(Service Workers)</strong>:可以使用Service Workers来缓存静态资源和API响应,甚至允许在离线时访问网站。</p> </li> </ol> <h3>案例说明</h3> <p>假设我们运营一个新闻网站,该网站的内容每天更新,但大部分页面结构保持不变。</p> <p><strong>SSR缓存案例</strong>:</p> <ul> <li> <p>我们使用Vue SSR框架(如Nuxt.js)来构建新闻网站。</p> </li> <li> <p>对于首页和文章列表,我们实现了页面级缓存,这些页面每小时更新一次。</p> </li> <li> <p>对于文章内容,我们使用服务端数据缓存来存储从API获取的文章数据,缓存时间设置为15分钟。</p> </li> <li> <p>我们还配置了CDN来缓存静态资源,并设置了合适的<code>Cache-Control</code>头来优化客户端缓存。</p> </li> </ul> <p><strong>SSG缓存案例</strong>:</p> <ul> <li> <p>我们使用Vue SSG工具(如Gridsome)来生成新闻网站的静态页面。</p> </li> <li> <p>整个网站部署在CDN上,所有页面和资源都被缓存,提供快速的内容交付。</p> </li> <li> <p>当新闻更新时,我们只重新生成和部署改变的页面(增量构建)。</p> </li> <li> <p>我们使用Service Workers来缓存静态资源,以便即使在离线时也能访问网站。</p> </li> </ul> <p>在这两个案例中,通过合理的缓存策略,我们能够提供快速的内容加载,同时减少服务器的负载。正确的缓存策略取决于内容的更新频率、用户访问模式和技术栈。</p> <h2></h2> <h2 id="%E4%B8%83%E3%80%81%E6%9E%84%E5%BB%BA%E4%B8%8E%E9%83%A8%E7%BD%B2%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E6%B5%81%E7%A8%8B%E5%B7%AE%E5%BC%82"><strong>七、构建与部署:SSR与SSG的流程差异</strong></h2> <h3 id="SSR%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%84%E5%BB%BA%E5%92%8C%E9%83%A8%E7%BD%B2">SSR项目的构建和部署</h3> <p><strong>构建过程</strong>:</p> <ol> <li> <p><strong>开发环境设置</strong>:配置Node.js环境,安装依赖,编写服务端渲染逻辑。</p> </li> <li> <p><strong>应用构建</strong>:使用构建工具(如Webpack)打包客户端和服务端资源。</p> </li> <li> <p><strong>服务端渲染</strong>:在服务器上运行Node.js应用,实时渲染页面响应用户请求。</p> </li> </ol> <p><strong>部署过程</strong>:</p> <ol> <li> <p><strong>服务器准备</strong>:设置服务器环境,如安装Node.js和配置反向代理(如Nginx)。</p> </li> <li> <p><strong>持续集成/持续部署(CI/CD)</strong>:配置CI/CD流程自动化测试和部署。</p> </li> <li> <p><strong>应用部署</strong>:将构建好的应用上传到服务器并启动服务。</p> </li> <li> <p><strong>监控和维护</strong>:监控应用性能,确保稳定运行,及时更新和修复问题。</p> </li> </ol> <p><strong>挑战</strong>:</p> <ul> <li> <p><strong>服务器资源管理</strong>:SSR应用可能需要更多的服务器资源,特别是在高流量情况下。</p> </li> <li> <p><strong>复杂的配置</strong>:需要配置服务器环境,管理Node.js进程,处理服务端和客户端的交互。</p> </li> <li> <p><strong>部署复杂性</strong>:实时渲染应用的部署流程可能比静态站点复杂,需要考虑负载均衡、缓存策略等。</p> </li> </ul> <h3 id="SSG%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%84%E5%BB%BA%E5%92%8C%E9%83%A8%E7%BD%B2">SSG项目的构建和部署</h3> <p><strong>构建过程</strong>:</p> <ol> <li> <p><strong>开发环境设置</strong>:配置静态站点生成器(如VuePress或Gridsome),编写Markdown或Vue文件。</p> </li> <li> <p><strong>站点生成</strong>:运行构建命令,生成静态HTML、CSS和JavaScript文件。</p> </li> <li> <p><strong>预览和测试</strong>:在本地或临时服务器上预览生成的站点,进行测试。</p> </li> </ol> <p><strong>部署过程</strong>:</p> <ol> <li> <p><strong>静态资源托管</strong>:选择静态资源托管服务(如Netlify、Vercel或GitHub Pages)。</p> </li> <li> <p><strong>CI/CD配置</strong>:设置自动化构建和部署流程,通常与Git仓库集成。</p> </li> <li> <p><strong>内容部署</strong>:将生成的静态文件上传到托管服务,通常通过CI/CD自动完成。</p> </li> <li> <p><strong>CDN配置</strong>:配置CDN以优化全球内容交付和缓存策略。</p> </li> </ol> <p><strong>挑战</strong>:</p> <ul> <li> <p><strong>内容更新</strong>:对于需要频繁更新的内容,SSG可能需要重新构建和部署整个站点。</p> </li> <li> <p><strong>大型站点构建时间</strong>:大型静态站点的构建时间可能很长,需要优化构建过程。</p> </li> <li> <p><strong>动态功能集成</strong>:静态站点可能需要集成第三方服务或客户端JavaScript来添加动态功能。</p> </li> </ul> <h3>案例说明</h3> <p>假设我们有一个博客网站,我们可以选择使用SSR或SSG来构建和部署。</p> <p><strong>SSR案例</strong>:</p> <ul> <li> <p>我们使用Nuxt.js来构建博客网站,它支持SSR。</p> </li> <li> <p>在本地开发环境中编写应用代码,然后使用Webpack打包资源。</p> </li> <li> <p>配置CI/CD流程,在代码推送到Git仓库时自动运行测试和部署。</p> </li> <li> <p>部署应用到云服务器(如AWS EC2),配置Nginx作为反向代理。</p> </li> <li> <p>面临的挑战包括确保服务器性能以应对可能的流量高峰,以及维护和更新服务器环境。</p> </li> </ul> <p><strong>SSG案例</strong>:</p> <ul> <li> <p>我们选择VuePress作为SSG工具来生成博客的静态页面。</p> </li> <li> <p>在本地环境中编写Markdown内容,运行VuePress构建命令生成静态文件。</p> </li> <li> <p>通过GitHub Actions配置CI/CD,当推送到GitHub仓库时自动构建和部署到GitHub Pages。</p> </li> <li> <p>使用CDN(如Cloudflare)来优化内容交付速度和缓存静态资源。</p> </li> <li> <p>面临的挑战包括管理内容更新导致的频繁构建和优化大型站点的构建时间。</p> </li> </ul> <p>在这两个案例中,SSR提供了更灵活的实时内容更新能力,但需要更多的服务器管理和资源。而SSG提供了更简单的部署流程和更快的加载速度,但对于频繁更新的内容管理可能更具挑战性。</p> <p></p> <h2 id="%E5%85%AB%E3%80%81%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9%E5%A4%84%E7%90%86%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"><strong>八、动态内容处理:SSR与SSG的解决方案</strong></h2> <p>在SSR(服务器端渲染)和SSG(静态站点生成)的上下文中,处理动态内容通常需要一些策略来确保用户体验的流畅性和内容的实时性。以下是一些处理动态内容的方法:</p> <h3 id="SSR%E4%B8%AD%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9">SSR中处理动态内容</h3> <p>在SSR中,服务器在每次请求时动态生成页面,这使得它天然适合处理动态内容。但是,为了提高性能和减少服务器负载,可以采用以下策略:</p> <p><strong>客户端渲染(Hydration)</strong>:</p> <p>在服务器生成的静态标记上,客户端JavaScript接管以添加交互性。</p> <p>动态内容(如用户评论或实时股票价格)可以在客户端通过Ajax请求获取,并在页面上实时更新。</p> <p><strong>缓存策略</strong>:</p> <p>对于不经常变化的内容,可以使用服务器缓存来减少渲染次数。</p> <p>对于经常变化的部分,可以通过设置较短的缓存时间或使用无缓存策略来确保内容的实时性。</p> <h3 id="SSG%E4%B8%AD%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9">SSG中处理动态内容</h3> <p>SSG生成的是静态页面,因此处理动态内容通常需要客户端JavaScript或外部服务的帮助:</p> <p><strong>客户端JavaScript</strong>:</p> <p>静态页面加载后,客户端JavaScript可以请求动态内容,并更新DOM。</p> <p>这种方法适用于评论系统、用户个人信息、购物车等需要实时更新的场景。</p> <p><strong>预渲染</strong></p> <p>对于已知会变化但更新频率不高的内容,可以在构建时预渲染。</p> <p>例如,可以在每天的特定时间运行构建过程,以更新新闻文章或博客帖子。</p> <p><strong>第三方服务</strong>:</p> <p>可以集成第三方服务(如Disqus评论系统或Firebase实时数据库)来处理动态内容。</p> <p>这些服务通常提供API和客户端库,可以轻松集成到静态页面中。</p> <h3>案例说明</h3> <p><strong>SSR案例</strong>: 假设我们有一个电商网站,需要显示最新的产品信息和价格。</p> <ul> <li> <p>使用Nuxt.js进行SSR,服务器为每个产品页面提供最新的信息。</p> </li> <li> <p>对于产品价格,由于它可能会频繁变动,我们在客户端使用JavaScript请求最新价格,并在页面上动态更新。</p> </li> <li> <p>对于产品描述等相对静态的内容,我们可以在服务器端渲染并缓存以提高性能。</p> </li> </ul> <p><strong>SSG案例</strong>: 假设我们有一个新闻网站,新闻文章每天更新,但评论部分是实时的。</p> <ul> <li> <p>使用VuePress生成静态新闻文章页面。</p> </li> <li> <p>对于评论部分,我们在客户端使用JavaScript集成第三方评论服务(如Disqus),允许用户实时发布和查看评论。</p> </li> <li> <p>我们可以设置一个定时任务(如GitHub Actions workflow),每天自动运行构建过程以更新新闻内容。</p> </li> </ul> <p>在这两个案例中,SSR和SSG都能够有效地处理动态内容。SSR通过服务器端的实时渲染提供最新内容,而SSG则依赖客户端JavaScript和第三方服务来添加动态功能。选择哪种方法取决于项目的需求、内容更新频率以及对实时性的要求。</p> <p></p> <h2 id="%E4%B9%9D%E3%80%81%E5%AE%89%E5%85%A8%E6%80%A7%E8%80%83%E8%99%91%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E5%AE%89%E5%85%A8%E9%9A%90%E6%82%A3%E5%8F%8A%E9%98%B2%E6%8A%A4"><strong>九、安全性考虑:SSR与SSG的安全隐患及防护</strong></h2> <p>在Web开发中,无论是服务器端渲染(SSR)还是静态站点生成(SSG),都需要考虑潜在的安全问题。以下是一些常见的安全问题及其防护措施:</p> <h3 id="SSR%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">SSR的安全问题</h3> <ol> <li> <p><strong>跨站脚本攻击(XSS)</strong>:</p> <ul> <li> <p>由于SSR涉及动态生成HTML内容,如果不正确地处理用户输入,攻击者可能注入恶意脚本。</p> </li> <li> <p><strong>防护措施</strong>:对所有用户输入进行适当的转义和清理,使用模板引擎自带的XSS防护功能。</p> </li> </ul></li> <li> <p><strong>代码注入</strong>:</p> <ul> <li> <p>如果服务器端脚本不安全,攻击者可能通过注入恶意代码来执行未授权的操作。</p> </li> <li> <p><strong>防护措施</strong>:使用安全的编码实践,避免执行用户提供的代码片段,使用参数化查询防止SQL注入。</p> </li> </ul></li> <li> <p><strong>服务器配置错误</strong>:</p> <ul> <li> <p>不当的服务器配置可能导致敏感信息泄露或未授权访问。</p> </li> <li> <p><strong>防护措施</strong>:确保服务器和应用程序的配置是安全的,定期进行安全审计。</p> </li> </ul></li> </ol> <h3 id="SSG%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">SSG的安全问题</h3> <ol> <li> <p><strong>第三方依赖漏洞</strong>:</p> <ul> <li> <p>SSG通常依赖于大量的第三方库和插件,这些可能包含安全漏洞。</p> </li> <li> <p><strong>防护措施</strong>:定期更新依赖库,使用安全扫描工具检测已知漏洞。</p> </li> </ul></li> <li> <p><strong>内容劫持</strong>:</p> <ul> <li> <p>静态文件如果在传输过程中被劫持,可能会被篡改或用于恶意目的。</p> </li> <li> <p><strong>防护措施</strong>:使用HTTPS加密所有传输,确保内容的完整性。</p> </li> </ul></li> <li> <p><strong>第三方服务安全</strong>:</p> <ul> <li> <p>集成的第三方服务(如评论系统)可能成为攻击的途径。</p> </li> <li> <p><strong>防护措施</strong>:选择信誉良好的第三方服务提供商,定期审查集成代码。</p> </li> </ul></li> </ol> <h3 id="%E9%98%B2%E6%8A%A4%E6%8E%AA%E6%96%BD%E7%9A%84%E6%A1%88%E4%BE%8B%E8%AF%B4%E6%98%8E">防护措施的案例说明</h3> <p><strong>SSR案例</strong>: 假设我们运营一个论坛网站,用户可以发布和评论帖子。</p> <ul> <li> <p><strong>XSS防护</strong>:使用Vue.js或React等现代前端框架,它们默认对数据绑定进行转义,减少XSS风险。</p> </li> <li> <p><strong>代码注入防护</strong>:使用ORM库(如Sequelize或TypeORM)来处理数据库操作,避免直接拼接SQL语句,防止SQL注入攻击。</p> </li> <li> <p><strong>服务器配置</strong>:配置安全的HTTP头部(如Content Security Policy),限制资源加载来源,使用Nginx或Apache的安全配置模板。</p> </li> </ul> <p><strong>SSG案例</strong>: 假设我们有一个公司介绍网站,主要提供公司信息和联系方式。</p> <ul> <li> <p><strong>依赖漏洞防护</strong>:定期运行<code>npm audit</code>或<code>yarn audit</code>来检查项目依赖的安全性,并及时应用更新。</p> </li> <li> <p><strong>内容劫持防护</strong>:使用Let’s Encrypt提供的免费SSL证书启用HTTPS,确保所有内容通过加密通道传输。</p> </li> <li> <p><strong>第三方服务安全</strong>:如果网站包含联系表单,使用可靠的表单处理服务(如Formspree或Netlify Forms),并启用验证码防止自动化垃圾邮件。</p> </li> </ul> <p>在这两个案例中,通过采取适当的安全措施,可以显著降低安全风险。SSR和SSG都需要持续的安全意识和定期的安全维护来保护网站免受攻击。</p> <h2 id="%E5%8D%81%E3%80%81%E6%80%BB%E7%BB%93">十、总结</h2> <p>在本次讨论中,我们探讨了服务器端渲染(SSR)和静态站点生成(SSG)在用户体验、缓存策略、构建与部署、处理动态内容以及安全问题方面的影响和方法。</p> <h3 id="%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C">用户体验</h3> <ol> <li>SSR可以提供更快的首屏加载时间,但可能需要等待JavaScript加载完成后才能进行完全交互。</li> <li>SSG提供最快的首屏加载时间和即时交互性,因为静态资源可以通过CDN快速提供。</li> </ol> <h3 id="%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5">缓存策略</h3> <ol> <li> <p>SSR中的缓存策略包括页面级缓存、服务端数据缓存、CDN缓存和客户端缓存。</p> </li> <li> <p>SSG中的缓存策略主要依赖于CDN全站缓存、增量构建、浏览器缓存和Service Workers。</p> </li> </ol> <h3 id="%E6%9E%84%E5%BB%BA%E4%B8%8E%E9%83%A8%E7%BD%B2">构建与部署</h3> <ol> <li> <p>SSR的构建和部署涉及服务器资源管理、复杂的配置和部署流程。</p> </li> <li> <p>SSG的构建和部署通常更简单,但需要管理内容更新和优化大型站点的构建时间。</p> </li> </ol> <h3 id="%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9">处理动态内容</h3> <ol> <li> <p>SR天然适合处理动态内容,可以通过客户端渲染和缓存策略来优化性能。</p> </li> <li> <p>SSG处理动态内容通常依赖于客户端JavaScript、预渲染和第三方服务。</p> </li> </ol> <h3 id="%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">安全问题</h3> <ol> <li> <p>面临的安全问题包括XSS、代码注入和服务器配置错误,需要采取相应的防护措施。</p> </li> <li> <p>SSG的安全问题涉及第三方依赖漏洞、内容劫持和第三方服务安全,也需要适当的安全措施。</p> </li> </ol> <p><strong>总的来说,SSR和SSG各有优势和挑战。选择哪一种技术取决于项目的具体需求,如内容更新频率、用户交互复杂度、性能优化需求和安全考虑。通过合理的缓存策略、构建和部署流程、动态内容处理方法以及安全措施,可以最大化地提升用户体验和网站性能。</strong></p> <p></p> <blockquote> <p>若阁下觉此文有益,恳请施以<span style="color:#fe2c24;">-<strong>点赞</strong> ⭐ - <strong>收藏</strong>  - <strong>关注</strong></span>之礼,以资鼓励。倘若有疑问或建言,亦请在评论区<span style="color:#fe2c24;"><strong>评论</strong></span> 赐教,吾将感激不尽。</p> </blockquote> </div> </div>�������������������������������������������� </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1738935086948081664"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(vue.js,前端,javascript,经验分享,typescript,vue,vue进阶)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1899379260221616128.htm" title="DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之功能优化,添加列宽调整功能Table12" target="_blank">DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之功能优化,添加列宽调整功能Table12</a> <span class="text-muted">宝码香车</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a><a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a> <div>前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦目录DeepSeek助力Vue3开发:打造丝滑的表格(Table)之功能优化,添加列宽调整功能Table12页面效果指令输入think组件代码功能增强说明:注意事项:代码测试测试代码正常跑通,附其他基本代码编写路由src\router\index</div> </li> <li><a href="/article/1899375098146648064.htm" title="Zookeeper【概念(集中式到分布式、什么是分布式 、CAP定理 、什么是Zookeeper、应用场景、为什么选择Zookeeper 、基本概念) 】(一)-全面详解(学习总结---从入门到深化)" target="_blank">Zookeeper【概念(集中式到分布式、什么是分布式 、CAP定理 、什么是Zookeeper、应用场景、为什么选择Zookeeper 、基本概念) 】(一)-全面详解(学习总结---从入门到深化)</a> <span class="text-muted">童小纯</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6%E5%A4%A7%E5%85%A8---%E5%85%A8%E9%9D%A2%E8%AF%A6%E8%A7%A3/1.htm">中间件大全---全面详解</a><a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步如果感觉博主的文章还不错的话,请三连支持一下博主哦博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人目录Zookeeper概念_集中式到分布</div> </li> <li><a href="/article/1899375098620604416.htm" title="从零手撕 LLaMa3 项目爆火(图解+代码)" target="_blank">从零手撕 LLaMa3 项目爆火(图解+代码)</a> <span class="text-muted">机器学习社区</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/RAG/1.htm">RAG</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E6%A8%A1%E6%80%81%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">多模态大模型</a><a class="tag" taget="_blank" href="/search/Llama/1.htm">Llama</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</a> <div>节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。汇总合集《大模型面试宝典》(2024版)发布!一个月前,Meta发布了开源大模型llama3系列,在多个关键基准测试中优于业界SOTA模型,并在代码生成任务上全面领先。此后,开发</div> </li> <li><a href="/article/1899366676525281280.htm" title="Yarn:包管理优化与工作空间的最佳实践" target="_blank">Yarn:包管理优化与工作空间的最佳实践</a> <span class="text-muted"></span> <div>在现代前端开发中,包管理工具是不可或缺的工具之一。Yarn作为一个快速、可靠且安全的包管理工具,相对于npm,提供了一些独特的功能和优化,尤其是在工作空间管理和性能优化方面尤为突出。本文将深入探讨Yarn的专业使用,包括其工作空间的强大功能、性能优化技术以及在大型项目中的最佳实践。Yarn简介Yarn是由Facebook开发的一个JavaScript包管理工具,它旨在解决npm的一些关键问题,如安</div> </li> <li><a href="/article/1899361476049694720.htm" title="数字IC前端设计究竟怎样?薪资前景如何?" target="_blank">数字IC前端设计究竟怎样?薪资前景如何?</a> <span class="text-muted">IC观察者</span> <a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E6%88%90%E7%94%B5%E8%B7%AF/1.htm">集成电路</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9FIC/1.htm">模拟IC</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F%E7%89%88%E5%9B%BE/1.htm">模拟版图</a><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E6%8B%9F%E7%89%88%E5%9B%BE%E5%85%A5%E9%97%A8/1.htm">模拟版图入门</a> <div>数字ic前端岗位介绍:数字ic前端设计处于数字IC设计流程的前端,属于数字IC设计类岗位的一种。数字ic前端设计主要分成几种层次的设计:IPlevel,unitlevel,fullchip/SoClevel,gatelevel等。作为数字IC前端工程师,为了让写的RTL代码没有bug,会经常与验证工程师要求debugcase;为了了解芯片整体架构和功能属性,还要与架构工程师打交道;还要与后端工程师</div> </li> <li><a href="/article/1899360845343813632.htm" title="ES6 解构赋值详解" target="_blank">ES6 解构赋值详解</a> <span class="text-muted">修己xj</span> <a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a> <div>ES6是JavaScript语言的一次重大更新,引入了许多新特性和语法改进,其中解构赋值是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值,并赋给对应的变量,让代码变得更加简洁和易读。本文将深入探讨ES6解构赋值的语法、用法及其在实际开发中的应用。数组解构赋值数组解构赋值允许我们通过类似模式匹配的方式,从数组中提取值并赋给变量,即只要等会两边的变量模式相同,左边的变量就会被赋予对应的</div> </li> <li><a href="/article/1899360717161689088.htm" title="tauri + vue3 如何实现在一个页面上局部加载外部网页?" target="_blank">tauri + vue3 如何实现在一个页面上局部加载外部网页?</a> <span class="text-muted">bug菌¹</span> <a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88Bug%E8%B0%83%E4%BC%98%28%E5%AE%9E%E6%88%98%E7%89%88%29/1.htm">全栈Bug调优(实战版)</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/CSDN%E9%97%AE%E7%AD%94%E8%A7%A3%E6%83%91%28%E5%85%A8%E6%A0%88%E7%89%88%29/1.htm">CSDN问答解惑(全栈版)</a><a class="tag" taget="_blank" href="/search/tauri/1.htm">tauri</a><a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a> <div>本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!问题描述  tauriv1(1.6左右)+vue3我想在vue3前端页面上在一个页面而不是window.open打开一个新的窗口去加载外部网页我想在一个页面中局部中间加载一个外部网页(试过</div> </li> <li><a href="/article/1899356684506165248.htm" title="ES6之解构" target="_blank">ES6之解构</a> <span class="text-muted">Hopebearer_</span> <a class="tag" taget="_blank" href="/search/ES6/1.htm">ES6</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>文章目录ES6之解构一、数组解构1.基本解构2.部分解构3.默认值4.剩余参数5.嵌套解构6.交换变量二、对象解构1.基本解构2.重命名3.默认值4.剩余参数三、函数参数结构1.数组参数解构2.对象参数解构3.默认值四、注意事项1.解构顺序2.undefined情况3.剩余元素4.对象的方法解构ES6之解构解构是JavaScript(ES6及以后版本)中一种非常强大的语法特性,它允许我们按照一定模</div> </li> <li><a href="/article/1899355927904055296.htm" title="vue + antd使用a-select的placeholder默认显示不生效" target="_blank">vue + antd使用a-select的placeholder默认显示不生效</a> <span class="text-muted">ai~yun</span> <a class="tag" taget="_blank" href="/search/antd/1.htm">antd</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>代码:<<</div> </li> <li><a href="/article/1899354667431817216.htm" title="Ant design vue中的a-select在动态给option赋值之后,placeholder失效" target="_blank">Ant design vue中的a-select在动态给option赋值之后,placeholder失效</a> <span class="text-muted">丑小鸭变黑天鹅</span> <a class="tag" taget="_blank" href="/search/Vue%E6%97%A5%E5%B8%B8%E6%80%BB%E7%BB%93/1.htm">Vue日常总结</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>Antdesignvue中的a-select在动态给option赋值之后,placeholder失效一、问题描述二、解决办法1、方法一(不推荐)2、方法二一、问题描述最近做一个项目,用到了a-select,placeholder出现了问题先看一下不起作用的代码<a-select-optionv-for="iteminallCollege":key</div> </li> <li><a href="/article/1899350382295969792.htm" title="Monorepo与pnpm:前端项目管理的完美搭档" target="_blank">Monorepo与pnpm:前端项目管理的完美搭档</a> <span class="text-muted">秋の本名</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/pnpm/1.htm">pnpm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/mojo/1.htm">mojo</a> <div>一、什么是pnpmpnpm又称performantnpm,翻译过来就是高性能的npm。1.节省磁盘空间提高安装效率pnpm通过使用硬链接和符号链接(又称软链接)的方式来避免重复安装以及提高安装效率。硬链接:和原文件共用一个磁盘地址,相当于别名的作用,如果更改其中一个内容,另一个也会跟着改变符号链接(软链接):是一个新的文件,指向原文件路径地址,类似于快捷方式官网原话:当使用npm时,如果你有100</div> </li> <li><a href="/article/1899346470969077760.htm" title="ES6解构赋值详解" target="_blank">ES6解构赋值详解</a> <span class="text-muted">漫天转悠</span> <a class="tag" taget="_blank" href="/search/ES6/1.htm">ES6</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>ES6解构赋值详解ES6解构赋值是JavaScript语言的一项强大特性,它允许从数组或对象中提取数据,并将其赋值给变量。这一特性不仅简化了代码,提高了可读性,还增强了代码的灵活性。本文将详细介绍ES6解构赋值的基本概念、语法、应用场景以及一些高级用法。1.基本概念解构赋值是对赋值运算符的扩展。它允许按照一定的模式,从数组或对象中提取值,并赋值给变量。这种语法使得从复杂数据结构中提取数据变得更加简</div> </li> <li><a href="/article/1899343573246078976.htm" title="web前端期末大作业:婚纱网页主题网站设计——唯一旅拍婚纱公司网站HTML+CSS+JavaScript" target="_blank">web前端期末大作业:婚纱网页主题网站设计——唯一旅拍婚纱公司网站HTML+CSS+JavaScript</a> <span class="text-muted">IT-司马青衫</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>‍静态网站的编写主要是用HTMLDⅣV+CSSJS等来完成页面的排版设计‍,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉导航栏、鼠标划过效果等知识点,学生网页作业源码,制作水平和原创度都适合学习或交作业用,记得点赞。精彩专栏推荐【作者主页——获取更多优质源码】【web前端期末大作业——毕设项目精品实战案例(1</div> </li> <li><a href="/article/1899339285023223808.htm" title="Webpack打包构建流程" target="_blank">Webpack打包构建流程</a> <span class="text-muted">码上跑步</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>webpack的打包构建流程为什么需要打包?在前端有非常多的资源,如css、js、vue、vue、图片、字体等。有些资源需要加工处理1.ts->jsts-loader2.css->css-loader+style-loader3.图片->file-loader+url-loader4.html->html-webpack-plugin需要对产物进行优化optimization(webpack优化配</div> </li> <li><a href="/article/1899338906130771968.htm" title="webpack" target="_blank">webpack</a> <span class="text-muted">码上跑步</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>webpack介绍webpack是一个构建工具,实现了模块化管理项目.他的工作方式是用各种loader将各种资源转化为js文件或者对js文件进行压缩编译亦或对静态资源进行处理.官网:webpack由来模块化存在一些问题1.ESM的兼容性问题2.模块文件过多,网络请求频繁3.前端的所有资源包括html和css都需要模块化构建工具应运而生,需要一个集编译,模块打包,支持不同的资源的模块打包工具.Web</div> </li> <li><a href="/article/1899338906554396672.htm" title="Vue初体验" target="_blank">Vue初体验</a> <span class="text-muted">码上跑步</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Vue基础Vue是什么?Vue是javascript的渐进式框架。Vue初识Vue工作时必须要创建一个Vue的实例,并且传入一个配置对象。root容器里的代码是符合html的语法但是新添加了一些Vue语法,在这些地方Vue会自动进行解析。root容器里的代码称为Vue模版。Vue实例和容器是一一对应的。在实际开发中只有一个Vue,配合组件使用。在vue里的插值{{}}内部只要写js表达式就能正常解</div> </li> <li><a href="/article/1899338906982215680.htm" title="vue脚手架" target="_blank">vue脚手架</a> <span class="text-muted">码上跑步</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>Vue脚手架脚手架是官方提供的标准化开发工具。下载配置//全局安装vue的脚手架npminstall@vue/cli-g//在项目目录下开启一个脚手架vuecreate‘项目名’//进入项目目录,直接运行npmrunserve1.vue.js与vue.runtime.xxx.js的区别:(1).vue.js是完整版的Vue,包含:核心功能+模板解析器。(2).vue.runtime.xxx.js是</div> </li> <li><a href="/article/1899334748313022464.htm" title="vue打包编译【自动删除node_modules下的.cache缓存文件夹】" target="_blank">vue打包编译【自动删除node_modules下的.cache缓存文件夹】</a> <span class="text-muted">Eternitysy</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>vue项目不断打包编译后,在node_modules目录下的.cache文件夹里的文件就越来越多,手动删除数量巨大,时间太长,下面是自动删除.cache这个文件夹的方法1.先安装依赖包rimraf:npminstallrimraf-g--save-dev2.在package.json文件的scripts部分添加一个脚本命令:"scripts":{"clean":"rimrafnode_module</div> </li> <li><a href="/article/1899333108369518592.htm" title="前端实现版本更新自动检测✅" target="_blank">前端实现版本更新自动检测✅</a> <span class="text-muted">水煮白菜王</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>作者简介:水煮白菜王,一位资深前端劝退师文章专栏:前端专栏,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。感谢支持目录一、背景二、实现原理2.1逻辑2.2一些好处三、具体实现3.1工程化封装3.2关键方法解析脚本哈希获取:对比逻辑:四、全部代码4.1vue34.2vue2五、注意事项与常见问题5.1可能出现的问题5.2浏览器兼容方案一、背景在现代Web应用中,部署前端版本更新后及</div> </li> <li><a href="/article/1899333110311481344.htm" title="什么是XSS" target="_blank">什么是XSS</a> <span class="text-muted">藤原千花的败北</span> <a class="tag" taget="_blank" href="/search/web%E6%BC%8F%E6%B4%9E/1.htm">web漏洞</a><a class="tag" taget="_blank" href="/search/xss/1.htm">xss</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a> <div>文章目录前言1.前端知识2.什么是XSS3.漏洞挖掘4.参考前言之前对XSS的理解就是停留在弹窗,认为XSS这种漏洞真的是漏洞吗?安全学习了蛮久了,也应该对XSS有更进一步的认识了。1.前端知识现代浏览器是一个高度复杂的软件系统,由多个核心组件协同工作,旨在高效、安全地呈现网页内容并执行交互逻辑。对一般用户来讲,其主要功能就是向服务器发出请求,在窗口中展示用户所选择的网络资源。这里所说的资源一般是</div> </li> <li><a href="/article/1899331974225522688.htm" title="【推荐项目】044-中医门诊管理系统" target="_blank">【推荐项目】044-中医门诊管理系统</a> <span class="text-muted">蜗牛 | ICU</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/1.htm">推荐项目</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E8%AE%BE/1.htm">毕设</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>044-中医门诊管理系统介绍javaspringbootvuejs中医门诊管理系统为了帮助您更清晰地整理中医门诊管理系统的功能,我将按照您提供的角色和功能进行归类和整理。以下是整理后的功能列表:角色划分核心管理员医生药师用户(普通患者)管理端功能(核心管理员)统计用户统计(按注册时间、活跃度等)药物销售统计处方统计咨询统计用户管理用户列表(查看、编辑、删除)用户角色分配用户权限管理医生管理医生列表</div> </li> <li><a href="/article/1899329200700059648.htm" title="springMVC RestFul接口设计模式详解,包括前后端设计详解。@GetMapping、@PostMapping、@PutMapping@DeleteMapping@PathVariable" target="_blank">springMVC RestFul接口设计模式详解,包括前后端设计详解。@GetMapping、@PostMapping、@PutMapping@DeleteMapping@PathVariable</a> <span class="text-muted">漫慢丶</span> <a class="tag" taget="_blank" href="/search/springmvc/1.htm">springmvc</a><a class="tag" taget="_blank" href="/search/restful/1.htm">restful</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>目录1、什么是RestFul接口设计模式2、使用该接口设计模式后端还需要配置什么3、使用该接口设计模式前端需要注意什么4、Controller具体实现方式1、什么是RestFul接口设计模式RestFul这是一种springmvc接口的设计模式,用来区别不同类型的请求,来匹配控制器处理映射。例如请求URL为/test/那么中根据Get、put、post等请求方式,就可以具体映射到对应的控制器方法。</div> </li> <li><a href="/article/1899317091039768576.htm" title="【推荐项目】 043-停车管理系统" target="_blank">【推荐项目】 043-停车管理系统</a> <span class="text-muted">蜗牛 | ICU</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/1.htm">推荐项目</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>043-停车管理系统介绍使用springbootvuejsmysql技术搭建框架。智能停车管理系统描述后端框架:采用SpringBoot与MySQL的强强联合,为系统提供稳健、高效的服务支撑。前端框架:前端选用Vue.js,打造流畅、美观的用户交互界面。管理员功能:用户信息管理:轻松管理用户信息,包括新增、编辑、删除及查询用户。界面清晰,操作便捷,确保用户数据的安全与准确。车位信息管理:实时查看车</div> </li> <li><a href="/article/1899313310344474624.htm" title="JavaScript -闭包" target="_blank">JavaScript -闭包</a> <span class="text-muted">嗷呜~嗷呜~呜呜~</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>闭包定义:函数声明时会保存其所在的作用域(词法环境),必然有一个全局作用域,除了全局作用域剩余的对于当前函数来说叫--闭包闭包特征:函数在声明时会保存其所在的所有作用域(词法环境)闭包本质:作用域中所使用到的值组成的对象闭包的作用:把使用到的来自于其他作用域的值保存起来,保障函数在执行时能顺利运行window里面的ashow对象拥有一个scopes属性,其中存放了函数使用到的其他作用域中的值:这些</div> </li> <li><a href="/article/1899307504123310080.htm" title="Vue数据响应式原理" target="_blank">Vue数据响应式原理</a> <span class="text-muted">tuoluoo</span> <a class="tag" taget="_blank" href="/search/vue%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">vue学习笔记</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>前言Vue是一个结构的框架,也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新响应式实现基于发布订阅模式和数据劫持实现1.发布订阅模式:vue使用发布订阅模式来实现数据变动的通知和更新2.数据劫持:vue通过object.defineProperty对数据进行劫持Vue2响应式原理基于js的object.defineProperty()方法,该方法可将传入的</div> </li> <li><a href="/article/1899304856045285376.htm" title="vue3新增修改页面,字段来源于其他表" target="_blank">vue3新增修改页面,字段来源于其他表</a> <span class="text-muted">大波V5</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>确定取消constunitOptions=ref([]);constlistAdspunitAllLocal=async()=>{if(!unitOptions.value.length){constresUnit=awaitlistAdspunitAll();unitOptions.value=resUnit.data;}}//单位生成ID-Name映射字典constidToNameUnitMa</div> </li> <li><a href="/article/1899301970192166912.htm" title="基于HarmonyNext的ArkTS高级实战:构建高性能跨平台应用" target="_blank">基于HarmonyNext的ArkTS高级实战:构建高性能跨平台应用</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/harmonyos-next/1.htm">harmonyos-next</a> <div>基于HarmonyNext的ArkTS高级实战:构建高性能跨平台应用引言随着HarmonyOSNext的发布,ArkTS作为其核心开发语言,为开发者提供了更强大的工具和更高效的开发体验。ArkTS基于TypeScript,结合了HarmonyOS的分布式能力,使得开发者能够轻松构建高性能、跨平台的应用。本文将深入探讨如何使用ArkTS在HarmonyNext平台上进行高级开发,通过实战案例讲解如何</div> </li> <li><a href="/article/1899301955566628864.htm" title="Garfish 源码解析 —— 一个微应用是如何被挂载的" target="_blank">Garfish 源码解析 —— 一个微应用是如何被挂载的</a> <span class="text-muted">moonrailgun</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E7%A8%8B%E5%8C%96/1.htm">工程化</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>背景Garfish是字节跳动webinfra团队推出的一款微前端框架包含构建微前端系统时所需要的基本能力,任意前端框架均可使用。接入简单,可轻松将多个前端应用组合成内聚的单个产品因为当前对Garfish的解读极少,而微前端又是现代前端领域相当重要的一环,因此写下本文,同时也是对学习源码的一个总结本文基于garfish#0d4cc0c82269bce8422b0e9105b7fe88c2efe42a</div> </li> <li><a href="/article/1899301829213220864.htm" title="Vue3 基础教程:从入门到实践 (保姆级教学)" target="_blank">Vue3 基础教程:从入门到实践 (保姆级教学)</a> <span class="text-muted">前段技术人</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a> <div>一、Vue3简介Vue.js是一款用于构建用户界面的JavaScript框架,而Vue3作为其最新的主要版本,带来了诸多令人瞩目的改进与新特性,使其在前端开发领域备受青睐。(一)Vue3的优势性能提升:Vue3重写了虚拟DOM算法,显著提高了挂载、更新和渲染的速度。在处理大型列表或频繁数据更新的场景时,Vue3的表现更为出色,能够为用户带来更流畅的交互体验。例如,一个包含大量商品信息的电商产品列表</div> </li> <li><a href="/article/1899300566526390272.htm" title="SpringBoot + vue 管理系统" target="_blank">SpringBoot + vue 管理系统</a> <span class="text-muted">m0_51274464</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>SpringBoot+vue管理系统文章目录SpringBoot+vue管理系统1、成品效果展示2、项目准备3、项目开发3.1、部门管理3.1.1、前端核心代码3.1.2、后端代码实现3.2、员工管理3.2.1、前端核心代码3.2.2、后端代码实现3.3、班级管理3.3.1、前端核心代码3.3.2、后端代码实现3.4、学生管理3.4.1、前端核心代码3.4.2、后端代码实现3.5、数据统计3.5.</div> </li> <li><a href="/article/113.htm" title="windows下源码安装golang" target="_blank">windows下源码安装golang</a> <span class="text-muted">616050468</span> <a class="tag" taget="_blank" href="/search/golang%E5%AE%89%E8%A3%85/1.htm">golang安装</a><a class="tag" taget="_blank" href="/search/golang%E7%8E%AF%E5%A2%83/1.htm">golang环境</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>         系统: 64位win7, 开发环境:sublime text 2,  go版本: 1.4.1    1.  安装前准备(gcc, gdb, git)        golang在64位系</div> </li> <li><a href="/article/240.htm" title="redis批量删除带空格的key" target="_blank">redis批量删除带空格的key</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>redis批量删除的通常做法: redis-cli keys "blacklist*" | xargs redis-cli del 上面的命令在key的前后没有空格时是可以的,但有空格就不行了: $redis-cli keys "blacklist*" 1) "blacklist:12: 361942420@qq.com</div> </li> <li><a href="/article/367.htm" title="oracle正则表达式的用法" target="_blank">oracle正则表达式的用法</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>  方括号表达示 方括号表达式 描述 [[:alnum:]] 字母和数字混合的字符 [[:alpha:]] 字母字符 [[:cntrl:]] 控制字符 [[:digit:]] 数字字符 [[:graph:]] 图像字符 [[:lower:]] 小写字母字符 [[:print:]] 打印字符 [[:punct:]] 标点符号字符 [[:space:]]</div> </li> <li><a href="/article/494.htm" title="2048源码(核心算法有,缺少几个anctionbar,以后补上)" target="_blank">2048源码(核心算法有,缺少几个anctionbar,以后补上)</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/2048/1.htm">2048</a> <div>2048游戏基本上有四部分组成, 1:主activity,包含游戏块的16个方格,上面统计分数的模块 2:底下的gridview,监听上下左右的滑动,进行事件处理, 3:每一个卡片,里面的内容很简单,只有一个text,记录显示的数字 4:Actionbar,是游戏用重新开始,设置等功能(这个在底下可以下载的代码里面还没有实现) 写代码的流程 1:设计游戏的布局,基本是两块,上面是分</div> </li> <li><a href="/article/621.htm" title="jquery内部链式调用机理" target="_blank">jquery内部链式调用机理</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>只需要在调用该对象合适(比如下列的setStyles)的方法后让该方法返回该对象(通过this  因为一旦一个函数称为一个对象方法的话那么在这个方法内部this(结合下面的setStyles)指向这个对象) function create(type){ var element=document.createElement(type); //this=element; </div> </li> <li><a href="/article/748.htm" title="你订酒店时的每一次点击 背后都是NoSQL和云计算" target="_blank">你订酒店时的每一次点击 背后都是NoSQL和云计算</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a> <div>全球最大的在线旅游公司Expedia旗下的酒店预订公司,它运营着89个网站,跨越68个国家,三年前开始实验公有云,以求让客户在预订网站上查询假期酒店时得到更快的信息获取体验。 云端本身是用于驱动网站的部分小功能的,如搜索框的自动推荐功能,还能保证处理Hotels.com服务的季节性需求高峰整体储能。 Hotels.com的首席技术官Thierry Bedos上个月在伦敦参加“2015 Clou</div> </li> <li><a href="/article/875.htm" title="java笔记1" target="_blank">java笔记1</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1,面向对象程序设计(Object-oriented Propramming,OOP):java就是一种面向对象程序设计。 2,对象:我们将问题空间中的元素及其在解空间中的表示称为“对象”。简单来说,对象是某个类型的实例。比如狗是一个类型,哈士奇可以是狗的一个实例,也就是对象。 3,面向对象程序设计方式的特性:     3.1 万物皆为对象。    </div> </li> <li><a href="/article/1002.htm" title="C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)" target="_blank">C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/C%2FC%2B%2B%E6%B1%82%E8%81%8C%E9%9D%A2%E8%AF%95%E5%BF%85%E5%A4%87%E8%80%83%E7%82%B9/1.htm">C/C++求职面试必备考点</a> <div>        找工作在即,以后决定每天至少写一个知识点,主要是记录,逼迫自己动手、总结加深印象。当然如果能有一言半语让他人收益,后学幸运之至也。如有错误,还希望大家帮忙指出来。感激不尽。        后学保证每个写出来的结果都是自己在电脑上亲自跑过的,咱人笨,以前学的也半吊子。很多时候只能靠运行出来的结果再反过来</div> </li> <li><a href="/article/1129.htm" title="程序员写代码时就不要管需求了吗?" target="_blank">程序员写代码时就不要管需求了吗?</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98%E4%B8%8D%E8%83%BD%E4%B8%80%E5%91%B3%E8%B7%9F%E9%9C%80%E6%B1%82%E8%B5%B0/1.htm">程序员不能一味跟需求走</a> <div>      编程也有2年了,刚开始不懂的什么都跟需求走,需求是怎样就用代码实现就行,也不管这个需求是否合理,是否为较好的用户体验。当然刚开始编程都会这样,但是如果有了2年以上的工作经验的程序员只知道一味写代码,而不在写的过程中思考一下这个需求是否合理,那么,我想这个程序员就只能一辈写敲敲代码了。       我的技术不是很好,但是就不代</div> </li> <li><a href="/article/1256.htm" title="Activity的四种启动模式" target="_blank">Activity的四种启动模式</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%A0%88%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">栈模式启动</a><a class="tag" taget="_blank" href="/search/Activity%E7%9A%84%E6%A0%87%E5%87%86%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">Activity的标准模式启动</a><a class="tag" taget="_blank" href="/search/%E6%A0%88%E9%A1%B6%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">栈顶模式启动</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">单例模式启动</a> <div>android界面的操作就是很多个activity之间的切换,启动模式决定启动的activity的生命周期 ;   启动模式xml中配置     <activity android:name=".MainActivity" android:launchMode="standard&quo</div> </li> <li><a href="/article/1383.htm" title="Spring中@Autowired标签与@Resource标签的区别" target="_blank">Spring中@Autowired标签与@Resource标签的区别</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%40Resource/1.htm">@Resource</a><a class="tag" taget="_blank" href="/search/%40Autowired/1.htm">@Autowired</a><a class="tag" taget="_blank" href="/search/%40Qualifier/1.htm">@Qualifier</a> <div>Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource、 @PostConstruct及@PreDestroy。   1. @Autowired    @Autowired是Spring 提供的,需导入    Package:org.springframewo</div> </li> <li><a href="/article/1510.htm" title="Changes Between SOAP 1.1 and SOAP 1.2" target="_blank">Changes Between SOAP 1.1 and SOAP 1.2</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/Changes/1.htm">Changes</a><a class="tag" taget="_blank" href="/search/Enable/1.htm">Enable</a><a class="tag" taget="_blank" href="/search/SOAP+1.1/1.htm">SOAP 1.1</a><a class="tag" taget="_blank" href="/search/SOAP+1.2/1.htm">SOAP 1.2</a> <div>JAX-WS SOAP Version 1.2 Part 0: Primer (Second Edition) SOAP Version 1.2 Part 1: Messaging Framework (Second Edition) SOAP Version 1.2 Part 2: Adjuncts (Second Edition)   Which style of WSDL</div> </li> <li><a href="/article/1637.htm" title="【Hadoop二】Hadoop常用命令" target="_blank">【Hadoop二】Hadoop常用命令</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>以Hadoop运行Hadoop自带的wordcount为例,   hadoop脚本位于/home/hadoop/hadoop-2.5.2/bin/hadoop,需要说明的是,这些命令的使用必须在Hadoop已经运行的情况下才能执行   Hadoop HDFS相关命令  hadoop fs -ls  列出HDFS文件系统的第一级文件和第一级</div> </li> <li><a href="/article/1764.htm" title="java异常处理(初级)" target="_blank">java异常处理(初级)</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>从学习到现在从事java开发一年多了,个人觉得对java只了解皮毛,很多东西都是用到再去慢慢学习,编程真的是一项艺术,要完成一段好的代码,需要懂得很多。 最近项目经理让我负责一个组件开发,框架都由自己搭建,最让我头疼的是异常处理,我看了一些网上的源码,发现他们对异常的处理不是很重视,研究了很久都没有找到很好的解决方案。后来有幸看到一个200W美元的项目部分源码,通过他们对异常处理的解决方案,我终</div> </li> <li><a href="/article/1891.htm" title="记录整理-工作问题" target="_blank">记录整理-工作问题</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>1)那位同学还是CSV文件默认Excel打开看不到全部结果。以为是没写进去。同学甲说文件应该不分大小。后来log一下原来是有写进去。只是Excel有行数限制。那位同学进步好快啊。 2)今天同学说写文件的时候提示jvm的内存溢出。我马上反应说那就改一下jvm的内存大小。同学说改用分批处理了。果然想问题还是有局限性。改jvm内存大小只能暂时地解决问题,以后要是写更大的文件还是得改内存。想问题要长远啊</div> </li> <li><a href="/article/2018.htm" title="org.apache.tools.zip实现文件的压缩和解压,支持中文" target="_blank">org.apache.tools.zip实现文件的压缩和解压,支持中文</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div>刚开始用java.util.Zip,发现不支持中文(网上有修改的方法,但比较麻烦) 后改用org.apache.tools.zip org.apache.tools.zip的使用网上有更简单的例子 下面的程序根据实际需求,实现了压缩指定目录下指定文件的方法 import java.io.BufferedReader; import java.io.BufferedWrit</div> </li> <li><a href="/article/2145.htm" title="读书笔记-4" target="_blank">读书笔记-4</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a> <div>1、JSTL 核心标签库标签 2、避免SQL注入 3、字符串逆转方法 4、字符串比较compareTo 5、字符串替换replace 6、分拆字符串 1、JSTL 核心标签库标签共有13个, 学习资料:http://www.cnblogs.com/lihuiyy/archive/2012/02/24/2366806.html 功能上分为4类: (1)表达式控制标签:out</div> </li> <li><a href="/article/2272.htm" title="[物理与电子]半导体教材的一个小问题" target="_blank">[物理与电子]半导体教材的一个小问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a> <div>       各种模拟电子和数字电子教材中都有这个词汇-空穴       书中对这个词汇的解释是; 当电子脱离共价键的束缚成为自由电子之后,共价键中就留下一个空位,这个空位叫做空穴       我现在回过头翻大学时候的教材,觉得这个</div> </li> <li><a href="/article/2399.htm" title="Flashback Database --闪回数据库" target="_blank">Flashback Database --闪回数据库</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E9%97%AA%E5%9B%9E%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">闪回数据库</a> <div>Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。 在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashbac</div> </li> <li><a href="/article/2526.htm" title="简单排序:插入排序" target="_blank">简单排序:插入排序</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F/1.htm">插入排序</a> <div> public void insertSort(int[] array){ int temp; for(int i=1;i<array.length;i++){ temp = array[i]; for(int k=i-1;k>=0;k--)</div> </li> <li><a href="/article/2653.htm" title="C语言学习六指针小示例、一维数组名含义,定义一个函数输出数组的内容" target="_blank">C语言学习六指针小示例、一维数组名含义,定义一个函数输出数组的内容</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div># include <stdio.h> int main(void) { int * p; //等价于 int *p 也等价于 int* p; int i = 5; char ch = 'A'; //p = 5; //error //p = &ch; //error //p = ch; //error p = &i; // </div> </li> <li><a href="/article/2780.htm" title="centos下php redis扩展的安装配置3种方法" target="_blank">centos下php redis扩展的安装配置3种方法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>方法一 1.下载php redis扩展包  代码如下 复制代码 #wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz 2 tar -zxvf 解压压缩包,cd /扩展包 (进入扩展包然后 运行phpize 一下是我环境中phpize的目录,/usr/local/php/bin/phpize (一定要</div> </li> <li><a href="/article/2907.htm" title="线程池(Executors)" target="_blank">线程池(Executors)</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a> <div>在java类库中,任务执行的主要抽象不是Thread,而是Executor,将任务的提交过程和执行过程解耦 public interface Executor { void execute(Runnable command); }   public class RunMain implements Executor{ @Override pub</div> </li> <li><a href="/article/3034.htm" title="openstack 快速安装笔记" target="_blank">openstack 快速安装笔记</a> <span class="text-muted">haoningabc</span> <a class="tag" taget="_blank" href="/search/openstack/1.htm">openstack</a> <div>前提是要配置好yum源 版本icehouse,操作系统redhat6.5 最简化安装,不要cinder和swift 三个节点 172 control节点keystone glance horizon 173 compute节点nova 173 network节点neutron control /etc/sysctl.conf net.ipv4.ip_forward =</div> </li> <li><a href="/article/3161.htm" title="从c面向对象的实现理解c++的对象(二)" target="_blank">从c面向对象的实现理解c++的对象(二)</a> <span class="text-muted">jimmee</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/1.htm">面向对象</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E5%87%BD%E6%95%B0/1.htm">虚函数</a> <div>1. 类就可以看作一个struct,类的方法,可以理解为通过函数指针的方式实现的,类对象分配内存时,只分配成员变量的,函数指针并不需要分配额外的内存保存地址。 2. c++中类的构造函数,就是进行内存分配(malloc),调用构造函数 3. c++中类的析构函数,就时回收内存(free) 4. c++是基于栈和全局数据分配内存的,如果是一个方法内创建的对象,就直接在栈上分配内存了。 专门在</div> </li> <li><a href="/article/3288.htm" title="如何让那个一个div可以拖动" target="_blank">如何让那个一个div可以拖动</a> <span class="text-muted">lingfeng520240</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml</div> </li> <li><a href="/article/3415.htm" title="第10章 高级事件(中)" target="_blank">第10章 高级事件(中)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8B%E4%BB%B6/1.htm">事件</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3542.htm" title="计算两个经纬度之间的距离" target="_blank">计算两个经纬度之间的距离</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97/1.htm">计算</a><a class="tag" taget="_blank" href="/search/%E7%BA%AC%E5%BA%A6/1.htm">纬度</a><a class="tag" taget="_blank" href="/search/LBS/1.htm">LBS</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E5%BA%A6/1.htm">经度</a><a class="tag" taget="_blank" href="/search/%E8%B7%9D%E7%A6%BB/1.htm">距离</a> <div>要解决这个问题的时候,到网上查了很多方案,最后计算出来的都与百度计算出来的有出入。下面这个公式计算出来的距离和百度计算出来的距离是一致的。 /** * * @param longitudeA * 经度A点 * @param latitudeA * 纬度A点 * @param longitudeB * </div> </li> <li><a href="/article/3669.htm" title="最具争议的10个Java话题" target="_blank">最具争议的10个Java话题</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1、Java8已经到来。什么!? Java8 支持lambda。哇哦,RIP Scala!   随着Java8 的发布,出现很多关于新发布的Java8是否有潜力干掉Scala的争论,最终的结论是远远没有那么简单。Java8可能已经在Scala的lambda的包围中突围,但Java并非是函数式编程王位的真正觊觎者。    2、Java 9 即将到来    Oracle早在8月份就发布</div> </li> <li><a href="/article/3796.htm" title="zoj 3826 Hierarchical Notation(模拟)" target="_blank">zoj 3826 Hierarchical Notation(模拟)</a> <span class="text-muted">阿尔萨斯</span> <a class="tag" taget="_blank" href="/search/rar/1.htm">rar</a> <div> 题目链接:zoj 3826 Hierarchical Notation 题目大意:给定一些结构体,结构体有value值和key值,Q次询问,输出每个key值对应的value值。 解题思路:思路很简单,写个类词法的递归函数,每次将key值映射成一个hash值,用map映射每个key的value起始终止位置,预处理完了查询就很简单了。 这题是最后10分钟出的,因为没有考虑value为{}的情</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>