GVKun编程网logo

Node.js学习——开篇(node.js开发实战详解)

6

关于Node.js学习——开篇和node.js开发实战详解的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Deno从零到架构级系列(一)——开篇、JS学习——函数、Node.Js学习day

关于Node.js学习——开篇node.js开发实战详解的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Deno从零到架构级系列(一)——开篇、JS学习——函数、Node.Js学习day01【初识 Node.js 与内置模块】、Node.js学习之路01——不同操作系统下Node.js环境搭建等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Node.js学习——开篇(node.js开发实战详解)

Node.js学习——开篇(node.js开发实战详解)

前言:自从下决心转学前端以来,我的专业课java基本荒废了,所以对于后台开发的逻辑也已基本忘干净了。但是作为一名准前端程序猿,我认为还是有必要了解后端开发的,虽不必深入学习,但是能够了解项目从前端到后端的整个流程,实现简单的业务逻辑(增删改查)应该对我们大有裨益。NodeJS应该说是前端开发人员涉及后端开发的最佳选择,因为使用的是前端很熟悉的Javascript语言。

一、什么是Node.js

Node.js是一个基于V8引擎的服务器端Javascript运行环境。Javascript(简称JS,下同)从此有了开发后段应用程序的能力。

因为使用的是JS语言,所以一发布以来就受到了广大前端开发人员的喜爱。很多前端开发人员开始涉足后端开发,使用Node.js重构前端工具。

Node.js通过非阻塞I/O流、事件驱动机制展现了它超强的高并发能力。此外,Node使用的是高性能的V8引擎,提供了很多不同用途的API,采用全新的编译技术,实现了一个高性能的服务器。

二、Node.js环境安装

Node.js的环境安装十分简单,去官网 http://nodejs.org/en/ 下载稳定版本安装包,点击下一步下一步安装即可。

完成以后可以打开CMD输入node -v查看是否安装成功:

C:\Users\dawei>node -v
v6.11.1

出现node的版本号则表示安装成功。

现在我们就开始学习Nodejs。Node.js中,将很多功能划分为一个个module(模块)。Node.js中的很多功能都是通过模块来实现的。

三、http模块

HTTP模块用于创建服务器,接收和响应客户端的请求。

//1、引入http模块
var http = require('http');

//创建服务器
var server = http.createServer(function (req,res) {
    //发送HTTP头部
    //HTTP状态码:200:OK
    //设置HTTP头部,状态码是200,文件类型是html,字符集是utf-8
    res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
    
    //发送相应数据
    res.write("Hello Node.js");
    
    //结束处理程序,返回数据
    res.end();
});

server.listen(8080);      //监听端口

//在终端打印如下信息,提示服务器已启动
console.log("Server running at http://127.0.0.1:8080/");

这样我们就完整的创建了一个web服务器,可以在浏览器通过http://127.0.0.1:8080访问该服务器。

回调函数中的req对象包含了客户端请求的信息,可以使用req.url属性拿到用户请求的URL地址,在后期我们就是要通过不同的URL来设计不同的路由。那么识别这个URL,就用到了URL模块。

四、URL模块

URL模块提供了几个方法用于操作url。

  • url.parse(req.url):解析url,将URL地址转为url对象
  • url.format():将url对象转为url字符串,是parse方法的逆向操作
  • url.resolve(from,to) :添加或者替换路由

1、url.parse()

假设在上面的代码段中引入了url模块

url.parse(req.url)

那么将会打印如下内容
{
  protocol: null,slashes: null,auth: null,host: null,port: null,hostname: null,hash: null,search: null,query: null,pathname: '/',path: '/',href: '/' }

由于我们只是访问了根路径,所以内容基本为空,很多情况下我们需要访问详细的页面并且传递参数
http://127.0.0.1:8080/login.html?uaername=dawei&pass=123

{
  protocol: null,search: '?uaername=dawei&pass=123',query: 'username=dawei&pass=123',pathname: '/login.html',path: '/login.html?uaername=dawei&pass=123',href: '/login.html?uaername=dawei&pass=123' }

可以看到,这个对象的query属性保存了我们的参数,也叫做查询字符串。pathname属性中保存了我们的访问路径。这两个属性很常用。

我们往往需要获取参数信息,在服务器端做进一步处理。在JS中我们可以使用字符串截取来获取参数,不过再这里我们可以直接给parse方法传递一个参数true来将查询字符串转为对象格式,从而很方便的获取。

url.parse(req.url,true)

{
  protocol: null,search: '?username=dawei&pass=123',query: { username: 'dawei',pass: '123' },path: '/login.html?username=dawei&pass=123',href: '/login.html?username=dawei&pass=123' }

这样我们就可以很方便的获取参数的值。

2、url.resolve()

a、增加路由

var a = url.resolve('http://example.com/','/one');
console.log(a);     //  http://example.com/one

b、替换路由

var b = url.resolve('http://example.com/one','/two');
console.log(b);        //   http://example.com/two

Deno从零到架构级系列(一)——开篇

Deno从零到架构级系列(一)——开篇

image

大家好,小弟飞狐。好久没来思否了,再来带来了的一定是干货。从Deno开始,飞狐带来的绝对到目前为止前所未有的Deno系列。话不多说,用技术说话。

你学不动的 Deno 来了

还记得 Github 上那个让人学不动的 Deno 么?就在2020年5月13日,Deno1.0正式发布。作为新晋网红运行时,Deno真的会替代 Node 吗?这个问题可以追溯到2018年,从Node之父 Ryan Dahl的演讲说起,Ryan在演讲中谈及对Node有十大不满之处,并且在演讲的最后公布了Deno项目。我在这里只列三大新特性。

  • 首先,Deno 作为一个JavaScript/TypeScript 运行时,底层基于性能超高的 Rust 编写,在性能和存储安全上有先天的优势。
  • 其次,Deno 拥有完整的标准库,不再有 NPM 或 node_modules 文件夹,允许从任何地方导入所需模块。
  • 另外,Deno 集成 TypeScript,不再像以前一样借助工具编译,而是通过内部转换。不过似乎又要剥离。

综上所述,你会发现,Deno真的是青出于蓝而胜于蓝。是否替代,只是时间问题而已。我也看到很多人在做deno和node的性能比较,但在目前我认为做这两者的性能比较完全没有必要。

image

安装

我们一开始甭管deno底层用的go还是rust,为啥要从go换成rust、或者是deno的技术架构是咋样?这些目前都不要关心,我们就把deno当成一个新的运行时,只做运行时。从零到一,通过搭建一套脚手架,再慢慢去深入。Deno可以在Mac、Linux、Windows三大系统上运行。Deno也不需要其他依赖。通过如下方式安装:

  • Shell (Mac, Linux): curl -fsSL https://deno.land/x/install/install.sh | sh
  • PowerShell (Windows): iwr https://deno.land/x/install/install.ps1 -useb | iex
  • Homebrew (Mac): brew install deno
  • Chocolatey (Windows): choco install deno
  • Scoop (Windows): scoop install deno

第一个例子也是来自官方,每一行我都加了解释。如下:

// 创建文件 /server.ts
// 不需要像node一样去npm,这里直接引入
import { serve } from "https://deno.land/std@0.63.0/http/server.ts";
// 构建服务,设置端口
const s = serve({ port: 8000 });
// 这里是直接返回
for await (const req of s) {
  req.respond({ body: "Hello World\\n" });
}

整个代码非常简单,语法也是ts,和node非常像。有node基础的同学直接入手。

运行命令:deno run --allow-net ./server.ts,

然后在浏览器打开http://localhost:8000,就可以看到hello world了,如下图:

image

框架之选

众所周知,node的框架比较成熟,国外的有nest.js、国内的有egg.js。而目前deno的生态其实并不成熟,框架也都是模仿其他框架,多的就不介绍了,这里我给大家推荐两个框架。如下:

  • oak
  • alosaur

推荐oak的原因很简单,就是我们整个脚手架搭建都是基于oak的。oak模仿的是node的框架koa,从名字也可以看出来。 而推荐alosaur的原因就一点,可学性很强。有兴趣可以去看这个框架的源码,非常多值得借鉴的地方。飞狐教大家搭建脚手架,虽然不用这个框架,但很多底层实现也是借鉴的这个框架,比如注解路由。好啦,框架就介绍到这里啦,后面我们再慢慢深入。

话不多说,我们先来个oak例子:

// 引入oak框架
import { Application } from "https://deno.land/x/oak/mod.ts";
// 初始化
const app = new Application();
// 跟koa一样,运行上下文
app.use((ctx) => { ctx.response.body = "Hello World!"; });
// 监听端口
await app.listen({ port: 8000 });

在运行的时候,可能会报错,如下:

image

是不是有点受挫。其实大可不必,这个问题是deno版本迭代时std版本未更新至最新引起的。

注意,deno是新玩意儿,有不少坑,官方也在频繁迭代解决这些坑。 所以,理解万岁。最简单的解决办法只需要把oak的版本升级成最新就好了,如下面的例子。

路由

路由部分oak跟koa不一样的是,oak直接提供路由,只需引入即可。如下:

// 升级到oak的最新版本
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";
// 这是官方的例子
const books = new Map<string, any>();
books.set("1", {
  id: "1",
  title: "听飞狐聊deno",
  author: "飞狐",
});
// 创建路由
const router = new Router();
// 路由,和koa-router的用法一样
router
  .get("/", (context) => {
    context.response.body = "Hello world!";
  })
  .get("/book", (context) => {
    context.response.body = Array.from(books.values());
  })
  .get("/book/:id", (context) => {
    if (context.params && context.params.id && books.has(context.params.id)) {
      context.response.body = books.get(context.params.id);
    }
  });
const app = new Application();
// 应用路由
app.use(router.routes());
// 允许路中间件引入
app.use(router.allowedMethods());
await app.listen({ port: 8000 });

切记,一定要用最新的版本。同样的,输入命令运行。如下图(postman测试接口):
image

拆分路由

MVC模式大家都不陌生了,我们这里仅仅做个简单的拆分,把路由和控制层独立出去。 创建一个controller文件夹,在该文件夹下创建一个bookController文件,如下:

// 创建bookController.ts,
// 我们把数据先移到这来再说
const books = new Map<string, any>();

books.set("1", {
  id: "1",
  title: "听飞狐聊deno",
  author: "飞狐",
});
// 这里直接返回一个对象,把路由映射的方法也搬到这里
export default {
  getbook: ((context: any) => {
    context.response.body = Array.from(books.values());
  }),
  getbookById: ((context: any) => {
    if (context.params && context.params.id && books.has(context.params.id)) {
      context.response.body = books.get(context.params.id);
    }
  })
}

再在根目录下创建router.ts,代码如下:

import { Router } from ''https://deno.land/x/oak@v6.0.1/mod.ts'';
// 引入控制层的文件
import bookController from ''./controller/bookController.ts''

const router = new Router();
router
  .get("/", (context) => {
    context.response.body = "Hello world!";
  })
  .get("/book", bookController.getbook)
  .get("/book/:id", bookController.getbookById)

export default router

原来的入口文件server.ts,就变得十分简洁了,如下:

import { Application } from ''https://deno.land/x/oak@v6.0.1/mod.ts'';
import router from ''./router.ts''

const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8000 });

这样就很简洁了,也利于扩展。比如:

  • 后续用到业务逻辑的时候,我们可以再添加service层
  • 后续用到中间件的时候,我们可以再添加middleware层
  • 后续扩展异常处理等等

在这个基础上,在后面的篇章里我们再继续深入。今天的内容其实已经完成了。这里再介绍一下,为啥说这个系列是架构级思想呢?因为我们在写代码的时候,就会基于一些特定的场景考虑,比如微服务等。就像golang里的go-micro,会集成grpc、etcd、gin等等一样。有兴趣我也可以写一套golang系列分享给大家,小弟我有太多想和大家伙儿分享的东东了,比如,TensorFlow.js、Julia量化交易等。呃~好像跑偏了,还是拉回来先送大家一个结尾彩蛋,为下一篇打基础。

彩蛋(改造入口文件)

从现在起,后面的部分我们要用类class的方式来写代码了,先从入口文件开始,改造如下:

// server.ts
import { Application } from ''https://deno.land/x/oak@v6.0.1/mod.ts'';
import router from ''./router.ts''

