- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的工作任务是提高项目的绩效。目前,Google Lighthouse 的分数有波动,但总的来说它的分数不是很高,因此我们正在努力弄清楚如何提高它的性能,以便能够向我们的领导层炫耀。
我们的项目将整个 Gatsby 网站加载为一个 JavaScript 包。这从站点创建了一个单页应用程序,允许通过 JavaScript 快速加载新页面。但是对于像我们的 WordPress 网站这样大的网站,这会产生一个以兆字节为单位的非常大的包。这个大包显着降低了页面速度。
我不太确定如何解决这个 bundle.js 的卸载问题,但我发现了一个关于这个主题的有趣文档 https://www.gatsbyjs.org/docs/how-code-splitting-works/
虽然我不完全理解这些文档,但我相信我编辑了这个 async-requires.js 文件以包含多个导出组件行,这应该会导致多个 javascript 包而不是主要的大包。也许如果有多个 js 包,网站加载速度会更快,因为它不仅仅是一个瓶颈。因此,页面可以加载它需要呈现的特定包,并异步加载它不需要的包。
下面是一些我认为与手头任务相关的代码。在谈到 gatsby 时,我仍然是一个初学者,所以我不确定我可以在这里进行哪些更改以实现更好的性能。
谢谢你的帮助。
异步要求.js
const preferDefault = m => m && m.default || m
exports.components = {
"component---src-templates-page-js": () => import("../src/templates/page.js" /* webpackChunkName: "component---src-templates-page-js" */),
"component---cache-dev-404-page-js": () => import("dev-404-page.js" /* webpackChunkName: "component---cache-dev-404-page-js" */),
"component---src-pages-404-js": () => import("../src/pages/404.js" /* webpackChunkName: "component---src-pages-404-js" */)
}
src/templates/pages.js
import React from 'react'
import PropTypes from 'prop-types'
import Helmet from 'react-helmet'
import Layout from '../layouts/layout'
import AnalyticsContext, { analyticsEvents } from '../../util/AnalyticsContext'
import Banner from '../WPComponents/Banner'
import CheckmarkList from '../WPComponents/CheckmarkList'
import CopyGrid from '../WPComponents/CopyGrid'
import Drawers from '../WPComponents/Drawers'
import Explainers from '../WPComponents/Explainers'
import Featured from '../WPComponents/Featured'
import Form from '../WPComponents/Form'
import Hero from '../WPComponents/Hero'
import Pricing from '../WPComponents/Pricing'
import PromoApp from '../WPComponents/PromoApp'
import PromoCircles from '../WPComponents/PromoCircles'
import PromoSlider from '../WPComponents/PromoSlider'
import ReachAnimation from '../WPComponents/ReachAnimation'
import Resources from '../WPComponents/Resources'
import SimpleExplainer from '../WPComponents/SimpleExplainer'
import SimpleMedia from '../WPComponents/SimpleMedia'
import Solution from '../WPComponents/Solution'
import Testimonials from '../WPComponents/Testimonials'
import Disclaimer from '../WPComponents/Disclaimer'
const PageTemplate = props => {
const { pageContext, data, location } = props
const components = (pageContext.acf && pageContext.acf.section_page) || []
let helmet
const { yoast } = pageContext
if (yoast) {
const {
title,
metadesc,
opengraph_title,
opengraph_description,
opengraph_image,
canonical,
} = yoast
helmet = (
<Helmet
title={title || ' '}
meta={[
{
name: 'robots',
content: 'noindex',
},
{
name: 'description',
content: metadesc || ' ',
},
{
property: 'og:title',
content: opengraph_title || ' ',
},
{ property: 'og:site_name', content: title || ' ' },
{ property: 'og:type', content: 'website' },
{
property: 'og:description',
content: opengraph_description || ' ',
},
{
property: 'og:image',
content: opengraph_image && opengraph_image.source_url,
},
canonical
? {
property: 'og:url',
content: canonical || ' ',
}
: {},
]}
/>
)
}
return (
<AnalyticsContext.Provider
value={{
...analyticsEvents,
}}
>
<Layout location={location}>
{helmet}
{components.map(component => {
switch (component.__typename) {
case 'WordPressAcf_hero':
return <Hero key={component.id} {...component} />
case 'WordPressAcf_featured':
return <Featured key={component.id} {...component} />
case 'WordPressAcf_solution':
return <Solution key={component.id} {...component} />
case 'WordPressAcf_resources':
return <Resources key={component.id} {...component} />
case 'WordPressAcf_simplemedia':
return <SimpleMedia key={component.id} {...component} />
case 'WordPressAcf_promoapp':
return <PromoApp key={component.id} {...component} />
case 'WordPressAcf_reach_animation':
return <ReachAnimation key={component.id} {...component} />
case 'WordPressAcf_promoslider':
return <PromoSlider key={component.id} {...component} />
case 'WordPressAcf_promocircles':
return <PromoCircles key={component.id} {...component} />
case 'WordPressAcf_testimonials':
return <Testimonials key={component.id} {...component} />
case 'WordPressAcf_banner':
return <Banner key={component.id} {...component} />
case 'WordPressAcf_explainers':
return <Explainers key={component.id} {...component} />
case 'WordPressAcf_copygrid':
return <CopyGrid key={component.id} {...component} />
case 'WordPressAcf_drawers':
return <Drawers key={component.id} {...component} />
case 'WordPressAcf_simpleexplainer':
return <SimpleExplainer key={component.id} {...component} />
case 'WordPressAcf_disclaimer':
return <Disclaimer key={component.id} {...component} />
case 'WordPressAcf_pricing':
return (
<Pricing key={component.id} {...component} />
)
case 'WordPressAcf_checkmarklist':
return <CheckmarkList key={component.id} {...component} />
case 'WordPressAcf_form':
return <Form key={component.id} {...component} />
default:
console.log('Could not recongize type:', component.__typename)
return
}
})}
</Layout>
</AnalyticsContext.Provider>
)
}
PageTemplate.propTypes = {
pageContext: PropTypes.shape({
acf: PropTypes.object,
media: PropTypes.shape({
edges: PropTypes.array,
}),
}),
}
export default PageTemplate
pageCreators.js
const path = require('path')
const genericPageTemplate = 'src/templates/page.js'
const pageCreator = templatePath => (actions, pageContext) => {
actions.createPage({
component: path.resolve(templatePath),
path: pageContext.pagePath,
context: {
...pageContext,
},
})
}
module.exports = {
createGenericPage: pageCreator(genericPageTemplate),
}
创建页面.js
const { createGenericPage } = require('./pageCreators')
const generatePages = allWordpressPage => {
return allWordpressPage.edges.map(edge => edge.node)
}
module.exports = (data, actions) => {
if (!data) {
console.error('createPages()', 'Error', '`data` is undefined')
throw new Error('Error retrieving data: data is undefined')
}
const { allWordpressPage } = data
const pages = allWordpressPage && generatePages(allWordpressPage)
if (!pages) {
console.error(
'createPages()',
'Error',
'Could not build pages. allWordpressPage was falsy'
)
throw new Error('Error retreiving data: allWordpressPage was falsy')
}
pages &&
pages.forEach(page => {
// skip the 'modules' page
if (page.pagePath === '/modules/') {
return;
}
createGenericPage(actions, page)
})
}
Gatsby Node .js
/**
* Implement Gatsby's Node APIs in this file.
*
* See: https://www.gatsbyjs.org/docs/node-apis/
*/
const fs = require('fs')
const queryAll = require('./util/queryAll')
const createPages = require('./util/createPages')
exports.createPages = ({ graphql, actions }) => {
return graphql(queryAll)
.then(res => {
if (res.errors) {
res.errors.forEach(error => {
console.error('Error:', error.message)
})
}
createPages(res.data, actions)
})
.catch(error => {
console.error('failed to create pages:', { error })
})
}
exports.sourceNodes = ({ actions, schema }) => {
const { createTypes } = actions
const additionalTypeDefs = fs.readFileSync(`type-defs.gql`, {
encoding: `utf-8`,
})
createTypes(additionalTypeDefs)
}
// temporary fix for dev env: https://github.com/gatsbyjs/gatsby/issues/11934#issuecomment-469046186
exports.onCreateWebpackConfig = ({ getConfig, stage }) => {
const config = getConfig()
if (stage.startsWith('develop') && config.resolve) {
config.resolve.alias = {
...config.resolve.alias,
'react-dom': '@hot-loader/react-dom',
}
}
}
最佳答案
大约 4 个月前我对此进行了很多研究,这就是我发现的,但下面的一些原因是由于灯塔如何确定 Gatsby 网站上的页面速度的错误,所以一些可能不再正确(例如,在图像上使用 fadeIn={false}
和 loading="eager"
,并使用 a
标签代替 Link
中的 gatsby-link
。如果这些提示之一不再正确,请发表评论或编辑。
使用 gatsby-plugin-preact (大而容易的改变)
使用 <a>
标签而不是 gatsby-link
(现在很可能已修复)
使用 gatsby-plugin-purge-css (删除所有未使用的 CSS。如果您使用的是像 Bootstrap 这样的 CSS 框架,则很有用)
使用 fadeIn={false}
和 loading="eager"
在 Gatsby Images 上,或将淡入的持续时间设置得更短:durationFadeIn={250}
使用 gatsby-plugin-preconnect 预连接到某些第三方网站
如果您有背景图片,请将其拆分为 2 张图片,一张用于首屏,一张用于非首屏(您的页面初始 View 必须在开始时加载较少)
在让 gatsby 优化它们之前手动优化我的“首屏”图像。 This was a website我发现这样做很有帮助,但您也许可以为此找到一个好的开源软件。
仅在用户滚动经过第三方 iframe 后加载它们。例如:
...
const ref = useRef()
const onScreen = useOnScreen(ref, '0px')
let showWidget
if (onScreen){
showWidget = true
}
...
return (
<div ref={ref}>
{showWidget && <ThirdPartyIframe /> }
</div>
)
我读过的其他技巧包括
Using inline styling (尽管 I've heard Gatsby does this automatically )
Using a 301 redirect instead of 307 (如果这适用于您)
未使用 Typography.js
Possibly using an S3 & Cloudfront and not Netlify to host the website
进一步阅读的资源
I created a reddit post在我发布类似内容的地方,我建议阅读下面的评论。 It references this github thread which is pretty popular ,然后我找到了 this post成为线程上最有帮助的人。
此外,我还发布了一些与提高 Gatsby
的灯塔分数相关的问题。项目。有了上面列出的信息,您应该不需要它们,但也许它们会有用,或者您会从中学到一些东西
关于javascript - 加速 Gatsby 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60065177/
我想在我的 iPhone 应用程序中加入线性回归。经过一些搜索,我发现 Accelerate Framework 中的 LAPACK 和 BLAS 是正确的库。但是我很难将加速框架添加到我的 XCod
有什么方法可以加速 JS 脚本(我指的是一些复杂的 DOM 操作,比如游戏或动画)? 最佳答案 真的没有办法真正加快速度。您可以压缩它,但不会快很多。 关于Javascript 加速?,我们在Stac
有时,我必须为一个项目重新导入数据,从而将大约 360 万行读入 MySQL 表(目前是 InnoDB,但我实际上并不局限于这个引擎)。 “加载数据文件...”已被证明是最快的解决方案,但它有一个权衡
在尝试计算加速时,我被卡住了。所以给出的问题是: 问题 1 如果程序的 50% 增强了 2 倍,其余 50% 增强了 4 倍,那么由于增强而导致的整体加速是多少? Hints:考虑增强前(未增强)机器
目前我正在处理实时绘图,但可视化非常慢。我想知道你可以做些什么来加速 Matplotlib 中的事情: 后端如何影响性能?是否有后端 实时绘图比其他人更好吗? 我可以降低分辨率以提高 FPS 吗? 如
我有一个小型测试框架。它执行一个循环,执行以下操作: 生成一个小的 Haskell 源文件。 使用 runhaskell 执行此操作.该程序生成各种磁盘文件。 处理刚刚生成的磁盘文件。 这种情况发生了
这是我的网站:Instant-YouTube 如您所见,加载需要很长时间。在 IE8 及以下甚至有时会导致浏览器崩溃。我不确定是什么原因造成的。可能是 Clicksor 广告,但我认为是 swfobj
是否可以加速 SKSpriteNode? 我知道可以使用 node.physicsBody.velocity 轻松设置速度但是设置它的加速度有多难? 最佳答案 从牛顿第二定律倒推运动:F = m.a您
有没有人有加速 FCKEditor 的技术?是否有一些关键的 JavaScript 文件可以缩小或删除? 最佳答案 在最新版本 (3.0.1) 中,FCKEditor 已重命名为 CKEditor .
我有以下 MySQL 查询,需要一天多的时间才能执行: SELECT SN,NUMBER FROM a WHERE SN IN (SELECT LOWER_SN FROM b WHER
我现在正在开发一款使用加速来玩的游戏。我找到了如何让我的元素移动,但不改变它的“原点”,或者更准确地说,改变加速度计算的原点: 事实上,我的图像是移动的,它的中心是这样定义的: imageView.c
我有一个 mysql 表,其中存储有 4 列的成员消息: message_id(主键,自增) sender_id( key ) receiver_id( key ) 消息内容 我做了很多 SELECT
我在 cuda_computation.cu 中有以下代码 #include #include #include #include void checkCUDAError(const char
我正在使用 BeautifulSoup 在 for 循环中解析数千个网站。这是我的代码片段: def parse_decision(link): t1 = time.time() de
我正在使用 OpenCV 2.4 (C++) 在灰度图像上进行寻线。这涉及一些基本的图像处理步骤,如模糊、阈值、Canny 边缘检测器、梯度滤波器或霍夫变换。我必须在数千张图像上应用寻线算法。 考虑到
当我试图连续生成四次相同的报告时,我刚刚分析了我的报告应用程序。第一个用了 1859 毫秒,而后面的只用了 400 到 600 毫秒。对此的解释是什么?我能以某种方式使用它来使我的应用程序更快吗?报告
当我打开 Storyboard文件时,由于其中包含的 VC 数量,打开它需要 1-2 分钟。加快速度的最佳做法是什么?我们应该将一些 VC 移动到不同的 Storyboard文件中吗?我们是否应该使用
我有一个包含多个页面的 UIPageViewController。每个页面都是相同的 View Controller ,但会跟踪页码并显示 PDF 的正确页面。问题是每个 PDF 页面都需要在 cur
这实际上是两个问题,但它们非常相似,为了简单起见,我想将它们放在一起: 首先:给定一个已建立的 Java 项目,除了简单的代码内优化之外,还有哪些不错的方法可以加快它的速度? 其次:在用Java从头写
我有一个包含 1000 个条目的文档,其格式类似于:
我是一名优秀的程序员,十分优秀!