LOADING

加载过慢请开启缓存 浏览器默认开启

耀耀切克闹

npm随笔

前端随笔 2022/9/26

一、npm 安装中的 i、-g、–save、–save-dev、-D、-S的区别

基本说明:

  • i 是 install 的简写
  • -g 是全局安装,不带 -g 会安装在个人文件夹
  • -S 是 --save 的简写,安装包信息会写入 dependencies 中
  • -D 是 --save-dev 的简写,安装包写入 devDependencies 中

dependencies 与 devDependencies:

  • dependencies 生产阶段的依赖,也就是项目运行时的依赖

  • devDependencies 开发阶段的依赖,就是我们在开发过程中需要的依赖,只在开发阶段起作用的

    例如:你写 ES6 代码,需要 babel 转换成 es5 ,转换完成后,我们只需要转换后的代码,上线的时候,直接把转换后的代码部署到生产环境,不需要 bebal 了,生产环境不需要。这就可以安装到 devDependencies ,再比如说代码提示工具,也可以安装到 devDependencies,如果你用了 Element-UI,由于发布到生产后还是依赖 Element-UI,这就可以安装到 dependencies

二、全局安装和本地安装

全局安装:

npm install <pageName> -g//(这里-g是-global的简写)

通过上面的命令行(带-g修饰符)安装某个包,就叫全局安装。通常全局包安装在node目录下的node_modules文件夹。可以通过执行下面几条命令查看node、npm的安装目录和全局包的安装目录。

which node   // 查看node的安装目录
which npm   // 查看npm的安装目录
npm root -g // 查看全局包的安装目录
npm list -g --depth 0 //查看全局安装过的

本地安装:

npm install <pageName> (后面可以加几种修饰符,主要有两种--save-dev和--save)

通过上面的命令行安装某个包,就叫本地安装。包安装在你当前项目文件夹下的node_modules文件夹中。

全局安装的作用:

全局安装的包可提供直接执行的命令(例:gulp -h可以查看gulp定义了什么命令)。 比如gulp全局安装后,可以在命令行上直接执行gulp -v、gulp -h等(原理:全局安装的gulp会将其package.json中的bin命令注入到了全局环境,使得你可以全局执行:gulp xxx命令,这另一个话题了,不深入)。倘若只在本地安装了gulp,未在全局安装gulp,直接执行这些命令会报错。你想要执行相应的命令则可能需要例如:node ./node_modules/gulp/bin/gulp.js -v(查看版本) 这样用一大串命令来执行。因此全局安装就发挥到他的好处了,一个gulp -v就搞定

当然,不是每个包都必须要全局安装的,一般在项目中需要用到该包定义的命令才需要全局安装。比如gulp 执行gulp任务…等,所以是否需要全局安装取决于我们如何使用这个包。全局安装的就像全局变量有点粗糙,但在某些情况下也是必要的,全局包很重要,但如果不需要,最好避免使用。

可以全局安装,那么直接全局安装到处使用就行了,干嘛还需要本地安装?

  1. 如果只是全局安装了而没本地安装,就得require(‘‘) 例:引入一个全局的包可能就是requirt(‘/usr/local/….’)通过全局包的路径引入,这样显然十分的不灵活。如果安装了本地包,那么就可以直接require(‘‘)引入使用。
  2. 一个包通常会在不同的项目上会重复用到,如果只全局安装,那么当某个项目需要该包更新版本时,更新后可能就会影响到其他同样引用该包的项目,因此本地安装可以更灵活地在不同的项目使用不同版本的包,并避免全局包污染的问题。

一个经验法则:要用到该包的命令执行任务的就需要全局安装,要通过require引入使用的就需要本地安装( 但实际开发过程中,我们也不怎么需要考虑某个包是全局安装还是本地安装,因为这一点在该包的官网上一般会明确指出,以上是为了理解全局安装和本地安装)。

参考:node.js - npm(你怕吗) 全局安装与本地安装、开发依赖和生产依赖_个人文章 - SegmentFault 思否

阅读全文

