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 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
firefox下frameset取不到值的解决方法
Sep 06 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 Javascript
js获取页面传来参数的方法
Sep 06 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
JavaScript对象创建模式实例汇总
Oct 03 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
Nov 17 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 Javascript
使用koa2创建web项目的方法步骤
Mar 12 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
PHP分页函数代码(简单实用型)
2010/12/02 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
如何提高数据访问速度
2016/12/26 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
详解利用Angular实现多团队模块化SPA开发框架
2017/11/27 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
公司领导班子对照材料
2014/08/18 职场文书
群教个人对照检查材料
2014/08/20 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
深度学习tensorflow基础mnist
2021/04/14 Python
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
Redis入门教程详解
2021/08/30 Redis