关于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开发实战详解)
- Deno从零到架构级系列(一)——开篇
- JS学习——函数
- Node.Js学习day01【初识 Node.js 与内置模块】
- Node.js学习之路01——不同操作系统下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开始,飞狐带来的绝对到目前为止前所未有的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的性能比较,但在目前我认为做这两者的性能比较完全没有必要。
安装
我们一开始甭管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了,如下图:
框架之选
众所周知,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 });
在运行的时候,可能会报错,如下:
是不是有点受挫。其实大可不必,这个问题是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测试接口):
拆分路由
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一样,如下图:
从上图可以看到,这样根本就不需要router文件啦。不管是node、deno还是golang,飞狐真的很不喜欢一个单独的router文件去维护路由,太麻烦。所以每次搭架子的时候,我一定是先把路由给搞定了,免得麻烦。现在理解为啥下回直接开干注解路由了吧,deno的注解路由还是很一波三折的,因为完全照搬node会有些坑。期待吧,嘿嘿~
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能够知道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 的组成部分:
1.1.2 为什么 JavaScript 可以在浏览器中被执行
不同的浏览器使用不同的 JavaScript 解析引擎:
- Chrome 浏览器 => V8
- Firefox 浏览器 => OdinMonkey(奥丁猴)
- Safri 浏览器 => JSCore
- IE 浏览器 => Chakra(查克拉)
- etc…
其中,Chrome 浏览器的 V8 解析引擎性能最好!
1.1.4 为什么JavaScript可以操作DOM和BOM?
每个浏览器都内置了DOM、BOM这样的API函数,因此,浏览器中的JavaScript才可以调用它们。
1.1.5 浏览器中的JavaScript运行环境
运行环境是指代码正常运行所需的必要环境。
- V8 引擎负责解析和执行 JavaScript 代码。
- 内置 API 是由运行环境提供的特殊接口,只能在所属的运行环境中被调用。
1.1.6 JavaScript能否做后端开发?
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的运行环境
注意:
浏览器
是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/),点陆绿色的按钮,下载所需的版本后,双击直接安装即可。
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
后直接回车,即可打开终端。
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
的编码格式,读取指定文件的内容,并打印err
和dataStr·
的值:
//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()的示例代码
向指定的文件路径中,写入文件内容:
//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,从而知晓文件读取的结果:
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)
})
2.3 向指定的文件中写入文件
2.3.1 fs.writeFile()的语法格式
使用fs.writeFile(方法,可以向指定的文件中写入内容,语法格式如下:
fs.writeFile(file, data[, options], callback)
参数解读:
- 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
- 参数2:必选参数,表示要写入的内容。
- 参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8。
- 参数4:必选参数,文件写入完成后的回调函数。
2.3.2 fs.writeFile()的示例代码
向指定的文件路径中写入文件内容:
// 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,从而知晓文件写入的结果:
// 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
文件中的数据格式如下:
小红=99 小白=100 小黄=70 小黑=66 小绿=88
整理完成之后,希望得到的成绩-ok.txt
文件中的数据格式如下:
小红: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命令时所处的目录
,动态拼接出被操作文件的完整路径。
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()方法,可以把多个路径片段拼接为完整的路径字符串:
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()
方法,可以从一个文件路径中,获取到文件的名称部分:
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 案例要实现的功能
将素材目录下的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 - 导入需要的模块并创建正则表达式
//导入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 文件
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 方法
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 方法
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 方法
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代码:
<!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
环境搭建,不同的操作系统可以选择不同的安装方式 - 如果不需要太多的安装步骤,就直接在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/
- 下载
163
的yum
源配置文件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.js
9.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
目录下创建db
和log
两个目录 - 进入
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环境搭建等相关知识的信息别忘了在本站进行查找喔。
本文标签: