使用next.js服务端渲染经历

上周末的时候打算把自己的网站从vue的ssr转换为react的ssr,鉴于之前在vue中是用的原生的ssr,这次想在react中试试框架,所以首选的就是next.js。 第一次用next.js,根据官方文档来实现实现即可,但是遇到了一些问题,主要是跟store相关的,在vue中我用的是vuex,数据的全都是存储在vuex,相应主要需要数据的话就是在asyncData方法中调用,然后存在store,然后在页面就根据store的值来进行渲染。大致流程如下图 本次迁移出了基础的将vue组件转换为react组件外,重点的部分就是将原逻辑中使用vuex数据这一部分迁移至react的context中。 据我了解,目前nextjs的数据获取是需要在page页export出一个getStaticProps的方法,官方的示例是 export async function getStaticProps(context) { const res = await fetch(`https://…/data`) const data = await res.json() if (!data) { return { notFound: true, } } return { props: { data }, // will be passed to the page component as props } } 上面的return的props里面的数据会作为props传递给page页面。 按照vue中的逻辑,我需要getStaticProps方法中将请求到的数据存入至context,但是问题来了。。 getStaticProps里面并不能使用hooksuseContext,这并不符合hooks的使用规范。。。 怎么弄呢?放弃hooks改用class? Read more…

通过php7.4.13源码安装gd扩展

因为之前安装php是采用的源码编译安装,当时的编译参数是 ./configure –prefix=/usr/local/php –enable-fpm –with-fpm-user=nginx –with-fpm-group=nginx –enable-mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd –enable-mysqlnd-compression-support –with-iconv-dir –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir –enable-xml –disable-rpath –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –with-curl –enable-mbregex –enable-mbstring –enable-intl –with-mcrypt –with-libmbfl –enable-ftp –with-gd –enable-gd-jis-conv –enable-gd-native-ttf –with-openssl –with-mhash –enable-pcntl –enable-sockets –with-xmlrpc –enable-zip –enable-soap –with-gettext –disable-fileinfo –enable-opcache –with-pear –enable-maintainer-zts –with-ldap=shared –without- 当时有这个提示 也就是这几个参数是无效的,可能是我参考的文章有的老了或者不匹配吧。 上传图片的时候收到一下报错 其实并不是上传的图片过大的问题,图片并不大,并且之前已经调整过max_postfile_size的大小了。 Read more…

道招网主机切换至腾讯云

去年把主机从之前的搬瓦工迁移到国内,选择的是国内的阿里云。 当初是12月份做活动的时候买的,首单都是比较优惠的。 现在差不多一年了,续费就贼贵了,大家都知道的套路啊。 另外我对现在的阿里云主机不满意,老是提示cpu运行过高啊,再就是打开网站速度并不快,感觉机器不行,带宽好样用的是默认的1M吧。 最近11月份腾讯云做活动,想顺便把网站迁移过来。 首单优惠力度不错,1年70元,3年就198元,只可以最多买3年啊,不然我可以多屯几年的。 这次没有选择云主机,用的是什么轻量应用服务器,对我来说没啥差别,我这网站也够轻量的。 控制台可以控制的东西不多,粗略的看了下,可能升级硬件、带宽什么的可能不那么方便。 我就知道现在网站打开速度嗖嗖嗖的,自己也敢放心的在主机上部署点其它项目了。

docker安装php nginx mysql容器化记录

建议第一步应该先安装mysql,因为后面的php很可能是需要连接mysql的,然后nginx是需要转发.php文件给php-fpm的 新建nginx的配置文件 /root/website/nginx/conf/conf.d/www.conf server { listen 80; server_name localhost; #charset koi8-r; root /root/website/daozhao.com; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { root /root/website/daozhao.com; #fastcgi_pass unix:/sock/www.sock; // 需要用sock连接时使用 fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name; #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; // 不可用$document_root fastcgi_param SCRIPT_NAME $fastcgi_script_name; Read more…

centos8以源码方式安装php7.4

学习学习源码安装挺好的。 本文主要参考、学习自https://www.cnblogs.com/alliancehacker/p/12255445.html 感谢原作者 下载源码 地址 https://www.php.net/distributions/php-7.4.13.tar.bz2 # 下载 wget https://www.php.net/distributions/php-7.4.13.tar.bz2 –no-check-certificate # 解压 tar –bzip -xvf ./php-7.4.13.tar.bz2 # 剪切至通用位置 mv php-7.4.13.tar.bz2 /usr/local/php 安装编译工具 yum -y install gcc gcc-c++ yum -y install libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel libicu-devel freetype-devel openldap-devel openldap openldap-devel 创建用户组 方便和nginx使用 groupadd nginx useradd -g nginx nginx 编译参数含义(可选) Read more…

使用ssh访问远程代码仓库

背景知识 公司一般要求多久就必须修改密码,此时使用ssh的优势就出来了。只要不删除ssh的密钥,修改账号的密码不受影响的。 ssh的公钥太长了,我们一般使用它的指纹来验证更加方便点 公钥一般是这样 它的指纹一般是这样,确实方便很多 ssh相关信息在 ~/.ssh文件内 配置ssh访问 生成密钥 一般公司的代码使用内网gitlab,自己的代码使用github ssh-keygen -t rsa -C "注册的gitlab邮箱" -f ~/.ssh/gitlab_rsa ssh-keygen -t rsa -C "注册的github邮箱" -f ~/.ssh/github_rsa 此时会生成下列文件 github_rsa(密钥)、github_rsa.pub(公钥) github_rsa(密钥)、github_rsa.pub(公钥)。 配置~/.ssh/config文件 只需配两项,其他参数默认即可 Host github HostName github.com IdentityFile ~/.ssh/github_rsa Host gitlab HostName gitlab.com IdentityFile ~/.ssh/gitlab_rsa 添加新增的rsa到名字列表 这一步很重要,不然会找不到个性化的rsa默认使用系统的rsa ssh-add ~/.ssh/gitlab_rsa ssh-add ~/.ssh/github_rsa 我们可以通过ssh-add -l查看当前已经添加的rsa的ssh的指纹 将公钥的字符串(即github_rsa.pub和github_rsa.pub的内容)复制添加到GitHub和gitlab的SSH Read more…

富文本编辑器wangEditor迁移CKEditor前后效果对比

一、背景 富文本编辑器wangEditor的工具栏如图所示 富文本编辑器CKEditor4工具栏如图所示 二、wangEditor编辑器存在问题 1. 字号和字体设置不友好 客服反馈无法快速通过工具栏图标找到设置字号、字体的功能 老版编辑器设置字体(或字号)与许多主流编辑器及Office软件操作有所不同,不支持先设置字体(或字号)再进行输入文字,只能先选中目标文字,再设置字体(或字号)。 2. 无法满足后期功能扩展 2.1 未使用模块化思维组织源代码 全部代码都在一个文件里面。 2.2 没有自己的事件机制 不易控制同一事件不同回调之前的优先级、同类回调函数的取消等,比如扩展粘贴场景时,可能需要避免兼容之前已有的回调。 2.3 没有对编辑器内容的插入过程的控制流程 无法在编辑器setData的过程中对原始数据进行修改、过滤等操作。 三、迁移成新版编辑器CKEditor4的优点 1. 能平稳迁移 CKEditor4天生支持将编辑区域嵌套iframe中,与老版本编辑器改造后效果一致,符合原有项目中的样式隔离要求。 2. 内置插件符合业务场景 有格式刷插件 表格插件支持通过右键菜单调整表格 3. 容易扩展 3.1 内置插件机制 可将不同的业务需求写成独立的插件。 3.2 内置事件机制 能设置事件响应的优先级,控制回调执行顺序,干预和调整默认执行结果。 3.3 通过配置项控制getData和setData 可以通过配置项组合成不同的filter,对编辑器内容和设置的过程进行控制。 四、迁移前后效果对比 1. 支持格式刷 2. 表格粘贴效果更接近复制源样式 复制源 wangEditor编辑器粘贴效果 CKEditor4粘贴效果 3. 支持调整表格 支持对编辑器中的表格进行调整(暂未开放) 4. Read more…

CKEditor系列(四)支持动态多语言i18n

多语言文件结构 先看下CKEditor4的多语言文件长什么样子 //src/lang/zh-cn.js CKEDITOR.lang[ 'zh-cn' ] = { editor: '所见即所得编辑器', common: { editorHelp: '按 ALT+0 获得帮助', keyboard: { 8: '退格键', }, } }; 也就是直接将对应的语言值提前写入到文件中去。 使用多语言变量 有时候公司会有自己的多语言平台,公司项目实现多语言语言将它改成这样才行 //src/lang/zh-cn.js CKEDITOR.lang[ 'zh-cn' ] = { editor: window.i18n['ck4.editor'], common: { editorHelp: window.i18n['ck4.common.editorHelp'], keyboard: { 8: window.i18n['ck4.common.keyboard'], }, } }; 然后我们再根据项目中的语言来控制对应的window.i18n里面的值。 为了让CKEditor的更方便独立管理,我们有时需要将它独立成一个项目。这时候CKEditor这个项目在打包的时候,其实很可能是没有window.i18n的,及时有也不行(以/src/lang/zh-cn.js里面的editor为例),我们需要的是让它的value为window.i18n[‘ck4.editor’],而不是它当前的值所见即所得编辑器,因为我们需的是个动态的变量,而不是当前某个静态的字符串。 将字符串替换成"变量" 因为我们直接简单JavaScript的话不容直接将一个变量作为value给一个对象,所以想到了可以借助于babel这样的工具,在它的眼里,一个js文件里面的值都只是字符串,所谓的变量也只是稍微有点“特殊”而已。 我们可以将自己多语言文件//src/lang/zh-cn.js简单改造后,再解析成AST(抽象语法树),然后再进行后续操作。 Read more…

CKEditor系列(三)粘贴操作是怎么完成的

在上一篇文章CKEditor系列(二)事件系统是怎么实现的中,我们了解了CKEditor中事件系统的运行流程,我们先简单回顾下: 用户注册回调函数时可以指定优先级,值越小的优先级越高,默认是10 系统会根据用户的传参组装成系统规范的回调函数,供后续执行 执行回调函数时可以将取消事件和阻止事件,不让其它监听该事件的回调函数执行。 当插件希望对paste事件进行响应,一般有两种方式可供选择。 直接监听’paste’事件 默认情况下,插件clipboard插件是监听paste事件最多的。 我们可以看到里面多次出现类似这样的代码 // plugins/clipboard/plugin.js editor.on( 'paste', function( evt ) { }) 我们可以看到里面有几个优先级priority 为1回调 处理粘贴图片的场景 将png、jpg、gif图片的内容base64信息赋值给evt.data.dataValue。 editor.on( 'paste', function( evt ) { var dataObj = evt.data, data = dataObj.dataValue, dataTransfer = dataObj.dataTransfer; // If data empty check for image content inside data transfer. https://dev.ckeditor.com/ticket/16705 // Read more…