一文讲透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/1835512920797179904.htm" title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a> <span class="text-muted">软件技术NINI</span> <a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/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> <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div> </li> <li><a href="/article/1835509897106649088.htm" title="Long类型前后端数据不一致" target="_blank">Long类型前后端数据不一致</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问</div> </li> <li><a href="/article/1835504723210366976.htm" title="第四天旅游线路预览——从换乘中心到喀纳斯湖" target="_blank">第四天旅游线路预览——从换乘中心到喀纳斯湖</a> <span class="text-muted">陟彼高冈yu</span> <a class="tag" taget="_blank" href="/search/%E5%9F%BA%E4%BA%8EGoogle/1.htm">基于Google</a><a class="tag" taget="_blank" href="/search/earth/1.htm">earth</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E7%9A%84%E6%97%85%E6%B8%B8%E8%A7%84%E5%88%92%E5%92%8C%E9%A2%84%E8%A7%88/1.htm">的旅游规划和预览</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a> <div>第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪;换乘中心有4路车,喀纳斯①号车,去喀纳斯湖,路程时长约5分钟;将上面的的行程安排进行动态展示,具体步骤见”Googleearthstudio进行动态轨迹显示制作过程“、“Googleearthstudio入门教程”和“Googleearthstudio进阶教程“相关内容,得到行程如下所示:Day4-2-480p</div> </li> <li><a href="/article/1835504470440636416.htm" title="Goolge earth studio 进阶4——路径修改与平滑" target="_blank">Goolge earth studio 进阶4——路径修改与平滑</a> <span class="text-muted">陟彼高冈yu</span> <a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/earth/1.htm">earth</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B/1.htm">进阶教程</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a> <div>如果我们希望在大约中途时获得更多的城市鸟瞰视角。可以将相机拖动到这里并创建一个新的关键帧。camera_target_clip_7EarthStudio会自动平滑我们的路径,所以当我们通过这个关键帧时,不是一个生硬的角度,而是一个平滑的曲线。camera_target_clip_8路径上有贝塞尔控制手柄,允许我们调整路径的形状。右键单击,我们可以选择“平滑路径”,这是默认的自动平滑算法,或者我们可</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835497792265613312.htm" title="【加密社】Solidity 中的事件机制及其应用" target="_blank">【加密社】Solidity 中的事件机制及其应用</a> <span class="text-muted">加密社</span> <a class="tag" taget="_blank" href="/search/%E9%97%B2%E4%BE%83/1.htm">闲侃</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6/1.htm">智能合约</a><a class="tag" taget="_blank" href="/search/%E5%8C%BA%E5%9D%97%E9%93%BE/1.htm">区块链</a> <div>加密社引言在Solidity合约开发过程中,事件(Events)是一种非常重要的机制。它们不仅能够让开发者记录智能合约的重要状态变更,还能够让外部系统(如前端应用)监听这些状态的变化。本文将详细介绍Solidity中的事件机制以及如何利用不同的手段来触发、监听和获取这些事件。事件存储的地方当我们在Solidity合约中使用emit关键字触发事件时,该事件会被记录在区块链的交易收据中。具体而言,事件</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835493753557708800.htm" title="每日算法&面试题,大厂特训二十八天——第二十天(树)" target="_blank">每日算法&面试题,大厂特训二十八天——第二十天(树)</a> <span class="text-muted">肥学</span> <a class="tag" taget="_blank" href="/search/%E2%9A%A1%E7%AE%97%E6%B3%95%E9%A2%98%E2%9A%A1%E9%9D%A2%E8%AF%95%E9%A2%98%E6%AF%8F%E6%97%A5%E7%B2%BE%E8%BF%9B/1.htm">⚡算法题⚡面试题每日精进</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章</div> </li> <li><a href="/article/1835492740536823808.htm" title="node.js学习" target="_blank">node.js学习</a> <span class="text-muted">小猿L</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div> </li> <li><a href="/article/1835453535777550336.htm" title="vue3中el-table中点击图片放大时,被表格覆盖" target="_blank">vue3中el-table中点击图片放大时,被表格覆盖</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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>问题:vue3中el-table中点击图片放大时,被表格覆盖。解决方法:el-image添加preview-teleported</div> </li> <li><a href="/article/1835452528599330816.htm" title="vue项目element-ui的table表格单元格合并" target="_blank">vue项目element-ui的table表格单元格合并</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/elementui/1.htm">elementui</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> <div>一、合并效果二全部代码exportdefault{name:'CellMerge',data(){return{tableData:[{id:'1',name:'王小虎',amount1:'165',amount2:'3.2',amount3:10},{id:'1',name:'王小虎',amount1:'162',amount2:'4.43',amount3:12},{id:'1',name:'</div> </li> <li><a href="/article/1835450513689243648.htm" title="2023-08-20" target="_blank">2023-08-20</a> <span class="text-muted">圆梦菌</span> <div>魔力宝贝最详细新手教程,新手该如何完美开局,建议收藏转发2023-08-2010:34《魔力宝贝》手游体力是什么?魔力宝贝体力恢复机制是每10分钟回复1点;体力作用:挑战关卡需消耗体力体力获取方式1、好友每天可以赠送15次,也就是15点体力2、系统每天中午12点以及下午6点赠送25体3、在商城使用神石购买《魔力宝贝》手游战斗力如何提升?1、宠物强化宠物通过融合进阶后可以大幅度提升战力,最高级的宠物</div> </li> <li><a href="/article/1835450384655675392.htm" title="Vue中table合并单元格用法" target="_blank">Vue中table合并单元格用法</a> <span class="text-muted">weixin_30613343</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a> <div>地名结果人名性别{{item.name}}已完成未完成{{item.groups[0].name}}{{item.groups[0].sex}}{{item.groups[son].name}}{{item.groups[son].sex}}exportdefault{data(){return{list:[{name:'地名1',result:'1',groups:[{name:'张三',sex</div> </li> <li><a href="/article/1835448238103162880.htm" title="springboot+vue项目实战一-创建SpringBoot简单项目" target="_blank">springboot+vue项目实战一-创建SpringBoot简单项目</a> <span class="text-muted">苹果酱0567</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/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/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一</div> </li> <li><a href="/article/1835448239864770560.htm" title="JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)" target="_blank">JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/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>在JavaScript中,深拷贝(DeepCopy)和浅拷贝(ShallowCopy)是用于复制对象或数组的两种不同方法。了解它们的区别和应用场景对于避免潜在的bugs和高效地处理数据非常重要。以下是对深拷贝和浅拷贝的详细解释,包括它们的概念、用途、优缺点以及实现方式。1.浅拷贝(ShallowCopy)概念定义:浅拷贝是指创建一个新的对象或数组,其中包含了原对象或数组的基本数据类型的值和对引用数</div> </li> <li><a href="/article/1835443569528238080.htm" title="Vue( ElementUI入门、vue-cli安装)" target="_blank">Vue( ElementUI入门、vue-cli安装)</a> <span class="text-muted">m0_l5z</span> <a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>一.ElementUI入门目录:1.ElementUI入门1.1ElementUI简介1.2Vue+ElementUI安装1.3开发示例2.搭建nodejs环境2.1nodejs介绍2.2npm是什么2.3nodejs环境搭建2.3.1下载2.3.2解压2.3.3配置环境变量2.3.4配置npm全局模块路径和cache默认安装位置2.3.5修改npm镜像提高下载速度2.3.6验证安装结果3.运行n</div> </li> <li><a href="/article/1835439322715746304.htm" title="258-各位相加" target="_blank">258-各位相加</a> <span class="text-muted">不胖二十斤不改名zz</span> <div>给定一个非负整数num,反复将各个位上的数字相加,直到结果为一位数。输入:38输出:2解释:各位相加的过程为:3+8=11,1+1=2。由于2是一位数,所以返回2。最简单的方法就是递归了。进阶:你可以不使用循环或者递归,且在O(1)时间复杂度内解决这个问题吗?假如一个三位数'abc',其值大小为s1=100*a+10*b+1*c,经过一次各位相加后,变为s2=a+b+c,减小的差值为(s1-s2)</div> </li> <li><a href="/article/1835437775344726016.htm" title="博客网站制作教程" target="_blank">博客网站制作教程</a> <span class="text-muted">2401_85194651</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java</div> </li> <li><a href="/article/1835435885760442368.htm" title="vue+el-table 可输入表格使用上下键进行input框切换" target="_blank">vue+el-table 可输入表格使用上下键进行input框切换</a> <span class="text-muted">以对_</span> <a class="tag" taget="_blank" href="/search/vue%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/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/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>使用上下键进行完工数量这一列的切换-->//键盘触发事件show(ev,index){letnewIndex;letinputAll=document.querySelectorAll('.table_inputinput');//向上=38if(ev.keyCode==38){if(index==0){//如果是第一行,回到最后一个newIndex=inputAll.length-1}elsei</div> </li> <li><a href="/article/1835435885122908160.htm" title="vue + Element UI table动态合并单元格" target="_blank">vue + Element UI table动态合并单元格</a> <span class="text-muted">我家媳妇儿萌哒哒</span> <a class="tag" taget="_blank" href="/search/element/1.htm">element</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</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>一、功能需求1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并)2、落实情况里的定量内容和定性内容值一样则合并。(横向合并)二、功能实现exportdefault{data(){return{tableData:[{name:'a',address:'1',age:'1',six:'2'},{name:'a',addre</div> </li> <li><a href="/article/1835431726982197248.htm" title="vue 创建项目报错:command failed: npm install --loglevel error" target="_blank">vue 创建项目报错:command failed: npm install --loglevel error</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/vue-cli3/1.htm">vue-cli3</a> <div>这个问题其实很好解决,只是很多种情况,逐一排除即可。稳下心来~vuecli3创建项目我的node版本是node14.15.0,(永远不要尝试最新版本)node各种版本下载地址:以往的版本|Node.js(nodejs.org)vue/cli@3.12.1npminstall-g@vue/cli@3.12.1(注意vue/cli2和vue/cli3的下载命名有所改变,2是-形式,3是/形式)其实报错</div> </li> <li><a href="/article/1835428948339683328.htm" title="JavaScript `Map` 和 `WeakMap`详细解释" target="_blank">JavaScript `Map` 和 `WeakMap`详细解释</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%8E%9F%E7%94%9F%E6%96%B9%E6%B3%95/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%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在JavaScript中,Map和WeakMap都是用于存储键值对的数据结构,但它们有一些关键的不同之处。MapMap是一种可以存储任意类型的键值对的集合。它保持了键值对的插入顺序,并且可以通过键快速查找对应的值。Map提供了一些非常有用的方法和属性来操作这些数据对:set(key,value):将一个键值对添加到Map中。如果键已经存在,则更新其对应的值。get(key):获取指定键的值。如果键</div> </li> <li><a href="/article/1835428821877223424.htm" title="计算机毕业设计PHP仓储综合管理系统(源码+程序+VUE+lw+部署)" target="_blank">计算机毕业设计PHP仓储综合管理系统(源码+程序+VUE+lw+部署)</a> <span class="text-muted">java毕设程序源码王哥</span> <a class="tag" taget="_blank" href="/search/php/1.htm">php</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/vue.js/1.htm">vue.js</a> <div>该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:phpStudy+Vscode+Mysql5.7+HBuilderX+Navicat11+Vue+Express。项目技术:原生PHP++Vue等等组成,B/S模式+Vscode管理+前后端分离等等。环境需要1.运行环境:最好是小皮phpstudy最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发</div> </li> <li><a href="/article/1835428317084348416.htm" title="最简单将静态网页挂载到服务器上(不用nginx)" target="_blank">最简单将静态网页挂载到服务器上(不用nginx)</a> <span class="text-muted">全能全知者</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/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/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>最简单将静态网页挂载到服务器上(不用nginx)如果随便弄个静态网页挂在服务器都要用nignx就太麻烦了,所以直接使用Apache来搭建一些简单前端静态网页会相对方便很多检查Web服务器服务状态:sudosystemctlstatushttpd#ApacheWeb服务器如果发现没有安装web服务器:安装Apache:sudoyuminstallhttpd启动Apache:sudosystemctl</div> </li> <li><a href="/article/1835427057752961024.htm" title="补充元象二面" target="_blank">补充元象二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.请尽可能详细地说明,防抖和节流的区别,应用场景?你的回答中不要写出示例代码。防抖(Debounce)和节流(Throttle)是两种常用的前端性能优化技术,它们的主要区别在于如何处理高频事件的触发。以下是防抖和节流的区别和应用场景的详细说明:防抖和节流的定义防抖:在一段时间内,多次执行变为只执行最后一次。防抖的原理是,当事件被触发后,设置一个延迟定时器。如果在这个延迟时间内事件再次被触发,则重</div> </li> <li><a href="/article/1835420753252675584.htm" title="微信小程序开发注意事项" target="_blank">微信小程序开发注意事项</a> <span class="text-muted">jun778895</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>微信小程序开发是一个融合了前端开发、用户体验设计、后端服务(可选)以及微信小程序平台特性的综合性项目。这里,我将详细介绍一个典型的小程序开发项目的全过程,包括项目规划、设计、开发、测试及部署上线等各个环节,并尽量使内容达到或超过2000字的要求。一、项目规划1.1项目背景与目标假设我们要开发一个名为“智慧校园助手”的微信小程序,旨在为学生提供一站式校园生活服务,包括课程表查询、图书馆座位预约、食堂</div> </li> <li><a href="/article/1835419870070665216.htm" title="切换淘宝最新npm镜像源是" target="_blank">切换淘宝最新npm镜像源是</a> <span class="text-muted">hai40587</span> <a class="tag" taget="_blank" href="/search/npm/1.htm">npm</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>切换淘宝最新npm镜像源是一个相对简单的过程,但首先需要明确当前淘宝npm镜像源的状态和最新的镜像地址。由于网络环境和服务更新,镜像源的具体地址可能会发生变化,因此,我将基于当前可获取的信息,提供一个通用的切换步骤,并附上最新的镜像地址(截至回答时)。一、了解npm镜像源npm(NodePackageManager)是JavaScript的包管理器,用于安装、更新和管理项目依赖。由于npm官方仓库</div> </li> <li><a href="/article/1835414702142877696.htm" title="Python编程 - 函数进阶" target="_blank">Python编程 - 函数进阶</a> <span class="text-muted">易辰君</span> <a class="tag" taget="_blank" href="/search/Python%E6%A0%B8%E5%BF%83%E7%BC%96%E7%A8%8B/1.htm">Python核心编程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>目录前言一、函数参数的高级用法(一)缺省参数(二)命名参数(三)不定长参数二、拆包(一)函数返回值拆包(二)通过星号拆包(三)总结三、匿名函数(一)函数定义(二)使用匿名函数四、递归函数(一)简介(二)基本结构(三)简单示例(四)优缺点总结前言上篇文章主要了解了函数基础,如何定义函数,函数种类以及局部变量和全局变量的差异等,接下来就讲解python函数较为进阶的知识点,若有任何想法欢迎一起沟通讨论</div> </li> <li><a href="/article/1835411044768509952.htm" title="字节二面" target="_blank">字节二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文</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>