const app = new Application();
class Server {
  constructor () {
    this.init()
  }

  async init () {
    app.use(router.routes());
    app.use(router.allowedMethods());
    this.listen()
  }

  async listen () {
    await app.listen({ port: 8000 });
  }
}

new Server()

这里我不用注释了,单独讲解一下这个地方,主要三点:

  • 1.创建一个server类,创建一个初始化函数init()
  • 2.在构造函数里调用初始化函数,把路由,中间件,监听函数,一切需要初始化执行的函数都拎进去
  • 3.最后运行这个类 这样做的好处,一个标准化,一个是利于扩展。

下回预告

回顾一下,这篇内容很浅显,主要是安装deno,简单实用oak框架,拆分路由而已。 下回我们直接聊typescript装饰器模式,注解,并且实现注解路由。控制层也按照类class的写法,就跟Java的springmvc一样,如下图:

image

从上图可以看到,这样根本就不需要router文件啦。不管是node、deno还是golang,飞狐真的很不喜欢一个单独的router文件去维护路由,太麻烦。所以每次搭架子的时候,我一定是先把路由给搞定了,免得麻烦。现在理解为啥下回直接开干注解路由了吧,deno的注解路由还是很一波三折的,因为完全照搬node会有些坑。期待吧,嘿嘿~

JS学习——函数

JS学习——函数

学习内容来源:JavaScript 函数参数、JavaScript 函数调用、JavaScript 闭包

JavaScript 函数参数

注意:JavaScript 函数不会对参数值进行任何检查。

函数参数

  • 函数参数(parameter)指的是在函数定义中列出的名称。
  • 函数参数(argument)指的是传递到函数或由函数接收到的真实值。

参数规则

  • JavaScript 函数定义不会为参数(parameter)规定数据类型。
  • JavaScript 函数不会对所传递的参数(argument)实行类型检查。
  • JavaScript 函数不会检查所接收参数(argument)的数量。

参数默认

如果调用参数时省略了参数(少于被声明的数量),则丢失的值被设置为:undefined。

注意:有时这是可以接受的,但是有时最好给参数指定默认值。

arguments 对象

如果函数调用的参数太多(超过声明),则可以使用 arguments 对象来达到这些参数。
arguments 对象包含函数调用时使用的参数数组。

例子:

// 计算所有数的和,x = 871
x = sumAll(1, 123, 500, 115, 44, 88);

function sumAll() {
    var i, sum = 0;
    for (i = 0; i < arguments.length; i++) {
        sum += arguments[i];
    }
    return sum;
}

参数通过值传递

函数调用中的参数(parameter)是函数的参数(argument)。

JavaScript 参数通过值传递:函数只知道值,而不是参数的位置。如果函数改变了参数的值,它不会改变参数的原始值。

注意:参数的改变在函数之外是不可见的。

对象是由引用传递的

在 JavaScript 中,对象引用是值。

正因如此,对象的行为就像它们通过引用来传递。如果函数改变了对象属性,它也改变了原始值。

注意:对象属性的改变在函数之外是可见的。

JavaScript 函数调用

以函数形式调用函数

这种函数不属于任何对象。但是在 JavaScript 中,始终存在一种默认的全局对象。
在 HTML 中,默认全局对象是 HTML 页面本身,所有上面的函数“属于”HTML 页面。
在浏览器中,这个页面对象就是浏览器窗口。上面的函数自动成为一个窗口函数。

function myFunction(a, b) {
    return a * b;
}
myFunction(10, 2);    // 将返回 20

// myFunction() 和 window.myFunction() 是同一个函数:
function myFunction(a, b) {
    return a * b;
}
window.myFunction(10, 2);    // 也会返回 20

作为方法来调用函数

fullName 方法是一个函数。该函数属于对象。myObject 是函数的拥有者。
被称为 this 的事物,是“拥有”这段 JavaScript 代码的对象。在此例中,this 的值是 myObject。

var myObject = {
    firstName:"Bill",
    lastName: "Gates",
    fullName: function () {
        return this.firstName + " " + this.lastName;
    }
}
myObject.fullName();      // 将返回 "Bill Gates"

通过函数构造器来调用函数

构造器调用会创建新对象。新对象会从其构造器继承属性和方法。
构造器内的 this 关键词没有值。
this 的值会成为调用函数时创建的新对象。

// 这是函数构造器:
function myFunction(arg1, arg2) {
    this.firstName = arg1;
    this.lastName  = arg2;
}

// 创建了一个新对象:
var x = new myFunction("Bill", "Gates");
x.firstName;           // 会返回 "Bill"

JavaScript 闭包

JavaScript 变量属于本地或全局作用域。
全局变量能够通过闭包实现局部(私有)。

JavaScript 嵌套函数

所有函数都有权访问全局作用域。
事实上,在 JavaScript 中,所有函数都有权访问它们“上面”的作用域。
JavaScript 支持嵌套函数。嵌套函数可以访问其上的作用域。
闭包指的是有权访问父作用域的函数,即使在父函数关闭之后。

例子:

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();     
    return counter; 
}

如果我们能够从外面访问 plus() 函数。
我们还需要找到只执行一次 counter = 0 的方法。
我们需要闭包(closure)。

// counter = 3
var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add();
add();
add();

变量 add 的赋值是自调用函数的返回值。
这个自调用函数只运行一次。它设置计数器为零(0),并返回函数表达式。
这样 add 成为了函数。最“精彩的”部分是它能够访问父作用域中的计数器。
这被称为 JavaScript 闭包。它使函数拥有“私有”变量成为可能。
计数器被这个匿名函数的作用域保护,并且只能使用 add 函数来修改。

Node.Js学习day01【初识 Node.js 与内置模块】

Node.Js学习day01【初识 Node.js 与内置模块】

学习目标

  • 能够知道什么是Node.js能够知道Node.js可以做什么
  • 能够说出Node.js中的JavaScript的组成部分
  • 能够使用fs模块读写操作文件
  • 能够使用path模块处理路径
  • 能够使用http模块写一个基本的 web服务器

