一文讲透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/1885181657342865408.htm" title="Vue全流程--Vue2组件的理解第二部分" target="_blank">Vue全流程--Vue2组件的理解第二部分</a> <span class="text-muted">不清参</span> <a class="tag" taget="_blank" href="/search/Vue%E5%85%A8%E6%B5%81%E7%A8%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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>组件命名规则好的命名规则可以省去很多不必要的麻烦,这个好习惯还是要养成的一个单词组成:第一种写法(首字母小写):school第二种写法(首字母大写):School多个单词组成:第一种写法(kebab-case命名):my-school第二种写法(CamelCase命名):MySchool(需要Vue脚手架支持)备注:(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。(2).</div> </li> <li><a href="/article/1885158585374142464.htm" title="Rollup:专注类库和框架打包" target="_blank">Rollup:专注类库和框架打包</a> <span class="text-muted">时解之</span> <a class="tag" taget="_blank" href="/search/JS%E4%B8%93%E5%8C%BA/1.htm">JS专区</a><a class="tag" taget="_blank" href="/search/Rollup/1.htm">Rollup</a><a class="tag" taget="_blank" href="/search/Rollup%E6%89%93%E5%8C%85/1.htm">Rollup打包</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%89%8D%E7%AB%AF/1.htm">大前端</a><a class="tag" taget="_blank" href="/search/Javascript/1.htm">Javascript</a> <div>文章内容输出来源:拉勾大前端高薪训练营-概述-也是一款ESModules打包器-也可以将项目中的一些散落的细小模块打包为整块代码-rollup与webpack作用类似-rollup更为小巧,仅仅是一款ESM打包器-rollup中并不支持类似HMR这种高级特性-rollup并不是要与webpack全面竞争-目标是提供一个充分利用ESM各项特性的高效打包器-快速上手-准备代码-src/message.</div> </li> <li><a href="/article/1885156560490000384.htm" title="Rollup 实践:从入门到精通" target="_blank">Rollup 实践:从入门到精通</a> <span class="text-muted">小亮同学丶</span> <a class="tag" taget="_blank" href="/search/%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7%E5%92%8C%E6%A8%A1%E5%9D%97%E6%89%93%E5%8C%85/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/webpack/1.htm">webpack</a> <div>Rollup是一个高效的JavaScript模块打包器,特别适用于库和应用程序的打包。本文将深入探讨Rollup的实践方法,包括配置示例、性能优化策略以及不同场景下的最佳实践。基本配置首先,我们来看一个简单的Rollup配置示例:importresolvefrom'@rollup/plugin-node-resolve';importcommonjsfrom'@rollup/plugin-comm</div> </li> <li><a href="/article/1885156055181225984.htm" title="前端必知必会-TypeScript 实用类型" target="_blank">前端必知必会-TypeScript 实用类型</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/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a> <div>文章目录TypeScript实用类型PartialrequiredRecord省略OmitPickExcludeReturnType参数ParametersReadonly总结TypeScript实用类型TypeScript附带大量类型,可帮助进行一些常见的类型操作,通常称为实用类型。PartialPartial将对象中的所有属性更改为可选。示例interfacePoint{x:number;y:</div> </li> <li><a href="/article/1885156055592267776.htm" title="前端必知必会-TypeScript Keyof的使用" target="_blank">前端必知必会-TypeScript Keyof的使用</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/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>文章目录TypeScriptKeyof带有显式键的keyof带有索引签名的keyof总结TypeScriptKeyofkeyof是TypeScript中的一个关键字,用于从对象类型中提取键类型。带有显式键的keyof当在带有显式键的对象类型上使用时,keyof会使用这些键创建一个联合类型。示例interfacePerson{name:string;age:number;}//此处的`keyofPe</div> </li> <li><a href="/article/1885155046430142464.htm" title="前端学习-环境this对象以及回调函数(二十七)" target="_blank">前端学习-环境this对象以及回调函数(二十七)</a> <span class="text-muted">marshalVS</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/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> <div>目录前言目标环境对象作用环境对象this是什么?判断this指向的粗略规则是什么?回调函数目标常见的使用场景综合案例:Tab任务栏切换总结前言男儿何不带吴钩,收取关山五十州目标能够分析判断函数运行在不同环境中this所指代的对象环境对象指的是函数内部特殊的变量this,它代表当前函数运行时所处的环境作用弄清楚this的指向,可以使代码更简洁函数的调用方式不同,this所指代的对象不同[谁调用,th</div> </li> <li><a href="/article/1885153531812442112.htm" title="vue2源码npm i时报错(sh: rollup: command not found)" target="_blank">vue2源码npm i时报错(sh: rollup: command not found)</a> <span class="text-muted">想不到耶</span> <a class="tag" taget="_blank" href="/search/vue2/1.htm">vue2</a><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/vue/1.htm">vue</a> <div>在对vue2.6.14版本的源码安装出现警告(WARN):deprecatedrollup-plugin-buble@0.19.8:Thismodulehasbeendeprecatedandisnolongermaintained.Pleaseuse@rollup/plugin-buble.翻译:deprecatedrollup-plugin-buble@0.19.8:此模块已被弃用,不再维护。</div> </li> <li><a href="/article/1885152901144309760.htm" title="初识Node.js:入门指南与核心特性解析" target="_blank">初识Node.js:入门指南与核心特性解析</a> <span class="text-muted">Singe.Chen</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>引言Node.js是一种基于ChromeV8引擎构建的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程。自2009年发布以来,Node.js因其高效的性能和广泛的应用而迅速成为后端开发的热门选择。本文将介绍Node.js的基本概念、安装和使用方法,并探讨其核心特性如事件驱动和非阻塞I/O,提供一些简单的代码示例,帮助初学者快速入门。Node.js的基本概念Node</div> </li> <li><a href="/article/1885138393613004800.htm" title="主流编程语言的优劣分析及学习建议" target="_blank">主流编程语言的优劣分析及学习建议</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/java/1.htm">java</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/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>不同语言的特性主流编程语言的优劣分析及学习建议1.Python优点缺点学习建议适用于哪些人?2.JavaScript优点缺点学习建议适用于哪些人?3.Java优点缺点学习建议适用于哪些人?4.C++优点缺点学习建议适用于哪些人?5.Swift优点缺点学习建议适用于哪些人?结论主流编程语言的优劣分析及学习建议对于年轻人或者即将开始编程学习的人来说,选择一门合适的编程语言至关重要。不同的编程语言有各自</div> </li> <li><a href="/article/1885133852079353856.htm" title="windows进阶-cmd命令" target="_blank">windows进阶-cmd命令</a> <span class="text-muted">云水一方</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a> <div>在Windows操作系统中,CMD提供了许多强大的命令,能够帮助用户执行一些更为高级的任务。这些命令不仅仅限于文件和目录的管理,还包括了服务管理、远程连接、注册表操作等功能。本文将介绍一些常见但较为特殊的CMD命令及其功能,帮助你更好地使用Windows命令行。1.sc–服务管理sc命令用于与Windows服务交互,可以启动、停止、配置或查询系统服务。这是一个功能强大的工具,尤其在进行系统管理时非</div> </li> <li><a href="/article/1885129679107584000.htm" title="Word/excel/df文档转图片返回前端" target="_blank">Word/excel/df文档转图片返回前端</a> <span class="text-muted">p393975269</span> <a class="tag" taget="_blank" href="/search/%E5%9B%BE%E7%89%87%E8%BD%AC%E6%8D%A2%E5%B7%A5%E5%85%B7aspose/1.htm">图片转换工具aspose</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%A1%A3%E8%BD%AC%E5%9B%BE%E7%89%87%E5%87%BA%E7%8E%B0%E7%A9%BA%E5%BF%83%E6%96%B9%E6%A0%BC%E4%B9%B1%E7%A0%81/1.htm">文档转图片出现空心方格乱码</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%A1%A3%E8%BD%AC%E5%9B%BE%E7%89%87%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E4%BD%93/1.htm">文档转图片自定义字体</a> <div>导入jarcom.asposeaspose-words13.9.0.0com.asposeaspose-cells8.5.2commons-iocommons-io2.6org.apache.pdfboxpdfbox2.0.8org.apache.pdfboxfontbox2.0.8controller层从本地读取文件信息publicclassWordToPngController{publics</div> </li> <li><a href="/article/1885129047093080064.htm" title="Python入门进阶:68 个 Python 内置函数详解" target="_blank">Python入门进阶:68 个 Python 内置函数详解</a> <span class="text-muted">Ndk开发校长</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>3.数学运算abs()返回绝对值divmode()返回商和余数round()四舍五入pow(a,b)求a的b次幂,如果有三个参数.则求完次幂后对第三个数取余sum()求和min()求最小值max()求最大值print(abs(-2))#绝对值:2print(divmod(20,3))#求商和余数:(6,2)print(round(4.50))#五舍六入:4print(round(4.51))#5p</div> </li> <li><a href="/article/1885119598051782656.htm" title="回文数(进阶版)" target="_blank">回文数(进阶版)</a> <span class="text-muted">计信金边罗</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。又如,对于10进制数87,STEPl:87+78=165STEP2:165+561=726STEP3:726+627=1353STEP4:1353+3531=4884  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回</div> </li> <li><a href="/article/1885116819434434560.htm" title="MySQL实战教程:从小白到大神的进阶之路!" target="_blank">MySQL实战教程:从小白到大神的进阶之路!</a> <span class="text-muted">奔跑吧邓邓子</span> <a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/1.htm">项目实战</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>目录一、MySQL概述1、MySQL简介1.1MySQL的历史背景1.2MySQL的特点1.3MySQL的应用场景1.4MySQL的版本2、MySQL发展历程2.1MySQL的起源2.2MySQL的早期发展2.3MySQL的成熟与普及2.4MySQL的商业化与收购2.5MySQL的持续创新3、MySQL应用场景3.1Web应用程序3.2企业级应用3.3大数据分析3.4移动应用3.5云计算3.6物联</div> </li> <li><a href="/article/1885114421412425728.htm" title="全面掌握React:2025年学习路径指南" target="_blank">全面掌握React:2025年学习路径指南</a> <span class="text-muted">chenNorth。</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.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/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>文章目录第一步:Web开发的基石——JavaScript与TypeScript第二步:Web设计的核心——HTML与CSS第三步:进入React的世界第四步:用TailwindCSS进行样式设计第五步:用Shadcn/UI增强你的UI第六步:用ReactHookForm处理表单第七步:用Next.js提升你的技能第八步:用Remix掌握全栈开发第九步:ReactNative+Expo:轻松开发移动</div> </li> <li><a href="/article/1885106722830348288.htm" title="Vue对话式前端界面" target="_blank">Vue对话式前端界面</a> <span class="text-muted">WUJI02</span> <a class="tag" taget="_blank" href="/search/%E8%A3%81%E5%88%A4%E6%96%87%E4%B9%A6%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">裁判文书大模型</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>一.对话样式的实现用一个messages数组来存放对话信息,信息有两种类型user和botthis.messages.push({type:'user',content:this.userMessage});this.messages.push({type:'bot',content:response.data.reply});模版部分使用:class="['message-content',me</div> </li> <li><a href="/article/1885100543102218240.htm" title="vue3+vite+Electron构建跨平台应用" target="_blank">vue3+vite+Electron构建跨平台应用</a> <span class="text-muted">vitenode</span> <a class="tag" taget="_blank" href="/search/Electron/1.htm">Electron</a><a class="tag" taget="_blank" href="/search/electron/1.htm">electron</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>1.搭建第一个electron-vite项目electron-vite是一个新型构建工具,旨在为Electron提供更快、更精简的开发体验。它主要由五部分组成:一套构建指令,它使用Vite打包你的代码,并且它能够处理Electron的独特环境,包括Node.js和浏览器环境。集中配置主进程、渲染器和预加载脚本的Vite配置,并针对Electron的独特环境进行预配置。为渲染器提供快速模块热替换(H</div> </li> <li><a href="/article/1885100416622981120.htm" title="springboot + xterm.js + vue + websocket实现终端功能(y-shell)文件管理器实现" target="_blank">springboot + xterm.js + vue + websocket实现终端功能(y-shell)文件管理器实现</a> <span class="text-muted">张音乐</span> <a class="tag" taget="_blank" href="/search/JS/1.htm">JS</a><a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/React/1.htm">React</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E8%B8%A9%E5%9D%91%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B/1.htm">前端踩坑实战教程</a><a class="tag" taget="_blank" href="/search/%E6%A0%91%E5%BD%A2%E8%8F%9C%E5%8D%95/1.htm">树形菜单</a><a class="tag" taget="_blank" href="/search/%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95/1.htm">右键菜单</a><a class="tag" taget="_blank" href="/search/VUE/1.htm">VUE</a> <div>一、文件管理器功能描述这一章节讲一下文件管理器的实现与设计细节。首先,文件管理器需要提供以下几个主要的功能,开发过程中使用vue渲染前端页面以及交互过程中还是遇到了不少问题,比如说右键菜单,表单校验。1、文件夹的新增,编辑,删除。2、ssh配置的新增,编辑,删除。3、右键菜单如图:文件夹管理ssh连接管理快速运行dockerrun-itd--namey-shell-</div> </li> <li><a href="/article/1885097389405040640.htm" title="LLM模型部署经验分享" target="_blank">LLM模型部署经验分享</a> <span class="text-muted">lewis_kai</span> <a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">语言模型</a> <div>LLM模型部署经验分享作者:大连理工大学李凯首先,你需要选择一个合适的部署平台,这可以是本地服务器、云服务提供商(如AWS、Azure、GoogleCloud等)、边缘设备或者特定的部署服务(如HuggingFaceHub)。在这里我使用的是魔搭平台的云服务器。然后下载你要部署的模型,这里下载的是通义千问。下载并部署玩模型后,我们还可以对模型转换和优化,该文会介绍基于OpenVINO的模型量化实践</div> </li> <li><a href="/article/1885081257105223680.htm" title="探索2025年最流行的移动端前端框架" target="_blank">探索2025年最流行的移动端前端框架</a> <span class="text-muted">程序猿000001号</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>探索2025年最流行的移动端前端框架正文:在当今快速发展的移动互联网时代,选择合适的前端框架对于开发高效、响应迅速的移动应用至关重要。以下是一些目前非常流行且备受开发者青睐的移动端前端UI框架。VantVant是一个轻量、可靠的移动端Vue组件库,适用于各种业务场景。它提供了丰富的组件和良好的文档支持,是许多电商应用的首选。ElementPlusElementPlus是基于Vue3的桌面端组件库,</div> </li> <li><a href="/article/1885067633968082944.htm" title="构建响应式管理后台系统(Python + Django + Bootstrap)" target="_blank">构建响应式管理后台系统(Python + Django + Bootstrap)</a> <span class="text-muted">后端架构魔术骑士</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/bootstrap/1.htm">bootstrap</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a> <div>在本文中,我们将使用Python编程语言结合Django和Bootstrap框架来构建一个响应式管理后台系统。我们将使用Django作为后端框架,处理数据和业务逻辑,并使用Bootstrap作为前端框架,实现用户界面的设计和布局。环境设置和项目创建首先,确保你已经安装了Python和Django。在命令行中运行以下命令来创建一个新的Django项目:$django-adminstartprojec</div> </li> <li><a href="/article/1885052998258847744.htm" title="后台运行vuepress报错:Error: EBADF: bad file descriptor, read" target="_blank">后台运行vuepress报错:Error: EBADF: bad file descriptor, read</a> <span class="text-muted">AGMTI</span> <a class="tag" taget="_blank" href="/search/vuepress/1.htm">vuepress</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1、问题描述:后台运行vuepress时,报错nohupnpmrundoc:dev报错信息....Error:EBADF:badfiledescriptor,readEmitted'error'eventonReadStreaminstanceat:atemitErrorNT(node:internal/streams/destroy:157:8)aterrorOrDestroy(node:int</div> </li> <li><a href="/article/1885052745287790592.htm" title="Linux进阶之HTTP服务篇" target="_blank">Linux进阶之HTTP服务篇</a> <span class="text-muted">Warnex</span> <a class="tag" taget="_blank" href="/search/Linux%E8%BF%9B%E9%98%B6-RHCE/1.htm">Linux进阶-RHCE</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>HTTP服务HTTP简介HTTP的基础配置HTTP服务的默认配置文件`/etc/httpd/conf/httpd.conf`HTTP服务用户自定义配置文件HTTP服务配置之用户认证HTTPS服务的配置基于python的动态HTTP服务HTTP简介HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文</div> </li> <li><a href="/article/1885049590034526208.htm" title="uniapp 实现Toast轻提示!" target="_blank">uniapp 实现Toast轻提示!</a> <span class="text-muted">Rlm*</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/%2B/1.htm">+</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</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>一、在components文件夹下新建Toast文件,包含Toast.vue和index.jsToast.vue{{text}}exportdefault{name:"Toast",props:{isshow:{type:Boolean,},text:{type:String,},},watch:{isshow(val){if(val===true){setTimeout(()=>{this.is</div> </li> <li><a href="/article/1885045931896795136.htm" title="Python编程进阶:深入探索if-elif-else的高级技巧!" target="_blank">Python编程进阶:深入探索if-elif-else的高级技巧!</a> <span class="text-muted">很酷的站长</span> <a class="tag" taget="_blank" href="/search/Python/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中的if-elif-else语句用于根据条件执行不同的代码块。虽然基本用法简单,但在实际应用中,了解一些高级用法和技巧可以使代码更加简洁、可读和高效。本文将详细介绍Python中if-elif-else语句的高级用法,包含示例代码,帮助在编写Python程序时更好地控制程序逻辑。基本用法在介绍高级用法之前,先回顾一下if-elif-else语句的基本</div> </li> <li><a href="/article/1885042908059463680.htm" title="day1-ES6学习基础语法" target="_blank">day1-ES6学习基础语法</a> <span class="text-muted">clock的时钟</span> <a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><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> <div>title:day1-ES6学习基础语法date:2025-01-1512:00:00tags:-前端categories:-前端ES6#一认识:什么是ES6?ES6,全称ECMAScript2015,是JavaScript语言的一个重要版本,对语言进行了许多重大改进和新增功能。ES6的引入极大地提升了JavaScript的可用性、可读性和开发效率*ECMAScript是由ECMA国际标准化组织制</div> </li> <li><a href="/article/1885041270238277632.htm" title="一个简单的自适应html5导航模板" target="_blank">一个简单的自适应html5导航模板</a> <span class="text-muted">很酷的站长</span> <a class="tag" taget="_blank" href="/search/html5%E4%B8%93%E9%A2%98/1.htm">html5专题</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/css3/1.htm">css3</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一个简单的HTML导航模板示例,它包含基本的导航栏结构,同时使用了CSS进行样式美化,让导航栏看起来更美观。另外,还添加了一些JavaScript代码,用于在移动端实现导航菜单的展开和收起功能。PHP网址导航模板body{font-family:Arial,sans-serif;margin:0;padding:0;background-color:#f4f4f4;}header{backgrou</div> </li> <li><a href="/article/1885025140501180416.htm" title="一文大白话讲清楚webpack进阶——8——Module Federation" target="_blank">一文大白话讲清楚webpack进阶——8——Module Federation</a> <span class="text-muted">16年上任的CTO</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><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><a class="tag" taget="_blank" href="/search/%E6%A8%A1%E5%9D%97%E8%81%94%E9%82%A6/1.htm">模块联邦</a><a class="tag" taget="_blank" href="/search/Federation/1.htm">Federation</a> <div>文章目录一文大白话讲清楚webpack进阶——8——ModuleFederation1.啥是ModuleFederation2.这里讲两个基础概念3.容器应用配置4.远程应用配置5.模块使用5.ModuleFederation好在哪里6.ModuleFederation实战一文大白话讲清楚webpack进阶——8——ModuleFederation1.啥是ModuleFederationModul</div> </li> <li><a href="/article/1885023498305335296.htm" title="基于Python的Selenium详细教程总结(极简版)" target="_blank">基于Python的Selenium详细教程总结(极简版)</a> <span class="text-muted">weixin_41663997</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</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的Selenium详细教程总结一、PyCharm安装配置Selenium使用环境:Windows11,Python3.10.5,PyCharm2022.1.3,Selenium4.3.0需要技术:Python,HTML,CSS,JavaScriptSelenium安装:查看已安装的Python包:piplist安装Selenium4.3.0:pipinstallselenium==</div> </li> <li><a href="/article/1885019463141617664.htm" title="「译」2024 年的 5 个 JavaScript 安全最佳实践" target="_blank">「译」2024 年的 5 个 JavaScript 安全最佳实践</a> <span class="text-muted">泯泷</span> <a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/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/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/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>链接:https://thenewstack.io/5-javascript-security-best-practices-for-2024/作者:AlexanderT.Williams原标题:5JavaScriptSecurityBestPracticesfor2024网络安全已成为一个瞬息万变的战场,JavaScript应用程序的安全性也不例外。Web应用程序已成为黑客试图获取敏感数据和财务</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>