- 服务
1 | # 查看Docker版本信息 |
- 镜像
1 | # 列出镜像 |
- 容器
1 | # 列出本机运行的容器 |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
1 | # 查看Docker版本信息 |
1 | # 列出镜像 |
1 | # 列出本机运行的容器 |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
服务器厂商每年都会搞促销活动,但是促销只针对新买的服务器,而之前买的服务器续费就没有促销。这样就导致,旧的服务器到期了就不能用了,上面部署的服务都要迁移到新的服务器。
服务器选Debian
root
密码1 | passwd |
1 | useradd -m zyf |
1 | # 本地生成公钥、私钥 |
root
登录1 | vi /etc/ssh/sshd_config |
1 | # Add Docker's official GPG key: |
1 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
Gitea
是一个自己托管的 Git 服务程序。他和GitHub
, Bitbucket
或Gitlab
等比较类似。他是从Gogs 发展而来,Gitea
的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。
Gitea
在其Docker Hub
组织内提供自动更新的Docker
镜像。可以始终使用最新的稳定标签或使用其他服务来更新Docker
镜像。
1 | sudo apt-get update |
Docker
的官方GPG
密钥:1 | sudo install -m 0755 -d /etc/apt/keyrings |
1 | echo \ |
1 | sudo apt-get update |
Docker Engine
、containerd
和Docker Compose
:1 | sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
最简单的设置只是创建一个卷和一个网络,然后将gitea/gitea:latest
镜像作为服务启动。创建一个类似gitea
的目录,并将以下内容粘贴到名为docker-compose.yml
的文件中。请注意,该卷应由配置文件中指定的UID/GID
的用户/组拥有。如果您不授予卷正确的权限,则容器可能无法启动。另请注意,标签 :latest 将安装当前的开发版本。对于稳定的发行版,您可以使用 :1 或指定某个发行版,例如 1.19.0-rc1。
1 | version: "3" |
要将Gitea
与MySQL
数据库结合使用,请将这些更改应用于上面创建的docker-compose.yml
文件。
1 | version: "3" |
要使用命名卷而不是主机卷,请在docker-compose.yml
配置中定义并使用命名卷。此更改将自动创建所需的卷。您无需担心命名卷的权限;Docker
将自动处理该问题。
1 | version: "3" |
要基于docker-compose
启动此设置,请执行docker-compose up -d
,以在后台启动Gitea
。使用docker-compose ps
将显示 Gitea 是否正确启动。可以使用docker-compose logs
查看日志。
要关闭设置,请执行docker-compose down
。这将停止并杀死容器。这些卷将仍然存在。
注意:如果在 http 上使用非 3000 端口,请更改app.ini
以匹配LOCAL_ROOT_URL = http://localhost:3000/
。
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
现代化的工程项目搭建,已经不仅仅满足于可以用了,更多要求规范使用。为实现这已目的,项目搭建离不开Typescript、Eslint、prettier的配置。
执行npm init -y
命令生产package.json
文件
typescript
npm install typescript --save-dev
@types/node
npm install @types/node --save-dev
tsconfig.json
文件npx tsc --init
,常见配置见tsconfig配置1 | { |
ts-node
npm install ts-node --save-dev
, ts-node可以运行时解析ts
文件,无需转换成js运行。nodemon
nodemon.json
文件1 | { |
package.json
中配置scripts
命令1 | "build": "tsc", |
Eslint
npx eslint --init
,然后根据自己需求选择配置.eslintrc.js
文件.eslintrc.js
文件是配置文件,如果某些想忽略,可以新建文件.eslintignor
,写入想要忽略的文件路径npm install eslint-config-prettier eslint-plugin-prettier --save-dev
安装 eslint-config-prettier、eslint-plugin-prettier即可.eslintrc.js
文件1 | extends: [..., 'plugin:prettier/recommended'], |
prettier
配置1 | module.exports = { |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
官网文档:https://docs.docker.com/
官方仓库:https://hub.docker.com/
Docker 包括三个基本概念:
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
GraphQL既是一种用于API的查询语言也是一个满足你数据查询的运行时。 GraphQL对你的API中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
GraphQL官网:https://graphql.org
GraphQL中文文档:https://graphql.cn
Apollo GraphQL
:https://www.apollographql.com/docs
GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。
一个 GraphQL 服务是通过定义类型和类型上的字段来创建的,然后给每个类型上的每个字段提供解析函数。例如,一个 GraphQL 服务告诉我们当前登录用户是 me,这个用户的名称可能像这样:
1 | type Query { |
一并的还有每个类型上字段的解析函数:
1 | function Query_me(request) { |
一旦一个 GraphQL 服务运行起来(通常在 web 服务的一个 URL 上),它就能接收 GraphQL 查询,并验证和执行。接收到的查询首先会被检查确保它只引用了已定义的类型和字段,然后运行指定的解析函数来生成结果。
例如这个查询:
1 | { |
会产生这样的JSON结果:
1 | { |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
Redux 是 JavaScript 状态容器,提供可预测化的状态管理。
Redux官网:https://redux.js.org/
Redux中文文档:https://cn.redux.js.org/
react-redux官网:https://react-redux.js.org/
Redux视频:https://egghead.io/courses/getting-started-with-redux
全局引入react-redux
1 | import React from 'react' |
组件中使用react-redux
1 | import { connect } from 'react-redux' |
redux-thunk就是redux的中间件,中间件就是你可以在收到请求和返回请求之间做一些操作。
github地址:https://github.com/reduxjs/redux-thunk
用法,在store.js
文件中:
1 | import { createStore, applyMiddleware } from 'redux'; |
redux-thunk最重要的思想,就是可以接受一个返回函数的action creator。如果这个action creator 返回的是一个函数,就执行它,如果不是,就按照原来的next(action)执行。
1 | export function addCount() { |
基本用法:
1 | import React from 'react' |
基本用法:
1 | import React from 'react' |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
next.js
是一个非常棒的轻量级的react
同构框架,使用它可以快速的开发出基于服务端渲染的react
应用。
Nextjs官网:https://nextjs.org/
Nextjs官方demo:https://github.com/zeit/next.js/tree/canary/examples
Nextjs中文文档:https://nextjs.frontendx.cn/
官方文档:https://nextjs.org/docs#routing
页面中直接跳转用法:
1 | import Link from 'next/link' |
js方法中跳转:
1 | import Router from 'next/router' |
官方文档:https://nextjs.org/docs#dynamic-import
因为Nextjs代码跑起来会走两套环境,分别是客户端和服务端环境,客户端环境和常规react
开发一样,服务端环境就比较麻烦,window
,localStorage
,navigator.userAgent
这些就会在服务端报undefined
错误。所以需要控制好代码有哪些是在两个环境通用,哪些只能在客户端环境运行。
比较常见的就是视频播放,视频播放器即不需要也没办法在服务端渲染,那么如何控制它只在客户端渲染?Nextjs提供了Dynamic Import
方法来处理该问题。
1 | import dynamic from 'next/dynamic' |
官方文档:https://nextjs.org/docs#custom-configuration
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
JavaScript是单线程语言,但是js中有很多任务耗时比较长,比如ajax请求,如果都按照顺序进行,往往会出现浏览器无响应的情况,所以就需要异步的形式。JS中所有的任务可以分为两种:同步任务和异步任务。
同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务:不进入主线程,而进入任务队列中的任务,只有任务队列通知主线程,某个异步任务可以执行了,这个任务才会进入主线程执行。
事件循环(Event Loop):只有执行栈中的所有同步任务都执行完毕,系统才会读取任务队列,看看里面的异步任务哪些可以执行,然后那些对应的异步任务,结束等待状态,进入执行栈,开始执行。
回调函数本身是我们约定俗成的一种叫法,我们定义它,但是并不会立即执行它,它最终在其他地方执行了。
回调地狱:
promise对象的构造函数语法为:
1 | let promise = new Promise(function(resolve, reject) { |
它的参数resolve
和reject
是JavaScript本身提供的回调。我们的代码仅在执行程序内部。当代码执行完后,它应用调用以下回调之一:
Promise.then
相当于执行callback,不过比起callback的嵌套模式,Promise.then().then().then()...
的链式写法看起来更直观和美观。
catch
,finally
的用法相当于try...catch...finally
假如,一个页面中的很多方法都依赖于一个异步函数值的结果,又不想把写好的许多方法放到Promise.the
中处理,这个时候你急切得需要一个把异步函数转换成同步函数处理的方式,这个时候async/await
方法应运而生。
1 | let promise = new Promise(function(resolve, reject) { |
等价于
1 | async function do() { |
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.
推送通知 ( Push Notification )或者也可以称作推播,有智慧手机的人我想应该非常熟悉,尤其是App盛行的时期几乎每只App都会有推送通知功能,这也是恶梦的开始,你会发觉在大半夜里你的手机会三不五时地叫你起床,所以现在的手机几乎都内建了勿扰模式,让使用者可以设定每天的某个时段可以封锁特定的讯息通知,甚至现在的系统都可以让使用用决定App允许那些权限。
推送通知就像一把双刃剑,懂得善用它可以提升用户体验,反之,若滥用它则会让使用者观感不好。
这个网站可以让你体验一下pwa推送,可以在pc和手机上分别体验。
链接:https://web-push-book.gauntface.com/demos/notification-examples/
参考链接:https://developers.google.com/web/fundamentals/codelabs/push-notifications/?hl=zh-cn
练习源码:
1 | git clone https://github.com/GoogleChrome/push-notifications.git |
模拟推送服务器:https://web-push-codelab.glitch.me/
实际应用中,需要搭建推送服务负责想客户端推送消息
网络推送库:https://github.com/web-push-libs/
nodejs使用的web-push库:https://www.npmjs.com/package/web-push
推送服务的流程类似于,自己搭建的推送服务发送通知到浏览器厂商搭建的推送服务,浏览器厂商搭建的推送服务识别后发送到对应的浏览器客户端。这个过程依赖浏览器厂商搭建的推送服务。目前对pwa推送规范支持最好的有chrom浏览器和firefox浏览器,因为墙的原因,chrome浏览器的推送服务无法送达,但firefox没有任何问题。所以想使用pwa推送的话,建议用户使用firefox浏览器就可以了。
原文链接: http://yunzaifei.github.io/index.html
版权声明: 转载请注明出处.