从零开始搭建博客(三)——博客在多台终端同步管理

博客搭建 2022/9/23

前言

我们利用 Hexo 框架在本地搭建了一个精美的博客,可是只能本地访问,要想发布到互联网上,还需要将它部署在网站上。博客的功能只要能阅读文章就够了,因此可以考虑将其部署在提供静态网页托管服务的网站上,许多平台都提供了静态网页托管服务,其中最方便的当然是 GitHub Pages,只需要注册一个账号就可以使用。GitHub Pages的服务器毕竟在国外,如果觉得访问太慢,也可以选择国内功能相似的 Gitee Pages。本篇文章介绍怎样利用 GitHub 提供的免费静态网页托管服务 GitHub Pages 建站。后面我应该还是会选择部署在服务

一、GitHub Pages

GitHub 是世界上最流行的软件源代码托管服务平台,为什么要提供网页托管服务呢?

这是因为一个项目的主页如果只有源码,对新接触的人很不友好,不知从何处下手。虽然已经有了 readme.md 文件,但毕竟不如一个直观的网页来的直接。于是 GitHub 就设计了 Pages 功能,允许用户设计一个图文并茂的网页作为项目首页。

虽然 GitHub Pages 的初衷是提供自定义的项目首页,但是它的玩法不止这一个。因此许多博主都用这个功能来搭建自己的博客,因为它实在是太太方便了。

去GitHub Pages 官网 pages.github ,拉到最后,可以看到官方也推荐使用 GitHub Pages 搭建博客,并且提供了示例教程。

二、GitHub Pages 准备

前提是你拥有一个gitHub账号

1673508844010.png
由于每个 GitHub 账户只能建立一个 GitHub Pages 页面,所以 Repository name 必须填<你的用户名>.github.io,否则就会建立一个普通仓库,GitHub Pages 功能不会生效。比如用户名是jacksparrow,Repository name 这里就填jacksparrow.github.io,不知道用户名是哪个,可以点击页面右上角头像,看到第一行“Signed in as xxx”字样, xxx即为这里的用户名。

Description 填写仓库描述,比如 jacksparrow's blog等,可不填。

注意勾选 Public ,否则 GitHub Pages 功能不会生效。建议勾选 Add a README file,会自动生成一个 readme.md文件。

最后点击Create repository创建仓库。

1673509175671.png
我们可以通过输入网址https://<你的用户名>.github.io,来访问到这个仓库里面的内容。

三、GitHub Pages 发布

我们把自己的博客生成静态 html 网页,提交到这个仓库目录下,就可以在我们的网址看到博客页面了,这就是 Hexo 框架部署博客的原理。当然,对于 Hexo 来说,提交部署只需要几条命令。

四、Hexo+Git+Github博客在多台终端同步管理

此方法利用Git管理Hexo产生的文件,实现在不同的电脑上同步(Github)所需的文件,也可以正常的在不同的Hexo环境里进行相应操作,只要在做完之后同步到Github的仓库里即可。下面具体来说说:

网上基本上都是这个思路:

Github 分支管理Hexo环境目录

主要是通过维护两条git分支来实现,第一个分支是 Gihub 上默认的 master 分支,用于存放发布的博文的静态页面;另外再新建一个分支,比如命名为 Hexo ,通过此分支存放主题、原始的博客文件等等,这些文件才是不同电脑需要同步的文件;当每次修改主题或者新增博文后,先将修改的主题文件(在themes文件夹下)或者新增博客(在source文件夹下),同步到远程的 Hexo 分支,然后在通过 hexo g -d命令发布博文,也就是将新增的博文的静态页面同步到 master 分支。这样通过不同的分支管理不同的文件,实现了多台电脑同步更新博文的功能。!

├── .gitignore
├── .deploy_git
|   ├── ...
|   ├── ...
|   └── ...
├── node_modules
├── public
├── package-lock.json
├── db.json
├── _config.yml
├── package.json
├── scaffolds
├── source
|   ├── _drafts
|   └── _posts
└── themes

