摘要:項目實戰踩坑指南移動端,滾動卡頓解決方案主容器增加樣式路由跳轉后樣式丟失原因下樣式根據頁面動態加載,瀏覽器緩存文件造成樣式不更新。跨域及傳遞的問題第一步,登錄成功后服務器返回。第二步,瀏覽器自動緩存,再后續請求中攜帶此。
項目實戰踩坑指南 1. 移動端overflow:auto,ios滾動卡頓
解決方案: 主容器增加樣式-webkit-overflow-scrolling: touch;
2. dev mode路由跳轉后樣式丟失原因:dev下樣式根據頁面動態加載,瀏覽器緩存文件styles.chunk.css造成樣式不更新。
解決方案: 利用版本號強制重載樣式文件
示例1:
// 在Layout組件中{title} {process.env.NODE_ENV !== "production" && ()}
示例2:
// 在_app.js中 import Router from "next/router"; Router.events.on("routeChangeComplete", () => { if (process.env.NODE_ENV !== "production") { const els = document.querySelectorAll("link[href*="/_next/static/css/styles.chunk.css"]"); const timestamp = new Date().valueOf(); els[0].href = "/_next/static/css/styles.chunk.css?v=" + timestamp; } });3、Android 鍵盤彈起窗口會變小,有 flex 或者 position 是 absolute 或者 fixed 布局會變
這里直接把body.height設置為瀏覽器的窗口高度。
doc.body.style.height = docEl.clientHeight + "px";4、跨域及傳遞cookie的問題
第一步,登錄成功后api服務器返回cookie。
跨域訪問要接收cookie,解決辦法也很簡單只需要API服務器根據請求地址設置Access-Control-Allow-Origin的值為請求地址的ip就可以了(測試環境可以動態設置這個ip,生產可以設置指定的域名或者ip地址)。
第二步,瀏覽器自動緩存,再后續請求中攜帶此cookie。
fetch或axois請求都默認不帶cookie,需要通過option配置打開。
- fetch要配置`{ credentials: "include", mode: "cors" }` - axois要配置`axios.defaults.withCredentials=true;`
另外,還可以通過服務器代理走內網訪問api。
以下為我們公司所采用的解決方案:
為了解決跨域以及部署不同服務器需要修改 api 地址的問題,我們使用 前端服務器代理 + dns 解析。整個流程如下圖所示:
通過NODE_ENV環境變量來配置開發和生產的地址。在env-config.js中
const isProd = process.env.NODE_ENV === "production"; process.env.BACKEND_URL = isProd ? "/relative_url" : "http://text.api.com"; process.env.BACKEND_URL_SERVER_SIDE = isProd ? "http://bff.api.com" : "https://prod.api.com"; module.exports = { "process.env.BACKEND_URL": process.env.BACKEND_URL, // 客戶端渲染請求,是個相對地址,在前端服務器被代理到API服務器 "process.env.BACKEND_URL_SERVER_SIDE": process.env.BACKEND_URL_SERVER_SIDE, // 服務端渲染請求,是API服務器地址,僅供內網訪問 "process.env.LOCATION_PREFIX": process.env.LOCATION_PREFIX };5、服務端渲染時帶 cookie 請求的問題
這里用到一個插件叫nookies。
在_app.js中全局解析cookies注入ctx:
static async getInitialProps({ Component, ctx }) { let pageProps = {}; let cookies = {}; if (ctx.isServer) { cookies = parseCookies(ctx); } if (Component.getInitialProps) { pageProps = await Component.getInitialProps({ ctx, cookies }); } return { pageProps }; }
然后就可以通過頁面請求:
static async getInitialProps({ ctx }) { const { store, req, isServer, cookies } = ctx; store.dispatch(setNav({ navTitle: "Home", isHome: true })); store.dispatch(getDataStart({ settings: { isServer, cookies } })); }
在proxyFetch中就會根據isServer的值來分辨是服務端API請求還是客戶端API請求。服務端請求會把cookies寫入Fetch的header中。
const prefix = isServer ? process.env.BACKEND_URL_SERVER_SIDE : process.env.BACKEND_URL; isServer && (this.headers["cookie"] = "EGG_SESS=" + cookies["EGG_SESS"] + ";";) // fetch核心 fetch(prefix + url, { headers: this.headers, ...this.init, ...options })6、需要部署到域名下的二級目錄如:www.example.com/project
在某些公司的業務場景下:如共享cookie等需求,則需要將項目部署到域名的一個二級目錄下。
這時需要修改配置文件next.config.js:
module.exports = withSass({ assetPrefix: process.env.NODE_ENV === "production" ? "/project" : "" });
這個配置文件是修改next在build的時候指向的根目錄地址。但是由于Next.js的路由根目錄為pages,客戶端的路由跳轉后,生成的window.location.href地址會忽略二級目錄。
例如:假設我們的服務器地址為http://www.example.com/project,然后在首頁使用Router.push("/login")跳轉登錄頁面,瀏覽器會直接追加到域名+端口后生成http://www.example.com/login的地址。而我們實際的服務器地址是http://www.example.com/projec...,跳轉后再刷新頁面會報404。
這時候需要使用next提供的as參數(Router.push的第二個參數,link標簽的as屬性)。二級目錄的地址可以寫在process.env中。
每次使用路由時都要加上as參數,這時可以封裝Link組件和Router來減少多余代碼。
CustomLink.js文件
import React, { Component } from "react"; import Link from "next/link"; export default class CustomLink extends Component { render() { const { href, as: asHref, children, ...props } = this.props; return ( {children} ); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/99534.html
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報率高。馬上就十一國慶假期了,給小伙伴們分享下,從小白程序員到大廠高級技術專家我看過哪些技術類書籍。 大家好,我是...
摘要:接下來我們運行一下。因此,我們需要新建一個目錄。接下在再重新啟動一下試試。因為默認開啟服務端渲染,也就無需我們進行任何的配置,因此現在這個極其簡單的應用就是一個。代碼地址參考文章服務端渲染與打造高可靠與高性能的同構解決方案 寫在前面 說實話,我個人還是覺得文筆越來越不錯了,以前的文章都是一個問題悶到天黑,文章寫的有點亂由于文章過于龐大導致不是一氣呵成的,思路有時候會很混亂。所以我也準備...
摘要:踩坑入門系列一二添加三目錄重構再談路由陸續更新個人對于腳手架的有一種執念,如果搭建出來就是一個首頁標簽跳轉,實在不是我這個處女座的風格,因此第二步我就想引用框架,相信很多使用的開發者用的也都是這個框架吧。 Next.js踩坑入門系列 (一) Hello Next.js (二) 添加Antd && CSS (三) 目錄重構&&再談路由 陸續更新... 個人對于腳手架的UI有一種執...
摘要:圍繞以太坊的開發生態是目前相對最成熟的,比如有開發框架,有智能合約在線集成開發環境,還有專設的開發者問答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說,時代拋棄我們的時候連聲再見都不會說,馬云說對于新興事物,絕大多數人是看不見、看不起、看不懂、來不及。自從學完 Coursera 上的 Crypto...
摘要:圍繞以太坊的開發生態是目前相對最成熟的,比如有開發框架,有智能合約在線集成開發環境,還有專設的開發者問答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說,時代拋棄我們的時候連聲再見都不會說,馬云說對于新興事物,絕大多數人是看不見、看不起、看不懂、來不及。自從學完 Coursera 上的 Crypto...
閱讀 750·2021-07-25 21:37
閱讀 3663·2019-08-30 15:55
閱讀 2579·2019-08-30 15:54
閱讀 1728·2019-08-30 15:44
閱讀 3129·2019-08-30 15:44
閱讀 866·2019-08-30 15:43
閱讀 1035·2019-08-29 15:36
閱讀 3046·2019-08-29 10:58