Next.js项目实战踩坑指南(笔记)


Posted in Javascript onNovember 29, 2018

前言

github: https://github.com/code-coder/next-mobile-complete-app

已经用Next.js快两个月了,项目已经提测了,这里总结一下开发过程中,以及在部署的时候遇到一些棘手的问题。

疑难杂症

1. 移动端overflow:auto,ios滚动卡顿

解决方案: 主容器增加样式-webkit-overflow-scrolling: touch;

2. dev mode路由跳转后样式丢失

原因:dev下样式根据页面动态加载,浏览器缓存文件styles.chunk.css造成样式不更新。

解决方案: 利用版本号强制重载样式文件

示例1:

// 在Layout组件中
<Head>
  <title>{title}</title>
  {process.env.NODE_ENV !== 'production' && (<link rel="stylesheet" type="text/css" href={'/_next/static/css/styles.chunk.css?v=' + Router.route} />)}
</Head>

示例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 解析。整个流程如下图所示:

Next.js项目实战踩坑指南(笔记)

通过NODE_ENV环境变量来配置开发和生产的地址。

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服务器地址,仅供内网访问
};

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 })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
js动态添加事件并可传参数示例代码
Oct 21 Javascript
浅谈页面装载js及性能分析方法
Dec 09 Javascript
jQuery中first()方法用法实例
Jan 06 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
Oct 31 Javascript
js如何实现淡入淡出效果
Nov 18 Javascript
一款简单的jQuery图片标注效果附源码下载
Mar 22 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 Javascript
jQuery查找节点方法完整实例
Sep 13 Javascript
vue-resource拦截器设置头信息的实例
Oct 27 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 #Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 #Javascript
js实现每日签到功能
Nov 29 #Javascript
Vue.js的复用组件开发流程完整记录
Nov 29 #Javascript
javascript实现考勤日历功能
Nov 29 #Javascript
vsCode安装使用教程和插件安装方法
Aug 24 #Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 #Javascript
You might like
PHP 选项及相关信息函数库
2006/12/04 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
javascript this用法小结
2008/12/19 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
javascript实现禁止右键和F12查看源代码
2014/12/26 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
通过Pandas读取大文件的实例
2018/06/07 Python
python设置值及NaN值处理方法
2018/07/03 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
serialVersionUID具有什么样的特征
2014/02/20 面试题
师范生自荐信范文
2013/10/06 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
《春天来了》教学反思
2014/04/07 职场文书
企业贷款委托书格式
2014/09/12 职场文书
党员剖析材料范文
2014/09/30 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL