简介
sed是一个流编辑器,将文件或标准输入的内容作为编辑的对象,对其按照需求进行修改。
sed的总体结构
sed [OPTION]… {script-only-if-no-other-script} [input-file]…
刨个坑,以后填
GitBook是基于git和markdown的的文档和知识库软件,可以帮助你和你的组织、团队建立共享的知识库
下面是GitBook官网(https://www.gitbook.com/)的描述:

1 | npm install gitbook -g |
建议使用gitbook-cli,这样就可以在你电脑的任何地方使用gitbook的命令
1 | npm install -g gitbook-cli |
这里需要注意的是如果要全局安装gitbook-cli,需要先卸载之前已经全局安装过的gitbook
1 | npm uninstall -g gitbook |
GitBook的基本用法非常简单。
gitbook init 初始化书籍目录gitbook serve 编辑书籍然而。。。
卡在第一步了
1 | TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Promise |
原因是gitbook跟不上最新版本的NodeJS,使用10版本勉强能用。但又不想为了这么个东西降低版本,因此果断弃坑。
这里有一篇总结了各个版本之间的各种问题:https://xmuli.tech/posts/d7327716/
替代方案是GitBook有个在线版的,https://app.gitbook.com
注册之后可以使用
Yarn 是一个软件包管理器,还可以作为项目管理工具。
无论你是小型项目还是大型单体仓库(monorepos),无论是业余爱好者还是企业用户,Yarn 都能满足你的需求。
Windows : 官网下载后直接安装即可
下载地址: https://yarn.bootcss.com/latest.msi
Mac
可以通过Homebrew包管理工具安装:
1 | brew install node |
也可以通过MacPorts安装:
1 | sudo port install yarn |
可以通过yarn --version来测试Yarn是否安装成功。
1 | yarn set version latest |
1 | yarn init |
1 | yarn add [package] |
1 | yarn add [package] --dev |
1 | yarn upgrade [package] |
yarn upgrade可以简写为yarn up
1 | yarn remove [package] |
1 | yarn |
或者
1 | yarn install |
执行yarn install命令后,会生成一个yarn.lock文件,
在使用 Yarn 安装、升级、删除依赖项目时,会自动更新到 yarn.lock 文件中。
在实际项目中,yarn.lock 文件也很有用处,我们可以将 yarn.lock 提交到版本库中,其他成员就可以通过 yarn install 获取所有依赖包,这个可以保证大家安装的依赖是完全一致的,避免产生bug。
1 | yarn help |
| Yarn Classic (1.x) | Yarn (2.x) | 备注 |
|---|---|---|
yarn create |
yarn dlx create-<name> |
yarn create 仍然可以使用,但是官方更推荐使用 yarn dlx |
yarn global |
yarn dlx |
Dedicated section |
yarn info |
yarn npm info |
|
yarn login |
yarn npm login |
|
yarn logout |
yarn npm logout |
|
yarn outdated |
yarn upgrade-interactive |
|
yarn publish |
yarn npm publish |
|
yarn tag |
yarn npm tag |
|
yarn upgrade |
yarn up |
升级所有工作区的包 |
yarn install --production |
yarn workspaces focus --all --production |
需要 workspace-tools 插件 |
Windows : 官网下载后直接安装即可
下载地址: https://nodejs.org/en/download/
Mac
1 | brew install node |
新建一个server.js的文件,内容如下:
1 | // NodeJS使用require指令来载入http模块 |
然后终端输入:node server.js

npm是NodeJS的包管理工具,类似Python的pip
查看npm版本:
1 | $ npm -v |
升级:
1 | npm install npm -g |
例如,使用npm安装常用的 Node.js web框架模块 express:
1 | npm install express # 本地安装 |
查看安装信息:
1 | npm list -g |
package.json 位于模块的目录下,用于定义包的属性。接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:
1 | { |
package.json属性说明
1 | npm uninstall express |
之后可以使用npm ls命令查看包是否已经卸载完成
1 | npm update express |
1 | npm search express |
使用npm init 命令来发布模块
1 | npm init |
输入提示的各项内容后生成了package.json文件:
1 | ➜ node_sample cat package.json |
使用npm adduser来在npm资源库中注册用户
1 | ➜ node_sample npm adduser |
然后我们就可以使用npm publish来发布模块了。
npm help <command>可查看某条命令的详细帮助,例如npm help install。npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。使用以下命令来使用淘宝的cnpm
1 | npm install -g cnpm --registry=https://registry.npm.taobao.org |
Node自带了交互式解释器,输入node即可,可以执行读取、执行、循环等功能
1 | npm install hexo-cli -g |
前提:需要安装好node.js和git
1 | # hexo init 需要在一个空文件夹执行 |
然后访问: http://localhost:4000 就可以看到页面了
1 | hexo clean |
1 | hexo new "New Post" |
1 | hexo server |
1 | hexo generate |
1 | hexo deploy |
需要修改_config.yml,添加远程发布配置参数
1 | # Deployment |
npm i –save hexo-wordcount
1 | # 清理、生成、本地发布 |
可以从(https://hexo.io/themes/)下载主题,下载到themes目录下,然后修改_config.yml文件中的theme为对应的主题名称(文件夹名)即可:
1 | theme: hexo-theme-matery |
使用hexo-abbrlink实现URL地址再编码:
1 | npm install hexo-abbrlink --save |
配置:
1 | url: http://sjdt.gitee.io |
Gitee Pages 是一个免费的静态网页托管服务,您可以使用 Gitee Pages 托管博客、项目官网等静态网页。如果您使用过 Github Pages 那么您会很快上手使用 Gitee 的 Pages服务。目前 Gitee Pages 支持 Jekyll、Hugo、Hexo编译静态资源。
注意需要在下面的位置申请开通 Gitee Pages服务,需要实名认证并上传证件图片并等待一个工作日审核

开通后需要建立一个与用户名相同的仓库,比如我的用户名为sjdt,
那么我的gitee page 仓库地址就是:[git@gitee.com:sjdt/sjdt.git]
1 | python -m playwright install |
playwrite文档:https://playwright.dev/python/docs/intro/
将你的Gitee用户名和密码添加到环境变量的gitee_username和gitee_username环境变量中,
然后就可以使用下面的脚本自动提交并更新GiteePages了。
1 | #!/usr/bin/env python3 |
移动端常用UI组件库
PC端常用UI组件库
安装:
1 | npm i element-ui |
使用:
1 | // 引入ElementUI |
注意:完整引入会导致chunk-vendors.js体积庞大,一般按需引入即可
babel-plugin-component1 | npm install babel-plugin-component |
修改babel.config.js
1 | module.exports = { |
修改main.js,按需引入组件:
1 | // 引入ElementUI的部分组件 |
Proxy替代defineProperty实现响应式Tree-shakingTypeScriptvue-cli创建1 | vue create vue3cli |
vite创建一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。
一套构建指令,它使用 Rollup 打包你的代码,并且它是预配置的,可以输出用于生产环境的优化过的静态资源。
Vite 意在提供开箱即用的配置,同时它的 插件 API 和 JavaScript API 带来了高度的可扩展性,并有完整的类型支持。
Vite 网站:
官网:[vitejs.dev]https://vitejs.dev/
中文网:vitejs.cn
优势:
1 | # 创建工程 |
Vue3的开发者工具同Vue2不同,需要单独重新安装。
setup是所有Composition API(组合API)表演的舞台setup中setup函数的两种返回值:data、methods、computed…)中可以访问到setup中的属性、方法。data、methods、computed…)setup优先async函数,因为返回值不再是return的对象,而是Promise,模板看不到return对象中的属性。Vue2的data、methods、computed在Vue3中还是可以使用的,但是不推荐
Vue2的方法中读取Vue3中的数据和方法没有问题
但是Vue3的setup中读取不到Vue2的数据和方法
1 | export default { |
渲染函数
1 | // 引入渲染函数 |
简写方式
1 | // 引入渲染函数 |
Vue3中需要通过ref函数来实现响应式。ref函数返回的是一个RefImpl对象。
作用:定义一个响应式的数据
语法:const xxx = ref(initValue)
xxx.value<div>{{xxx}}</div>备注:
Object.defineProperty()的get与set完成的。reactive函数,封装ES6的Proxy来实现的。示例:
1 | <template> |
作用: 定义一个对象类型的响应式数据,(基本类型不要用它,要用ref函数)
语法:const 代理对象 = reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy对象)
reactive定义的响应式数据是“深层次的”。
内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作
实例:
template
1 | <h2>姓名:{{ person.name }}</h2> |
1 | import { reactive } from "vue"; |
实现原理
Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。1 | Object.defineProperty(data, 'count', { |
存在问题
实现原理
通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等。
通过Reflect(反射):对被代理对象的属性进行操作。
MDN文档中描述的Proxy与Reflect:
1 | new Proxy(person, { |
window.Reflect
1 | obj |
ref用来定义:基本数据类型reactive用来定义: 对象(或数组)类型数据ref也可以用来定义对象(或数组)类型数据,它内部会通过reactive转为代理对象ref通过Object.deineProperty() 的get与set来实现响应式数据劫持reactivve通过使用Proxy来实现响应式数据劫持,并通过Reflect操作源对象内部的数据ref定义的数据:操作数据需要.value,读取数据是模板中直接读取不需要.valuereactive定义的数据:操作数据与读取数据均不需要.valuethis.$attrs。this.$slots。this.$emit。computed函数
与Vue2中computed配置功能一致
写法:
1 | <template> |
Vue2.x的方式
1 | watch: { |
Vue3.x的写法:
1 | <script> |
两个小坑:
watch的套路时:既要指明监视的属性,也要指明监视的回调。
watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性。
watchEffect有点像computed:
1 | // watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调。 |
与Vue2.x相比:
beforeDestroy和destoryed,换成了beforeUnmount 和unmountedconst name = toRef(person, 'name')toRefs与toRef功能一致,但可以批量创建多个ref对象,语法:toRefs(person)1 | <template> |
1 | <script> |
作用: 创建一个自定义的ref, 并对其依赖项跟踪和更新触发进行显示控制
实现防抖效果:
1 | <template> |
作用: 实现祖孙间通信
套路: 父组件有一个provide选项来提供数据,子组件有一个inject选项来开始使用这些数据
具体写法:
1 | setup(){ |
1 | setup(){ |
isRef: 检查一个值是否为一个ref对象isReactive: 检查一个对象是否是由reactive创建的响应式代理isReadonly: 检查一个对象是否是由readonly创建的只读代理isProxy: 检查一个对象是否是由reactive或者readonly方法创建的代理Teleport是一种能够将我们的组件html结构移动到指定位置的技术
异步引入组件
1 | import {defineAsyncComponent} from 'vue' |
使用Suspense包裹组件,并配置好default与fallback
1 | <Suspense> |
Vue2.x有许多全局API和配置
1 | // 注册全局组件 |
Vue3.0中对这些API做出了调整
| 2.x全局API(Vue) | 3.x实例API(app) |
|---|---|
| Vue.config.xxxx | app.config.xxxx |
| Vue.config.productionTip | 移除 |
| Vue.Component | app.component |
| Vue.directive | app.directive |
| Vue.mixin | app.mixin |
| Vue.use | app.use |
| Vue.prototype | app.config.globalProperties |
其他改变
Vue2.x写法
1 | .v-enter, |
Vue3.0的写法
1 | .v-enter-from, |
config.keyCodesv-on.native修饰符父组件中绑定事件
1 | <my-component |
子组件中声明自定义事件
1 | <script> |
安装:
1 | npm i vue-router |
使用router-link标签实现路由的切换
1 | <router-link to="/about" class="list-group-item" active-class="active">About</router-link> |
使用router-view指定组件的呈现位置
1 | <router-view></router-view> |
几个注意点:
pages文件夹,以班组间通常存放在component文件夹$route属性,里面存储着自己的路由信息。$router属性获取到。1 | export default new VueRouter({ |
1 | <router-link to="/home/news">News</router-link> |
配置路由,声明接收params参数
1 | { |
传递参数
跳转路由并携带query参数,to的字符串写法
1 | <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">{{m.title}}</router-link> |
跳转路由并携带params参数
1 | <router-link :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link> |
跳转路由并携带query参数,to的对象写法
1 | <router-link :to="{ |
跳转路由并携带params参数,to的对象写法,这里需要注意的是params路由不能使用path,必须使用name方式:
1 | <router-link :to="{ |
作用: 让路由组件更方便的收到参数
1 | { |
作用:不借助<router-link>实现路由跳转,让路由跳转更灵活
具体编码:
1 | methods: { |
作用:让不展示的路由组件保持挂载,不被销毁
具体编码:
1 | <keep-alive include="News"> |
1 | <keep-alive :include="['News','Message']"> |
作用: 对路由进行权限控制
分类: 全局守卫、独享守卫、组件内守卫
全局守卫:
1 | // 全局前置路由守卫 -- 初始化及每次路由切换之前被调用 |
独享路由守卫:beforeEnter
#,不美观Vuex是专门在Vue中实现集中式状态(数据)管理的一个Vue插件, 对vue应用中多个组件的共享状态进行集中式的管理(读/写)
也是一种组件间通信的方式,且适用于任意组件间通信。
Github地址:https://github.com/vuejs/vuex

1 | npm i vuex |
src/store/index.js1 | // 该文件用于创建Vuex中最为核心的store |
main.js中创建vm时传入store配置项1 | // 引入Vue |
当state中的数据需要经过加工后再使用时,可以使用getters加工,
在store.js中追加getters配置:
1 | const getters = { |
mapState方法:用于帮助我们映射state中的数据为计算属性:
1 | computed: { |
mapGetters方法: 用于帮助我们映射getters中的数据为计算属性
1 | // 第一种方式:借助mapGetters生成计算属性,从getters中读取数据。(对象写法) |
mapActions方法: 用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数
1 | methods:{ |
mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数
1 |
|
备注:mapActions与mapMutations使用时,若需要传递参数,需要在模板中绑定事件时传递好参数,否则参数是事件对象。
目的: 让代码更好维护,让多种数据分类更加明确
修改:moduleA.js
1 | const moduleAOptions = { |
moduleB.js
1 | export default { |
index.js
1 | // 该文件用于创建Vuex中最为核心的store |
state数据1 | // 方式1: 自己直接读取 |
getters数据1 | // 方式1: 自己直接读取 |
dispatch1 | // 方式1: 自己直接dispatch |
commit1 | // 方式1: 自己直接commit |
安装axios
1 | npm i axios |
跨域:协议名、主机名、端口号三者不同时浏览器认为跨域了。

server1.js
1 | // node src/server1.js |
server2.js
1 | // node src/server2.js |
然后就可以通过node src/server1.js和node src/server2.js 来启动服务器。
修改vue的自定义配置文件vue.config.js
方式一:
1 | devServer: { |
方式二:
1 | devServer: { |
默认插槽:
1 | 父组件中: |
具名插槽:
1 | 父组件中: |
作用域插槽:
数据在组件自身,但根据数据生成的结构需要组件的使用者来决定
App.vue
1 | <div class="container"> |
Category.vue
1 | <template> |