其中 .deploy_git、public 两个文件夹下存放的是博客文章的静态页面,通过对比 Github 上博客仓库的master分支可以看到master分支下面的文件结构和 .deploy_git 文件夹下的文件是一致的,这个应该可以判断通过 hexo g -d 发布到 Github 的内容就是 .deploy_git 文件夹下面的文件。其余的文件夹和文件即是Hexo的主题文件、原始的博客文件等,刚在上文提到的Hexo分支,存的即时这些文件

实现方式

创建分支

在PC b,

初始化分支

git clone 仓库地址(自己的仓库地址)

将仓库文件拉取到本地,生成的文件名为 username.github.io;进入username.github.io文件夹,除了 .git 文件夹以外,其他文件全部删除;同时添加.gitnore

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
# 添加git忽略

提交本次修改

git add .
git commit -m “提交说明”
git push origin Hexo

同步分支(PC2上面操作)

git pull拉取远程hexo分支的代码

但是暂时不要提交,先安装hexo环境去

# 安装 hexo 框架
npm install -g hexo-cli
# 安装 hexo 依赖包
npm install

然后再执行

hexo clean 
hexo g
hexo d

这时你文件夹下多出了db.json,node_modules,public,还会多一个.deploy_git(hexo打包后上传到master主分支的静态博客文件夹)因为我用了yarn,所以会有yarn.lock,这个无关紧要,这时git提交上去就行,最后的文件目录如这样

1673511752083.png

文章内更新点东西,加一句话什么的,再去执行hexo的命令

过会再去打开https://你的用户名.github.io,更新了就代表没问题了

参考文献

Hexo+Git+Github博客在多台终端同步管理_HackerEric的博客-CSDN博客

阅读全文

从零开始搭建博客(二)——hexo主题搭建

博客搭建 2022/9/22

一、更换 Hexo 博客主题

1. 如何找主题

默认主题非常简洁,适合大佬使用,像我等菜鸟,自己不会做却又想使用花里胡哨的主题,就要学会找主题了。

下面是我寻找主题的三个方法。

  • 官方网站

    Hexo 官网收录了几百个第三方主题,其中有许多中文开发者开发的主题。

    在 Hexo 官网点击“主题”,或者直接进入 Hexo 主题页:themes

    通过上方的搜索框可以根据标签搜索。

2.github开源Hexo 博客主题

大多数流行的主题都在 GitHub 托管开源了,我们可以直接去 GitHub 下载。

在 Github 官网搜索hexo-theme,选择All GitHub,或者直接进入搜索页:search?q=hexo-theme

市面上使用比较多的主题:

  • Next

Demo 示例:NexT | Dandy | Raincal

GitHub 主页:hexo-theme-next

这个是 Hexo 最流行的主题,GitHub 上 15.5k stars,在 Hexo 主题中排行第一。

  • matery

Demo 示例:闪烁之狐

GitHub 主页:hexo-theme-matery

本菜鸟使用的主题就是以简约为主:

  • ayer

Demo 示例:岛

GitHub 主页:hexo-theme-ayer

3.更换主题

以 ayer 主题为例。

在 vs code中根目录下,右键新建终端,执行下面命令:

npm i hexo-theme-ayer -S
#如果hexo < 5.0
# 国内用户如果速度较慢,可以把github地址替换为:https://gitee.com/mirrors/ayer.git
git clone https://github.com/Shen-Yu/hexo-theme-ayer.git themes/ayer

此时打开博客根目录下的 themes 文件夹可以看到多了个 ayer 文件夹。

1673503194683.png

然后用记事本打开博客根目录下的 _config.yml (D:\MyBlog_config.yml),找到theme标签,默认值是landscape主题,把它改为要更换的主题名字ayer,然后执行启动命令。

# 清理 && 生成 && 启动
hexo clean && hexo g && hexo s

1673503295276.png

这1时再到浏览器打开网址http://localhost:3000,可以看到我们的博客已经换上一款非常精美的主题。

二.本地写博客

利用Markdown语法的软件写博客,本地试运行:

这里推荐使用Typora或uTools的Markdown笔记功能,具体怎么使用这两款软件, 就和掘金写文章差不多,官方都有说明。其中Typora现在开始收费了,但可以去下载老版本,老版本是免费的,具体操作可以按:

Typora免费版

根据这个网址上面来操作,下载老版本的Typora,但具体还能用多久就不知道了,有钱的小伙伴可以直接去官网下载正版,本人老穷b了。

5CBFAEB737CB3B14DDC82E5F0B6A357B.gif

把写好的文章复制到根目录下的source=>_posts

1673503721548.png
然后执行命令:

hexo clean && hexo g && hexo s

本地看时就发现文章已经有了:

1673503821935.png

阅读全文

从零开始搭建博客(一)——本地搭建hexo框架

博客搭建 2022/9/22

一、hexo框架

1.什么是 Hexo?

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

2.安装前提

安装 Hexo 相当简单,只需要先安装下列应用程序即可:

  • Node.js (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本)
  • Git

如果您的电脑中已经安装上述必备程序,那么恭喜您!你可以直接前往 安装 Hexo 步骤。

如果您的电脑中尚未安装所需要的程序,请自行百度按指示完成安装。

3.安装 Hexo

(1)本地安装 hexo

首先在本地新建一个空文件夹,用来存放 Hexo 的文件和以后要写的博客文件,注意不要有中文路径,避免可能出现的问题。取名 MyBlog。

使用VS code 打开该文件夹,右键打开终端

# 安装 hexo 框架
npm install -g hexo-cli
# 初始化文件夹
hexo init
# 安装 hexo 依赖包
npm install

命令很好理解,第一行安装 hexo 模块,-g表示安装全局模块;第二行是 hexo 初始化,会用 git clone命令去 GitHub 下载一个 hexo 默认模板代码库;第三行是安装依赖包,类似安装 pip 的 requirement 文件,会根据刚下载的代码库中的配置文件,下载并安装所需依赖包。

(2)可能遇到的问题

  • npm install -g hexo-cli命令执行卡住,或者报错连接不上

可能是 npm 源速度太慢,可以尝试修改淘宝源解决,再重新执行安装命令。npm 源的概念就和 Python 中的 pip 源一样,默认源是https://registry.npmjs.org/。

# 查看 npm 源
npm config get registry
# 临时修改 npm 源安装 hexo (仅本条命令有效)
npm --registry=https://registry.npm.taobao.org install -g hexo-cli
# 或者永久修改 npm 源
npm config set registry https://registry.npm.taobao.org

如果是公司内网使用代理访问外网 (比如ping registry.npmjs.org ping registry.npm.taobao.org都不通),可以尝试给 npm 配置代理解决,再重新执行安装命令。

# 设置代理
npm config set proxy http://serverip:port
npm confit set https-proxy http:/serverip:port
# 设置带用户名密码的代理
npm config set proxy http://username:password@serverip:port
npm confit set https-proxy http://username:password@serverip:port
# 取消代理
npm config delete proxy
npm config delete https-proxy
  • hexo init命令执行卡住,或者报错连接不上

同上设置代理

4.运行本地博客

前面三条命令执行成功,Hexo 框架在本地就已经搭建好了,下面看看效果。

在vs code 的终端中运行命令

# 生成静态网站
hexo g
# 启动服务器
hexo s

点击运行成功后的出来的地址

自此一个简单的本地博客诞生了

image.png

阅读全文

hello,欢迎来到耀耀切克闹的博客!

博客搭建 2022/9/22

一.为什么要搭建博客?

  1. 搭建博客就是为了写博客,整理思路,将学习的知识融会贯通,以教为学。
  2. 在这个过程中,你可以认识更多兴趣相投的人。
  3. 事件驱动学习,每周持续的博客更新,查看自己是否学习到新东西!
  4. 对自己也是一种督促,你拥有一个完全属于自己的博客,会驱动自己分享学习!

二.搭建博客方式

image.png

1.自己开发

这是最原始的博客建站方式了,自己写代码(前台 + 后台管理+数据库等等)、自己将项目发布上线、自己来维护网站,啥都自己来干。这就意味着全栈的工作,你需要理解和学习的地方有好多好多,在这过程中需要耗费大量时间,但对自己的提升是不可估量的,并且代码掌握在自己手里,很安想加什么功能都不会受到限制,很灵活。这里推荐 Github 上的开源项目,可以在此上进行二次开发:

Halo博客,一款现代化的开源博客/CMS系统,值得一试。详细部署可以去 https://docs.halo.run

2.站点生成器

博客是一种很典型的网站,所以有大佬将博客的功能(比如文章管理)抽象出来,做成了 站点生成器 ,可以用极少的命令 + 配置文件的方式,自动生成精美的博客网站。本人还是比较菜的,刚毕业,工作了2个月多,前端菜鸡程序员一枚,于是采用了这种方式,也是我极力推荐的一种方式,省时省力,灵活程度虽然比不上完全由自己开发,但适合大多数人的需求。并且,绝大多数的站点生成器都只能生成静态网站,也就是说网站的内容(比如博客文章、文档等)是固定的,不需要从数据库中获取内容,因此有很多优点:

  • 省钱:把文件扔 GitHub Pages、Gitee Pages 啥的就能免费部署

  • 速度快:省去了数据的动态获取过程,配合 CDN 加载速度飞起

  • SEO:静态网站更容易被搜索引擎的蜘蛛抓取,稳定排名

  • 易维护:没那么多花里胡哨的功能,比动态网站好维护不少

    这里推荐:

image.png

当然,好像另外还有一种方式就是建站程序,主流就是 WordPress(推荐)或 Typech,跟着官方文档操作就行,不过俺了解甚少。感兴趣的朋友可以去看看,据说也很方便。

3.建站平台和购买

简单说吧!就是花钱办事,用金钱换时间。

建站平台:套个现成的模板、利用界面拖拖拽拽就能搞出来一个网站,平台还会给你提供域名,一键上线。此外,网站的维护也不用咱自己操心了,全交给别人,我们专注于网站的内容就行,百度搜索应该有一大堆。

购买: 极致的体验,没有最好,只有更好,你就是大爷,可以尽情享受氪金带来的快乐!(手动狗头)

阅读全文

TS基础

一、基础类型

1.布尔类型

let bool: boolean;
bool = false;
bool = 123; // Error:不能将类型“number”分配给类型“boolean”。

2.数值类型

let num:number = 123

3.字符串类型

let str: string;
str = 'bac';
str = `数值是${num}`;

4.数组类型

let arr1: number[];
arr1 = [1, 2, 3];

let arr2: Array<number>;
arr2 = [1, 2, 3];

let arr3: (string | number)[];
arr3 = [1, '2', 3];

5.元组类型

let tuple: [string, number, boolean];
tuple = ['a', 1, false]; // 必须按照上面的顺序和类型
tuple = ['a', false, false]; // Error:不能将类型“boolean”分配给类型“number”。
tuple = ['a', 1, false, 12]; // Error:不能将类型“[string, number, false, number]”分配给类型“[string, number, boolean]”。

6.枚举类型

enum Roles {
  SUPER_ADMIN, // 0
  ADMIN, // 1
  USER // 2
}
console.log(Roles.SUPER_ADMIN); // 0
console.log(Roles[Roles.SUPER_ADMIN]); // SUPER_ADMIN

7.any类型

let value: any;
value = 'abc'
value =2
value = [1,2,3]
let arr: any[] = [1,'a']

8.void类型

const consoleText = (text: string): void => { // 不返回内容
  console.log(text);
};
let v: void;
v = undefined;
v = null; // tsconfig的strict需要关掉

9.null和undefined

null 和 undefined 是其他类型的子类型

10.never类型

表示永远不存在的类型,抛错or死循环,返回值就是 never 类型。

const errorFunc = (message: string): never => {
  throw new Error(message);
};
const infiniteFunc = (): never => {
  while(true) {}
};
// let neverVariable: never
let neverVariable = (() => {
  while(true) {}
})();

11.对象类型

function getObject(obj: object): void {
  console.log(obj);
}
getObject({ name: 'dylan' });
getObject(123); // Error:类型“number”的参数不能赋给类型“object”的参数。

12.类型断言

值 as 类型

或 <类型>值

二、Symbol

Symbol值是独一无二的

const s1 = Symbol(); // Symbol()
const s2 = Symbol(); // Symbol()
s1 === s2; // false

目前来说工作上遇到的少

三、接口

我们可以使用接口来进行限制,使数据更加清晰直观

interface NameInfo {
  firstName?: string;//?代表可选参数,没?不传这个值会报错
  readonly lastName: string; //只读属性,不能更改NameInfo.lastName的值
}
const getFullName = ({ firstName, lastName }: NameInfo): string => {
  return `${firstName} ${lastName}`;
};
getFullName({
  firstName: 'haha',
  lastName: 'Lv'
});

多传入参数时使用类型断言或者索引签名

interface Vegetable {
  color?: string;
  type: string;
}

const getVegetables = ({ color, type }: Vegetable) => {
  return `A ${color ? (color + ' ') : ''}${type}`;
};
getVegetables({ type: 'tomato', size: 2 }); // Error:类型“{ type: string; size: number; }”的参数不能赋给类型“Vegetable”的参数。
//类型断言
getVegetables({ type: 'tomato', size: 2 } as Vegetable);

//索引签名
interface Vegetable {
  color?: string;
  type: string;
  [prop: string]: any; // 索引签名
}
getVegetables({ type: 'tomato', size: 2 });

定义函数结构

// 等同于类型别名:type AddFunc = (num1: number, num2: number) => number;
interface AddFunc {
  (num1: number, num2: number): number
}
const add: AddFunc = (n1, n2) => n1 + n2;

索引类型

interface RoleDic {
  [id: number]: string;//id这个索引只能为数值类型
}  

接口的继承

interface Vegetables {
  color: string;
}
interface Tomato extends Vegetables {
  radius: number;
}
const tomato: Tomato = {
  radius: 1,
  color: 'red'
};

四、泛型 T

为什么要用泛型? 可以在函数调用时自由化传入的值和返回的值

使用范型约束函数类型:与之前不同的地方在于多了 T 这个泛型参数,可以理解为这个函数:传入了 T(某个类型)作为 value 的类型,返回由 T组成的数组

//<T> 表示声明一个表示类型的变量,Value: T 表示声明参数是 T 类型的,后面的 : T 表示返回值也是 T 类型的
const getArray = <T>(value: T, times: number = 5): T[] => {
  return new Array(times).fill(value)
} //如果使用any[]参数也可以任意传,但是也丢失了类型检测的功能

//第一个T为string,那么value: T也该为string
getArray<string>('abc').map(item => item.length); // [3, 3, 3, 3, 3]

使用两个范型变量

// 参数1是T类型,参数2是U类型,返回类型是元组类型 T,U组成的数组
const getArray = <T, U>(param1: T, param2: U, times: number): [T, U][] => {
  return new Array(times).fill([param1, param2]);
};
// 也可以明确泛型调用,不明确的话,TS会自动推导泛型类型:getArray<number, string>(1, 'a', 3);
getArray(1, 'a', 3); // [[1, 'a'], [1, 'a'], [1, 'a']]

五、交叉类型

交叉类型就是取多个类型的并集,使用 & 符号定义。

const mergeFunc = <T, U>(arg1: T, arr2: U): T & U => {
  let res = {} as T & U; // 使用类型断言来告诉TS这里是(T和U)的交叉类型
  res = Object.assign(arg1, arr2);
  return res;
};
mergeFunc({ a: 'a' }, { b: 'b' });
阅读全文
1 ... 9
avatar
耀耀切克闹

欢迎来到耀耀切克闹的博客

不是因为是主角才成功,而是成功了才成为主角

想要的都拥有,得不到的都释怀