`命令行工具
-
常用指令
- dir——列出当前目录下的所有文件
- cd 目录名 ——进入到指定的目录
- md 目录名 ——创建一个文件夹
- rd 目录名 —— 删除一个文件夹
-
目录
- . 当前目录(省略了/)
- … 上一级目录
-
环境变量
-
path: 都是路径,配置常用的东西,可以直接在命令行窗口里任意位置打开里面的文件。
当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开如果没有找到则会依次到环该变量path的路径中寻找,直到找到,没找到就报错。
-
进程和线程
- 进程:进程负责为程序的运行提供必备的环境
- 线程:线程是计算机中的最小的计算单位,线程负责执行进程中的程序
- 单线程:JS就是单线程。node也是单线程
- 多线程:快,但是存在安全问题和冲突问题
Node.js
node.js是一个能够在服务器端运行Js的开放源代码、跨平台JavaScript运行环境。采用goodle开发的v8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术提高性能,可优化应用程序的传输量和规模。
优点:高并发好。
学会nodejs,能够明确数据交互的错误在前端还是后端,能够书写API,能了解前后端的交互流程,全栈工程师(nvm可以切换node版本)
repl环境:直接在命令行写代码
模块化
nodejs提供了一个简单的模块系统让Node.js的文件可以互相调用。模块加载采用的格式同步加载的common.js规范。
commonjs:
-
每个文件都是封闭的一个模块,模块里定义的变量、函数、类都是私有的
-
module代表当前模块,module是封闭的,但它的exports属性向外提供调用接口
-
require加载模块。读取并执行一个js文件。然后返回该模块的exports对象
-
commonjs是同步加载的。因此模块加载的顺序严格按照代码书写的顺序执行
-
模块可以多次加载,但在第一次加载之后模块会被编译执行,放入缓存,后续的require直接从缓存里取值,模块代码不再编译执行
require内部处理流程
- 检查Module._cache是否缓存了指定模块
- 如果缓存没有的话。就创建—个新的module实例将它保存到缓存
- module.load()加载指定模块
- 在解析的过程中如果发生异常,就从缓存中删除该模块
- 返回该模块的module.exports
模块化导出方式
-
global.xxx = xxx; 导出全局变量,只要导入相应js文件即可调用
-
module.exports = “str”;
-
module.exports.xxxx= 'str‘
-
exports.xxx= ‘str’
exports = 'str‘ 这样写是不行的
其实前面看过nodejs的课,但是总觉得学了像没学一样,找了几个视频 也没有那么满意,要么就声音特别小,结尾广告猝不及防声音巨大,要么就是感觉一点原理都没讲,所以我又双叒去看文档啦
Node.js
repl:
-
在命令行输入node开启repl环境:可以直接在命令行写代码。
-
尝试输入 JavaScript 类的名称,例如
Number
,添加一个点号并按下tab
。REPL 会打印可以在该类上访问的所有属性和方法。是tab!!这种状态下回车默认是没写完换行的。按Tab哦!![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6RxD89m-1650281977489)(E:\markdown\前端\csdn\20220417_1.png)]
-
通过输入
global.
并按下tab
,可以检查可以访问的全局变量。 -
特殊命令:
.help
: 显示点命令的帮助。.editor
: 启用编辑器模式,可以轻松地编写多行 JavaScript 代码。当处于此模式时,按下 ctrl+D 可以运行编写的代码。.break
: 当输入多行的表达式时,输入.break
命令可以中止进一步的输入。相当于按下 ctrl+C。.clear
: 将 REPL 上下文重置为空对象,并清除当前正在输入的任何多行的表达式。(clr是在命令行里面用的,这是repl模式,失效).load
: 加载 JavaScript 文件(相对于当前工作目录)。.save
: 将在 REPL 会话中输入的所有内容保存到文件(需指定文件名)。.exit
: 退出 REPL(相当于按下两次 ctrl-C)。
从命令行接收参数
方法:使用node.js内置的process对象的argv属性。这个属性包含所有命令行调用参数的数组。这个数组中第一个参数是node命令的完整路径,第二个参数是正被执行的文件的完整路径(node xx.js 里面xx的路径),第三个开始就是其他的参数。
因为argv属性是一个数组,所以可以用数组的方法遍历
process.argv.forEach((val, index) => {
console.log(`${
index}: ${
val}`)
})
同样也可以使用slice方法去排除前两个路径参数,从下标2开始获取其他内容:const args = process.argv.slice(2)
若
args[0]
是name=joe
这种格式的数据,需要对其进行解析。 最好的方法是使用minimist
库,该库有助于处理参数:
const args = require('minimist')(process.argv.slice(2))
输出到命令行
基本与浏览器中的console相同。也可以通过传入变量和格式说明符格式化用语(和c用法类似,%s
字符串;%d
数字;%i
整数部分;%o
对象)console.log('我的%s已经%d岁', '猫', 2)
-
console.clear()
会清除控制台(其行为可能取决于所使用的控制台)。 -
console.count()
方法会对打印的字符串的次数进行计数,并在其旁边打印计数。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E1EHBrVM-1650281977490)(E:\markdown\前端\csdn\20220417_2.png)]
-
console.trace()
可以打印堆栈踪迹 -
time()
和timeEnd()
轻松地计算函数运行所需的时间:就是把要测算耗时的函数放在time() 和 timeEnd()之间console.time('doSomething()') doSomething() console.timeEnd('doSomething()')
-
stdout和stderr:console.log在控制台打印消息,就是标准输出,stdout;console.err会打印到stderr流,不出现在控制台,而出现在错误日志中。
-
改变输出的颜色:推荐Chalk库。可以使用
npm install chalk
进行安装,使用:console.log(chalk.yellow('你好'))
。这样就可以替代转义代码console.log('\x1b[33m%s\x1b[0m', '你好')
-
创建进度条,Progress包,
npm install progress
进行安装。这个就说当前的索引就是进度条本身,创建一个10步的进度条,100ms完成一步,全部完成就清除定时器。想详细了解参数可以参考这个包的说明:https://www.npmjs.com/package/progressconst ProgressBar = require('progress') const bar = new ProgressBar(':bar', { total: 10 }) const timer = setInterval(() => {