文章目录

  • 学习目标
    • 一、初识node.js
      • 1.1 初识node
        • 1.1.1 浏览器中的 JavaScript 的组成部分:
        • 1.1.2 为什么 JavaScript 可以在浏览器中被执行
        • 1.1.4 为什么JavaScript可以操作DOM和BOM?
        • 1.1.5 浏览器中的JavaScript运行环境
        • 1.1.6 JavaScript能否做后端开发?
      • 1.2 Node.js简介
        • 1.2.1 什么是node.js
        • 1.2.2 node.js中JavaScript的运行环境
        • 1.2.3 Node.js可以做什么
        • 1.2.4 Node.js怎么学
      • 1.3 Node.js环境的安装
        • 1.3.1 区分`LTS`版本和`Current`版本的不同
        • 1.3.2 查看已安装的Node.js的版本号
        • 1.3.3 什么是终端
      • 1.4 在Node.js中执行JavaScript代码
        • 1.4.1 终端中的快捷键
    • 二、fs文件系统模块
      • 2.1 什么是fs 文件系统模块
      • 2.2 读取指定文件中的内容
        • 2.2.1 fs.redeFile() 的语法格式
        • 2.2.2 fs.readFile()的示例代码
        • 2.2.3 判断文件是否读取成功
      • 2.3 向指定的文件中写入文件
        • 2.3.1 fs.writeFile()的语法格式
        • 2.3.2 fs.writeFile()的示例代码
        • 2.3.3 判断文件是否写入成功
      • 2.4 练习–考试成绩整理
      • 2.5 fs模块–路径动态拼接的问题
    • 三、path路径模块
      • 3.1 什么是path文件路径模块
      • 3.2 路径拼接
        • 3.2.1 path.join()的语法格式
        • 3.2.2 path.join()的代码示例
      • 3.3 获取路径中的文件名
        • 3.3.1 path.basename()的语法格式
        • 3.3.2 path.basename()的代码示例
      • 3.4 获取路径中的文件扩展名
        • 3.4.1 path.extname()的语法格式
      • 3.5 综合案例–时钟案例
        • 3.5.1 案例要实现的功能
        • 3.5.2 案例的实现步骤
        • 3.5.3 步骤1 - 导入需要的模块并创建正则表达式
        • 3.5.3 步骤2 - 使用 fs 模块读取需要被处理的 html 文件
        • 3.5.3 步骤3 – 自定义 resolveCSS 方法
        • 3.5.3 步骤4 – 自定义 resolveJS 方法
        • 3.5.3 步骤5 – 自定义 resolveHTML 方法
        • 3.5.4 案例的两个注意点
      • 综合案例HTML代码:
        • 实现代码:

一、初识node.js

1.1 初识node

1.1.1 浏览器中的 JavaScript 的组成部分:

image-20220328023043257

1.1.2 为什么 JavaScript 可以在浏览器中被执行

image-20220328023513845
不同的浏览器使用不同的 JavaScript 解析引擎:

  • Chrome 浏览器 => V8
  • Firefox 浏览器 => OdinMonkey(奥丁猴)
  • Safri 浏览器 => JSCore
  • IE 浏览器 => Chakra(查克拉)
  • etc…

其中,Chrome 浏览器的 V8 解析引擎性能最好!

1.1.4 为什么JavaScript可以操作DOM和BOM?

image-20220328023747893
每个浏览器都内置了DOM、BOM这样的API函数,因此,浏览器中的JavaScript才可以调用它们。

1.1.5 浏览器中的JavaScript运行环境

运行环境是指代码正常运行所需的必要环境。
image-20220328023851984

  • V8 引擎负责解析和执行 JavaScript 代码。
  • 内置 API 是由运行环境提供的特殊接口,只能在所属的运行环境中被调用。

1.1.6 JavaScript能否做后端开发?

image-20220321141052341

1.2 Node.js简介

1.2.1 什么是node.js

官方的定义为:

Node.jsis a JavaScript runtime built on Chrome’s V8 JavaScript engine.

Node.js是一个基于Chrome V8引擎的 JavaScript运行环境

Node.js 的官网地址: https://nodejs.org/zh-cn/

1.2.2 node.js中JavaScript的运行环境

image-20220321142133027
注意:

  • 浏览器是JavaScript的前端运行环境
  • Node.js是JavaScript的后端运行环境
  • Node.js 中无法调用DOM和BOM等浏览器内置API。

1.2.3 Node.js可以做什么

Nodejs 作为一个JavaScript 的运行环境,仅仅提供了基础的功能和API。然而,基于Node,js 提供的这些基础能,很多强大的工具和框架如雨后春笋,层出不穷,所以学会了Node.js,可以让前端程序员胜任更多的工作和岗位:

  • ①基于Express框架(http://www.expressjs.com.cn/),可以快速构建Web应用

  • ②基于Electron框架(https://electronjs.org/),可以构建跨平台的桌面应用

  • ③基于restify框架(http://restify.com/),可以快速构建API接口项目

  • ④读写和操作数据库、创建实用的命令行工具辅助前端开发、etc…

总之: Nodejs是大前端时代的“大宝剑”,有了Nodejs 这个超级buff的加持,前端程序员的行业竞争力会越来越强!

1.2.4 Node.js怎么学

浏览器中的JavaScript学习路径:
JavaScript 基础语法+浏览器内置API(DOM+ BOM)+第三方库 (jQuery、art-template等)

Node.js 的学习路径:
JavaScript 基础语法+Node.js 内置API模块(fs、path、http等)+第三方API模块((express、mysql等)

1.3 Node.js环境的安装

如果希望通过Node.js来运行Javascript 代码,则必须在计算机上安装Node.js环境才行。

安装包可以从 Node.js 的官网首页直接下载,进入到Node.js 的官网首页(https://nodejs.org/en/),点陆绿色的按钮,下载所需的版本后,双击直接安装即可。

image-20220328024411296

1.3.1 区分LTS版本和Current版本的不同

LTS为长期稳定版,对于追求稳定性企业级项目来说,推荐安装LTS版本的Node.js。

Current为新特性尝鲜版,对热衷于尝试新特性的用户来说,推荐安装Current版本的Node,js。但是,Current版本可
能存在隐藏的Bug 或安全性漏洞,因此不推荐在企业级项目中使用Current版本的 Node.js。

1.3.2 查看已安装的Node.js的版本号

打开终端,在终端输入命令node -v后,按下回车键,即可查看已安装的Node.js的版本。

Windows 系统快速打开终端的方式:
使用快捷键(Windows徽标键+R)打开运行面板,输入cmd后直接回车,即可打开终端。
image-20220328024733619

1.3.3 什么是终端

终端(英文:Terminal)是专门为开发人员设计的,用于实现人机交互的一种方式。

作为一名合格的程序员,我们有必要识记一些常用的终端命令,来辅助我们更好的操作与使用计算机。

1.4 在Node.js中执行JavaScript代码

①打开终端
②输入node要执行的js文件的路径

console.log("hello word")

按住shift+鼠标右键可以打开powershell窗口

1.4.1 终端中的快捷键

在Windows的powershell或cmd终端中,我们可以通过如下快捷键,来提高终端的操作效率:

①使用键,可以快速定位到上一次执行的命令

②使用tab键,能够快速补全路径

③使用esc键,能够快速清空当前已输入的命令

④输入cls命令,可以清空终端

二、fs文件系统模块

2.1 什么是fs 文件系统模块

fs模块是Node.js 官方提供的、用来操作文件的模块。它提供了一系列的万法和属性,用来满足用尸对又件的操作需求。

例如:
fs.readFile()方法,用来读取指定文件中的内容

fs.writeFile()方法,用来向指定的文件中写入内容

如果要在JavaScript 代码中,使用fs模块来操作文件,则需要使用如下的方式先导入它:

const fs = require("fs"

2.2 读取指定文件中的内容

2.2.1 fs.redeFile() 的语法格式

使用fs.readFile()方法,可以读取指定文件中的内容,语法格式如下:

fs.readFile(path[, options],callback)

参数解读:

  • 参数1:必选参数,字符串,表示文件的路径。

  • 参数2:可选参数,表示以什么编码格式来读取文件。

  • 参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。

const fs = require(''fs'')

fs.readFile(''D:/node学习/files/1.txt'',''utf8'',function(err,dataStr){
    if (err){
        return console.log(''读取文件失败!''+err.message)
    }
    console.log(''读取文件成功''+dataStr)
})

utf8的编码格式,读取指定文件的内容,并打印errdataStr·的值:

image-20220321151208723

//1、导入fs模块 ,来操作文件
const fs = require(''fs'')

//2、读取文件存放的路径
// 参数1:读取文件的存放路径
// 参数2:读取文件时候采用的编码格式,一般默认指定utf8
// 参数3:回调函数,拿到读取失败和成功的结果err dataStr

fs.readFile(''.\files\1.txt'',''utf8'',function(srr,dataStr){
    //2.1 打印失败的结果
    //如果读取成功,则err的值为null
    //如果读取失败,则err的值为错误对象,dataStr的值为undefined
    console.log(srr)   
    console.log(''——————————————————————'')
    //2.2 打印成功的结果 
    console.log(dataStr)  
})

2.2.2 fs.readFile()的示例代码

向指定的文件路径中,写入文件内容:

image-20220328025443385

//1、导入fs模块 ,来操作文件
const fs = require(''fs'')

//2、读取文件存放的路径
// 参数1:读取文件的存放路径
// 参数2:读取文件时候采用的编码格式,一般默认指定utf8
// 参数3:回调函数,拿到读取失败和成功的结果err dataStr

fs.readFile(''.\files\1.txt'',''utf8'',function(srr,dataStr){
    //2.1 打印失败的结果
    //如果读取成功,则err的值为null
    //如果读取失败,则err的值为错误对象,dataStr的值为undefined
    console.log(srr)   
    console.log(''——————————————————————'')
    //2.2 打印成功的结果 
    console.log(dataStr)  
})

2.2.3 判断文件是否读取成功

可以判断err对象是否为null,从而知晓文件读取的结果:

image-20220328025453007

const fs = require(''fs'')

fs.readFile(''D:/node学习/files/1.txt'',''utf8'',function(err,dataStr){
    if (err){
        return console.log(''读取文件失败!''+err.message)
    }
    console.log(''读取文件成功''+dataStr)
})

image-20220321160829439

2.3 向指定的文件中写入文件

2.3.1 fs.writeFile()的语法格式

使用fs.writeFile(方法,可以向指定的文件中写入内容,语法格式如下:

fs.writeFile(file, data[, options], callback)

image-20220328025522694

参数解读:

  • 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
  • 参数2:必选参数,表示要写入的内容。
  • 参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8。
  • 参数4:必选参数,文件写入完成后的回调函数。

2.3.2 fs.writeFile()的示例代码

向指定的文件路径中写入文件内容:

image-20220328025612092

// 1.导入fs文件系统模块
const fs = require(''fs'')

// 2.调用fs.writeFile()方法,写入文件的内容l l
    //参数1:表示文件的存放路径
    //参数2:表示要写入的内容
    //参数3:回调函数
fs.writeFile(''./files/1.txt'',''1231'',function(err){
    //2.1如果文件写入成功,则err的值等于null
    //2.2如果文件写入失败,则err的值等于一个错误对象Ⅰ
    console.log(err)
})

2.3.3 判断文件是否写入成功

可以判断err 对象是否为null,从而知晓文件写入的结果:

image-20220328025623940

// 1.导入fs文件系统模块
const fs = require(''fs'')

// 2.调用fs.writeFile()方法,写入文件的内容l l
  //参数1:表示文件的存放路径
  //参数2:表示要写入的内容
  //参数3:回调函数
fs.writeFile(''./files/1.txt'',''1231'',function(err){
  //2.1如果文件写入成功,则err的值等于null
  //2.2如果文件写入失败,则err的值等于一个错误对象Ⅰ
  console.log(err)
})

2.4 练习–考试成绩整理

使用fs文件系统模块,将素材目录下成绩.txt文件中的考试数据,整理到成绩-ok.txt文件中.

整理前,成绩.txt文件中的数据格式如下:

image-20220328025708573

小红=99 小白=100 小黄=70 小黑=66 小绿=88

整理完成之后,希望得到的成绩-ok.txt文件中的数据格式如下:

image-20220328025717704

小红:99

小白:100

小黄:70

小黑:66

小绿:88

核心实现步骤:

①导入需要的fs文件系统模块

②使用fs.readFile()方法,读取素材目录下的成绩.txt文件

③判断文件是否读取失败

④文件读取成功后,处理成绩数据

⑤将处理完成的成绩数据,调用fs.writeFile()方法,写入到新文件成绩-ok.txt

// 1.导入fs模块
const fs = require(''fs'')

// 2.调用fs.readFile()读取文件的内容
fs.readFile(''./成绩.txt'',''utf8'',function(err,dataStr){
    //3、判断是否读取成功
    if (err) {
        return console.log(''读取失败:''+err.message)
    }
    console.log(''读取成功!数据为:\n''+dataStr)
    //4.1先把成绩的数据,按照空格进行分割
    const arrOld = dataStr.split('' '')
    console.log(arrOld)
    const arrNew = []

    arrOld.forEach(item => {
        //4.2循环分割后的数组,对每一项数据,进行字符串的替换操作
        arrNew.push(item.replace(''='','':''))
    })
    //4.3把新数组中的每一项,进行合并,得到一个新的字符串
    const arrStr = arrNew.join(''\n'')
    //5 调用fs.writeFile()方法,把处理完毕的数据,写入到新文件中。
    fs.writeFile(''./成绩-new.txt'',arrStr,function(err){
        if (err) {
            return console.log(''写入成绩失败!''+err.message)
        }
        console.log(''写入文件成功!文件内容为:'')
        console.log(arrStr)
    })  
})

2.5 fs模块–路径动态拼接的问题

在使用fs模块操作文件时,如果提供的操作路径是以./../开头的相对路径时,很容易出现路径动态拼接错误的问题。
原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径。

image-20220328025831227

const fs = require(''fs'')
//出现路径拼接错误的问题,是因为提供了 ﹒/或../开头的相对路径
//如果要解决这个问题,可以直接提供一个完整的文件存放路径就行

/* fs.readFile(''../demo1/files/1.txt'',''utf8'',function(err,dataStr){
    if (err) {
        return console.log(''文件读取失败''+err.message)
    }
    console.log(''文件读取成功!内容为:''+dataStr)
})*/

fs.readFile(''`D:\\node学习\\demo1\\files\\1.txt`'',''utf8'',function(err,dataStr){
    if (err) {
        return console.log(''文件读取失败''+err.message)
    }
    console.log(''文件读取成功!内容为:''+dataStr)
})

一般路仅位:D:\node学习\demo1\files\1.txt

要经过转义:D:\\node学习\\demo1\\files\\1.txt

解决方案:在使用fs模块操作文件时,直接提供完整的路径,不要提供.../开头的相对路径,从而防止路径动态拼接的问题。

//__dirname 表示当前文件所处的目录
console.log("当前目录为:"+__dirname)
// 示例
fs.readFile(__dirname+''/../demo1/files/1.txt'',''utf8'',function(err,dataStr){
    if (err) {
        return console.log(''文件读取失败''+err.message)
    }
    console.log(''文件读取成功!内容为:''+dataStr)
})

三、path路径模块

3.1 什么是path文件路径模块

path模块是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

例如:

path.join()方法,用来将多个路径片段拼接成一个完整的路径字符串

path.basename()方法,用来从路径字符串中,将文件名解析出来

如果要在JavaScript 代码中,使用path模块来处理路径,则需要使用如下的方式先导入

const path = require(''path'')

3.2 路径拼接

3.2.1 path.join()的语法格式

使用path.join()方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下:

path.join([ . . .paths])

参数解读:

  • ..paths <string>路径片段的序列
  • 返回值: <string>

3.2.2 path.join()的代码示例

使用path.join()方法,可以把多个路径片段拼接为完整的路径字符串:

image-20220328030053355

const path = require(''path'')

// 注意:../会抵消前面的路径
const pathStr = path.join(''/a'',''/b/c'',''../'',''/d'')

console.log(pathStr)

3.3 获取路径中的文件名

3.3.1 path.basename()的语法格式

使用path.basename()方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,语法格式如下:

path.basename(path[ext])

参数解读:

  • path <string>必选参数,表示一个路径的字符串

  • ext <string>可选参数,表示文件扩展名

  • 返回:<string>表示路径中的最后一部分

3.3.2 path.basename()的代码示例

使用path.basename()方法,可以从一个文件路径中,获取到文件的名称部分:

image-20220328030129934

const path = require(''path'')

const fpath = ''/a/b/c/index.html''

const fullname = path.basename(fpath)
console.log(''获取到路径的文件名是:''+fullname)

3.4 获取路径中的文件扩展名

3.4.1 path.extname()的语法格式

使用path.extname()方法,可以获取路径中的扩展名部分,语法格式如下:

path.extname(path)

参数解读:

  • path <string>必选参数,表示一个路径的字符串
  • 返回:<string>返回得到的扩展名字符串
const path = require(''path'')

// 这是文件的扩展路径
const fpath = ''/a/b/c/index.html''

const fullname = path.basename(fpath,''.html'')
console.log(''获取到路径的文件名是:''+fullname)

const aname = path.extname(fpath)
console.log(''获取到的扩展名为:''+aname)

3.5 综合案例–时钟案例

3.5.1 案例要实现的功能

image-20220328030243095

将素材目录下的index.html页面,拆分成三个文件,分别是:

  • index.css
  • index.js
  • index.html

并且将拆分出来的3个文件,存放到clock目录中。

3.5.2 案例的实现步骤

①创建两个正则表达式,分别用来匹配

②使用 fs 模块,读取需要被处理的 HTML 文件

③自定义 resolveCSS 方法,来写入 index.css 样式文件

④自定义 resolveJS 方法,来写入 index.js 脚本文件

⑤自定义 resolveHTML 方法,来写入 index.html 文件

3.5.3 步骤1 - 导入需要的模块并创建正则表达式

image-20220328030526177

//导入fs模块
const fs = require(''fs'')
//导入path模块
const path = require(''path'')

const regStyle = /<style>[\s\S]*<\/style>/

const regScript = /<script>[\s\S]*<\/script>/

3.5.3 步骤2 - 使用 fs 模块读取需要被处理的 html 文件

image-20220328030626328

fs.readFile(path.join(__dirname,''./index.html''),''utf8'',function(err,dataStr){
    if (err) return console.log(''读取文件失败!错误信息为:''+err.message)
    console.log(''读取文件成功!'')
    resolveCSS(dataStr)
    resolveJS(dataStr)
    resolveHTML(dataStr)
})

3.5.3 步骤3 – 自定义 resolveCSS 方法

image-20220328030657771

function resolveCSS(htmlStr) {
    const r1 = regStyle.exec(htmlStr)
    const cssNew = r1[0].replace(''<style>'','''').replace(''</style>'','''')
    fs.writeFile(path.join(__dirname,''./clock/index.css''),cssNew,function(err){
        if(err) return console.log(''写入css失败!错误信息为:''+err.message)
        console.log(''写入css成功!'')
    })
}

3.5.3 步骤4 – 自定义 resolveJS 方法

image-20220328030812698

function resolveJS(htmlStr) {
    const r2 = regScript.exec(htmlStr)
    const jsNew = r2[0].replace(''<script>'','''').replace(''</script>'','''')
    fs.writeFile(path.join(__dirname,''./clock/index.js''),jsNew,function(err){
        if(err) return console.log(''写入script失败!错误信息为:''+err.message)
        console.log(''写入script成功!'')
    })
}

3.5.3 步骤5 – 自定义 resolveHTML 方法

image-20220328030910014

function resolveHTML(htmlStr) {
    const htmlNew = htmlStr
    .replace(regStyle,''<link rel="stylesheet" href="./index.css"></link>'')
    .replace(regScript,''<script src="./index.js"></script>'')
    fs.writeFile(path.join(__dirname,''./clock/index.html''),htmlNew,function(err){
       if(err) return console.log(''写入HTML失败!错误信息为:''+err.message)
        console.log(''写入HTML成功!'')
    })
}

3.5.4 案例的两个注意点

  • fs.writeFile() 方法只能用来创建文件,不能用来创建路径
  • 重复调用 fs.writeFile() 写入同一个文件,新写入的内容会覆盖之前的旧内容

综合案例HTML代码:

image-20220328030243095

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>index首页</title>
  <style>
    html,
    body {
      margin: 0;
      padding: 0;
      height: 100%;
      background-image: linear-gradient(to bottom right, red, gold);
    }

    .box {
      width: 400px;
      height: 250px;
      background-color: rgba(255, 255, 255, 0.6);
      border-radius: 6px;
      position: absolute;
      left: 50%;
      top: 40%;
      transform: translate(-50%, -50%);
      box-shadow: 1px 1px 10px #fff;
      text-shadow: 0px 1px 30px white;

      display: flex;
      justify-content: space-around;
      align-items: center;
      font-size: 70px;
      user-select: none;
      padding: 0 20px;

      /* 盒子投影 */
      -webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0%, transparent), to(rgba(250, 250, 250, .2)));
    }
  </style>
</head>

<body>
  <div class="box">
    <div id="HH">00</div>
    <div>:</div>
    <div id="mm">00</div>
    <div>:</div>
    <div id="ss">00</div>
  </div>

  <script>
    window.onload = function () {
      // 定时器,每隔 1 秒执行 1 次
      setInterval(() => {
        var dt = new Date()
        var HH = dt.getHours()
        var mm = dt.getMinutes()
        var ss = dt.getSeconds()

        // 为页面上的元素赋值
        document.querySelector(''#HH'').innerHTML = padZero(HH)
        document.querySelector(''#mm'').innerHTML = padZero(mm)
        document.querySelector(''#ss'').innerHTML = padZero(ss)
      }, 1000)
    }

    // 补零函数
    function padZero(n) {
      return n > 9 ? n : ''0'' + n
    }
  </script>
</body>

</html>

实现代码:

// 1.1 导入 fs 模块
const fs = require(''fs'')
// 1.2 导入 path 模块
const path = require(''path'')

// 1.3 定义正则表达式,分别匹配 <style></style> 和 <script></script> 标签
const regStyle = /<style>[\s\S]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/

// 2.1 调用 fs.readFile() 方法读取文件
fs.readFile(path.join(__dirname, ''../素材/index.html''), ''utf8'', function(err, dataStr) {
  // 2.2 读取 HTML 文件失败
  if (err) return console.log(''读取HTML文件失败!'' + err.message)
  // 2.3 读取文件成功后,调用对应的三个方法,分别拆解出 css, js, html 文件
  resolveCSS(dataStr)
  resolveJS(dataStr)
  resolveHTML(dataStr)
})

// 3.1 定义处理 css 样式的方法
function resolveCSS(htmlStr) {
  // 3.2 使用正则提取需要的内容
  const r1 = regStyle.exec(htmlStr)
  // 3.3 将提取出来的样式字符串,进行字符串的 replace 替换操作
  const newCSS = r1[0].replace(''<style>'', '''').replace(''</style>'', '''')
  // 3.4 调用 fs.writeFile() 方法,将提取的样式,写入到 clock 目录中 index.css 的文件里面
  fs.writeFile(path.join(__dirname, ''./clock/index.css''), newCSS, function(err) {
    if (err) return console.log(''写入 CSS 样式失败!'' + err.message)
    console.log(''写入样式文件成功!'')
  })
}

// 4.1 定义处理 js 脚本的方法
function resolveJS(htmlStr) {
  // 4.2 通过正则,提取对应的 <script></script> 标签内容
  const r2 = regScript.exec(htmlStr)
  // 4.3 将提取出来的内容,做进一步的处理
  const newJS = r2[0].replace(''<script>'', '''').replace(''</script>'', '''')
  // 4.4 将处理的结果,写入到 clock 目录中的 index.js 文件里面
  fs.writeFile(path.join(__dirname, ''./clock/index.js''), newJS, function(err) {
    if (err) return console.log(''写入 JavaScript 脚本失败!'' + err.message)
    console.log(''写入 JS 脚本成功!'')
  })
}

// 5.1 定义处理 HTML 结构的方法
function resolveHTML(htmlStr) {
  // 5.2 将字符串调用 replace 方法,把内嵌的 style 和 script 标签,替换为外联的 link 和 script 标签
  const newHTML = htmlStr.replace(regStyle, ''<link rel="stylesheet" href="./index.css" />'').replace(regScript, ''<script src="./index.js"></script>'')
  // 5.3 写入 index.html 这个文件
  fs.writeFile(path.join(__dirname, ''./clock/index.html''), newHTML, function(err) {
    if (err) return console.log(''写入 HTML 文件失败!'' + err.message)
    console.log(''写入 HTML 页面成功!'')
  })
}

本文同步分享在 博客“明金同学”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Node.js学习之路01——不同操作系统下Node.js环境搭建

Node.js学习之路01——不同操作系统下Node.js环境搭建

基本介绍

  • 这是一个基本的Node.js环境搭建,不同的操作系统可以选择不同的安装方式
  • 如果不需要太多的安装步骤,就直接在Node.js官网下载最新版安装包进行安装即可

1. Linux环境配置

必须安装的软件

1.1 Ubuntu

  • sudo apt-get install git vim openssl build-essential libssh-dev wget curl

1.2 CentOS

  • 更改yum源与更新系统
  • 首先备份/etc/yum.repos.d/CentOS-Base.repo
  • cd /etc/yum.repos.d/
  • 下载163yum源配置文件wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
  • 运行yum makecache生成缓存yum makecache
  • 更新系统yum -y update

2. Node.js安装(使用NVM)

  • 安装nvm命令curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
  • 安装Node.js版本nvm install <Node.js版本号>,例如nvm install 9.3.0,就是安装Node.js9.3.0版本
  • 如果直接使用node命令没有效果,需要先输入该命令nvm use node
  • 切换cnpm淘宝镜像npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 安装基本的npm依赖包cnpm install http-server express express-generator webpack webpack-dev-server gulp nodemon pm2 vue-cli -g
  • nvm alias default <版本号>
  • nvm ls-remote查看有哪些版本可以安装

3. Sublime安装

3.1 Debian/Ubuntu使用APT安装

  • wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
  • sudo apt-get install apt-transport-https
  • echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list
  • sudo apt-get update
  • sudo apt-get install sublime-text

3.2 CentOS使用Yum安装

  • sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg
  • sudo yum-config-manager --add-repo https://download.sublimetext.com/rpm/stable/x86_64/sublime-text.repo
  • sudo yum install sublime-text

4. MongoDB安装(v3.6)

4.1 Ubuntu安装

  • sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
  • Ubuntu 14.04版本操作系统:echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
  • Ubuntu 16.04版本操作系统:echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
  • sudo apt-get update
  • sudo apt-get install -y mongodb-org
  • sudo apt-get install -y mongodb-org=3.6.1 mongodb-org-server=3.6.1 mongodb-org-shell=3.6.1 mongodb-org-mongos=3.6.1 mongodb-org-tools=3.6.1
  • sudo service mongod start

4.2 CentOS安装(v3.4)

  • /etc/yum.repos.d/mongodb-org-3.4.repo文件下输入一下内容
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
  • 安装mongodb命令sudo yum install -y mongodb-org
  • 开启mongodb服务sudo service mongod start
  • 关闭mongodb服务sudo service mongod stop
  • 重启mongodb服务sudo service mongod restart

4.3 Windows安装

  • 从官网下载安装包进行安装,安装目录为F:/software/MongoDB/
  • 创建data目录,在data目录下创建dblog两个目录
  • 进入F:/software/MongoDB/bin目录,F:\software\MongoDB\bin>mongod --dbpath F:\software\MongoDB\data\db
  • 进入刚创建的log目录,创建mongodb.log文件
  • 进入F:/software/MongoDB/目录,创建mongodb.config配置文件
dbpath=F:/software/MongoDB/data/db
logpath=F:/software/MongoDB/data/log/mongodb.log  
  • 利用管理员身份打开命令行,输入mongod --config F:/software/MongoDB/mongodb.config --install --serviceName "MongoDB"

5.Redis安装

  • 假设本机IP为192.168.0.20
  • 获取文件wget http://download.redis.io/redis-stable.tar.gz
  • 解压文件tar xzvf redis-stable.tar.gz
  • 进入目录cd redis-stable
  • 编译make
  • 安装make install
  • 设置配置文件路径mkdir -p /etc/redis,cp redis.conf /etc/redis
  • 修改配置文件vi /etc/redis/redis.conf

    • daemonize no该为daemonize yes
    • bind 127.0.0.1
    • bind 192.168.0.20
  • 启动/usr/local/bin/redis-server /etc/redis/redis.conf
  • 查看启动ps -ef | grep redis

6. Yarn安装

  • yarn config set registry https://registry.npm/taobao.org

6.1 Debian/Ubuntu

  • curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
  • echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
  • sudo apt-get update && sudo apt-get install yarn

6.2 CentOS/Fedora/RHEL

  • sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
  • curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
  • sudo yum install yarn

7. git的使用方法

  • 安装git软件yum install git-core
  • 生成ssh命令ssh-keygen -t rsa -C "yourmail@mail.com"
  • 配置用户名git config --global user.name "Dawnight"
  • 配置邮箱git config --global user.email "yourmail@mail.com"
  • 添加文件到缓存区git add .
  • 查看文件状态git status
  • 提交命令git commit -m "some messages"
  • 移除远程源git remote rm origin
  • 提交代码到远程git remote add origin <remoteRepositoryAddress>
  • 将代码推送到远程git push origin master
  • 将本地代码与远程同步git pull origin master,同步master代码
  • 查看本地分支git branch -a
  • 查看远程分支git branch -r
  • 创建本地分支git branch <branchName>
  • 切换分支git checkout <branchName>
  • 将本地分支push到远程分支git push origin <localBranchName>:<remoteBranchName>,只写这一条命令,表示创建一个远程分支
  • git的提交记录导出为文件git --no-pager log > log.txt

关于Node.js学习——开篇node.js开发实战详解的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Deno从零到架构级系列(一)——开篇、JS学习——函数、Node.Js学习day01【初识 Node.js 与内置模块】、Node.js学习之路01——不同操作系统下Node.js环境搭建等相关知识的信息别忘了在本站进行查找喔。

本文标签: