Skip to content

Commit

Permalink
docs(all): 添加文档
Browse files Browse the repository at this point in the history
  • Loading branch information
lhj authored and lhj committed Aug 30, 2022
1 parent 331c2c8 commit eeab662
Show file tree
Hide file tree
Showing 22 changed files with 3,218 additions and 117 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ Javascript代码规范

[ECMAScript 6 入门](http://es6.ruanyifeng.com/)

[JS模版导入导出详解](docs/javascript/JS模版导入导出详解.md)



## MediaWiki相关
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
144 changes: 144 additions & 0 deletions docs/docker/MacOS安装部署Docker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# MacOS安装部署Docker

## 下载Docker Desktop

下载地址:https://docs.docker.com/docker-for-mac/install/

选择对应的版本进行下载即可

<img src="MacOS%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2Docker.assets/image-20210706180007988.png" alt="image-20210706180007988" style="zoom: 50%;" />

## 安装

1、如果Mac芯片为Apple silicon,需要安装 **Rosetta 2** 来运行一些Darwin/AMD64架构的镜像。安装方法如下,在命令行执行:

```
softwareupdate --install-rosetta
```

2、双击下载的安装文件,在弹出的窗口中将docker图标拖动到application图标上:

<img src="MacOS%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2Docker.assets/docker-app-drag.png" alt="Install Docker app" style="zoom: 67%;" />

3、找到安装好的程序图标,双击运行,第一次运行会同时安装帮助程序工具:

<img src="MacOS%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2Docker.assets/image-20210706181647279.png" alt="image-20210706181647279" style="zoom:50%;" />

4、第一次启动,会弹出开始帮助预览页面,如果已经熟悉了docker操作可以跳过帮助预览:

<img src="MacOS%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2Docker.assets/docker-tutorial-mac.png" alt="Docker Quick Start tutorial" style="zoom: 33%;" />

5、使用过程窗口界面可以直接关闭,看到图标栏有docker的图标,说明docker已经正常运行了。

6、这时候可以新打开一个终端窗口,输入以下命令查看docker信息:

```
% docker --version
Docker version 20.10.7, build f0df350
```



## 部署

1、镜像加速

在任务栏点击 Docker Desktop 应用图标 ->`Perferences`,在左侧导航菜单选择`Docker Engine`,在右侧像下边一样编辑 json 文件。修改完成之后,点击`Apply & Restart`按钮,Docker 就会重启并应用配置的镜像地址了。

```
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
```

执行 `docker info`,如果从结果中看到了如下内容,说明配置成功。

```text
Registry Mirrors: https://hub-mirror.c.163.com/
```



## 使用实例(Redis)

1、在命令行,查找可用的Redis版本:

```
% docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 9645 [OK]
sameersbn/redis 83 [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0, 5.0, 6.0, 6.2 78
rediscommander/redis-commander Alpine image for redis-commander - Redis man… 61 [OK]
...
```

2、我们选择官方版本,拉取最新版本的镜像:

```
% docker pull redis:latest
latest: Pulling from library/redis
448f6bf000e3: Pull complete
c1563d96d611: Pull complete
39898690e366: Pull complete
f2c1f534c176: Pull complete
677225c5285b: Pull complete
f57391477f51: Pull complete
Digest: sha256:7c540ceff53f0522f6b1c264d8142df08316173d103586ddf51ed91ca49deec8
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
```

3、查看已下载的本地镜像:

```
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest cad8cf27ff34 12 days ago 99.7MB
```

4、创建Redis容器并运行

```
% docker run -itd --name redis-test -p 6379:6379 redis
48e02daa998070d56c5eed113fa273a4a9d4aa18530a65661010c4225eb1f7ea
```

5、 通过**docker ps** 命令查看容器的运行信息:

```
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48e02daa9980 redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis-test
```

6、通过 redis-cli 连接测试使用 redis 服务

```
% docker exec -it redis-test /bin/bash
root@48e02daa9980:/data# redis-cli
127.0.0.1:6379> set test 1
OK
```

7、停止容器

```
docker stop 48e02daa9980
```

8、删除容器

```
docker rm 48e02daa9980
```

9、删除镜像

```
docker rmi cad8cf27ff34
```

234 changes: 234 additions & 0 deletions docs/javascript/JS模版导入导出详解.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
# JS模版导入导出详解

在js开发中,经常看到 module.exports,exports,require和export,export default,import等模版导入导出代码的使用,以下将针对这些代码进行详细的说明,搞清楚相关用法和区别。

这几个方法的分类如下:

(1)module.exports和exports属于Node.js的CommonJS模块规范,用于声明所导出模块暴露的内容,对应的导入代码是 require;

(2)export和export default属于ES6语法所支持的模块代码,用于声明所导出模块的接口,对应的导入代码是import。



## module.exports和exports

module.exports和exports属于Node.js的CommonJS模块规范。

在Node.js中,每个Node应用由模块组成,每个js文件就是一个模块,有自己的作用域。在一个模块(文件)里面定义的变量、函数、类等,都是私有的,对其他模块(文件)不可见。

根据CommonJS规范规定,每个模块(文件)内部,使用module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是外部访问的标准接口。通过require加载某个模块(文件),其实是等同于加载该模块的module.exports属性。

以下面的example.js模块定义为例子:

```javascript
// example.js
var x = 5;
var addX = function(value){
return value + x;
};

// 指定 module.exports 属性,输出可访问接口
module.exports = {
x: x,
addX: addX
};
```

该模块设置了 module.exports 的属性值,其他模块(文件)可通过 module.exports 属性访问example.js模块(文件)的变量及函数:

```javascript
// test.js
var example = require('./example.js'); // 引入模块,example变量实际指向example.js模块的module.exports属性

// 通过引入的example变量访问example.js模块的变量和方法
console.log(example.x); // 5
console.log(example.addX(1)); // 6
```



在Node.js中,module.exports 初始值为一个空对象 {},因此也可以采用以下方式直接在 module.exports 对象添加属性值的方式进行访问接口的定义:

```javascript
// example.js
var x = 5;
var addX = function(value){
return value + x;
};

// 通过添加exports属性值的方式定义module.exports的访问接口
module.exports.x = x;
module.exports.addX = addX;
```



在模块(文件)中,exports变量是指向module.exports的预定义变量,实际上等同在每个模块(模块)头部,默认有一行这样的命令:

`var exports = module.exports;`

因此在模块(文件)中也可以这样定义访问接口:

```javascript
// example.js
var x = 5;
var addX = function(value){
return value + x;
};

// exports == module.exports, 可以通过添加exports属性值的方式定义module.exports的访问接口
exports.x = x;
exports.addX = addX;
```



除了以对象方式({...})设置module.exports,也可以将其定义为一个类构造函数形式的访问接口:

```javascript
// class.js
// 类构造函数
var CLASS = function(args){
this.args = args;
};

// 指定exports属性为构造函数
module.exports = CLASS;
```

对于类构造函数形式的访问接口,使用时需要通过new先进行对象实例化:

```javascript
// test.js
var CLASS = require('./class.js'); // 引入模块

// 需要先实例化对象
var c = new CLASS('构造函数初始变量');
...
```



也可以将访问接口定义为已实例化的对象,例如:

```javascript
// class_object.js
// 类构造函数
var CLASS = function(){
this.name = 'class';
};

CLASS.prototype.func = function(){
alert(this.name);
};

// 指定exports属性实例化对象
module.exports = new CLASS();
```

已实例化的访问接口对象,可以直接使用:

```javascript
// test.js
var CLASS_OBJECT = require('./class_object.js'); // 引入模块

// 直接使用
CLASS_OBJECT.func(); // 弹出 "class" 内容的告警框
```



## export和export default

export和export default是ES6的模块导出语法。

每个js文件同样是一个模块,每个模块只加载一次,即 每个js文件只执行一次, 如果多次加载同目录下的相同文件,已加载的文件将直接从内存中读取。 在ES6中一个模块就是一个单例,或者说就是一个对象。

每一个模块内声明的变量都是局部变量, 不会污染全局作用域。

模块内部的变量或者函数可以通过export指定导出,一个模块中可以导出多个变量或函数。

一个模块可以导入别的模块。



以下面的export_sample.js模块定义为例子:

```javascript
// export_sample.js
let name = 'xiaoming';
let age = 18;
let fn1 = function() {console.log('sayHi')};

// 导出 name, age 变量,以及 fn1 函数, 其中将fn1导出接口为别名sayHi
export {name, age, fn1 as sayHi};
```

通过import导入模块定义的接口,对于export导出的接口,需要通过import {...} from '...' 的方式导入:

```javascript
// import.js
import {name, age, sayHi} from './export_sample.js'

// 直接使用导入的接口
let add_age = age + 10;
sayHi();
```

在导入方面,也可以通过通配符 * 方式进行批量导入,例如:

```javascript
// import.js
import * as testModule from './export_sample.js'

// 直接使用导入的接口
let add_age = testModule.age + 10;
testModule.sayHi();
```



指定导出接口,也可以通过直接在变量定义中指定export来进行导出,例如:

```javascript
// export_sample.js
// 直接在定义中指定export,不过注意这种方式无法导出为别名的方式
export const name = 'xiaoming';
export const age = 18;
export const fn1 = function() {console.log('sayHi')};
```



可以通过 export default 的方式,导出默认的接口,一个模块只能有一个默认接口,也就是一个js文件只能有一个 export default 导出,但可以有多个export导出,同时export和export default可以共存,例如:

```javascript
// export_sample.js
export const name = 'xiaoming';
export const age = 18;
let fn1 = function() {console.log('sayHi')};
export {fn1 as sayHi};

// 导出默认接口对象
export default {
name: name,
age: age,
add_age: age + 10;
sayHi: fn1
};
```

export default导出的默认接口对象需要通过import xxx from '...' 的方式导入,例如:

```javascript
// import.js
import defaultModule from './export_sample.js'

// 使用默认接口
defaultModule.sayHi();
```



**注:import也可以支持导入文件夹,实际上如果导入的是文件夹,将自动导入该文件夹目录下的index.js文件(这是Node.js的获取机制)。**

Loading

0 comments on commit eeab662

Please sign in to comment.