资源
各种进阶资源 + 联系方式请看下方链接
资源
首先进入node的官网 下载node 可以使用LTS稳定版 也可使用CURRENT 在这里使用后者
node的模块规范 commonjs node里面有global对象相当于浏览器中的window
process代表当前进程挂在global下面的可直接使用
commonjs
首先新建一个文件夹 然后新建文件 user.js 在里面写console.log(‘This is a china’) 在控制台或终端 定位到这个文件夹 然后用 node user.js 命令 会打印出 这句 This is a china
如果想要看执行这句命令的时候 node究竟做了什么 可以在控制台输入
node --inspect-brk normailze.js 启动一个服务 然后 打开Chrome 在地址栏输入
chrome://inspect 然后点击页面中的inspect 就可以看到实际代码了
(function (exports, require, module, __filename, __dirname) { // const {normailze} = require('path')
// console.log(normailze('///user/bin.js'))
console.log('This is a china')
});
export代表模块的输出 对外提供一些接口 提供一些属性
require代表调用别的模块的时候调动的一些function
module代表模块本身
其中 module属性里面还有个export需要注意 以及__filename代表文件路径
__dirname代表文件所在文件夹的路径 都是绝对路径
commonjs 规定
- 每个文件都是一个模块 有自己的作用域
- 在模块内部 module变量代表模块本身
- module.exports属性代表模块对外接口
require规则
- / 表示绝对路径, ./表示相对与当前文件的路径
- 支持js. json . node 扩展名 不写的话依次尝试
- 不写路径则认为是build-in模块或者各级node_modules内的第三方模块
require特性
- module 被加载时执行 加载后缓存(也就是说当第二次调用就直接用缓存里面的 如果在一个js里面 require了两个一摸一样的模块 只会调用一次)
- 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出
引用系统内置模块
const fs = require('fs')//fs是系统内置模块 可进行读写删除等操作
const result = fs.readFile('fs.js',(err,data)=>{ //在这里用fs这个内置模块读自己 第一个参数是文件名 第二个参数是一个回调函数 因为读文件是异步操作 所以 下面打印的result会输出undefined
if(err){
console.log(err)
}else{
console.log(data); //会输出Buffer后跟16进制的数字 如果想读懂的话就可以用 data.toString()
}
})
console.log(result);
引用第三方模块
- 引用第三方模块首先要用npm安装第三方模块 这里会用chalk模块来举例
- 首先 npm install chalk 安装完成之后会多一个node_modules的文件夹
const chalk = require('chalk')
console.log(chalk.red('This is red')) //此模块的功能就是可以把输出的字体变成自己想要的颜色
现在的node_modules下安装的依赖 以及依赖的依赖都是平级的 之前是做成树状的 现在这种优化了查找以及可能一个依赖安装十多遍 的问题
exports 和 modules.exports之间有什么区别
- const exports = module.exports
- 根据上述语句可以看出 exports是module.exports的一个快捷方式 但是要注意一点 不要改变exports的指向 例如
- exports = {a:1} 这种就相当于改变了exports的指向 使之不指向 module.exports了
- 如果想使用引用值的话 就直接用module.exports = {}就行了
global全局对象
- CommonJS
- Buffer 、process、 console
- timer
- 简单使用场景 如
moduleA.JS
const testVal = 1000;
global.testVal = 200 //如果没有这一句 下面的console.log(testVal)会报错
module.exports.testVal = testVal
moduleB.JS
const mod = require('./global.js')
console.log(mod.testVal)
console.log(testVal)
process进程中常用的方法
- 参数相关 (node启动的时候查看启动相关的参数)
- 可以在文件中通过以下代码查看 这几个对象里面都是什么
const {argv,argv0,execArgv,execPath} = process
argv.forEach(item=>{
console.log(item); //会打印出两个参数 第一个是node的路径
//第二个是当前文件的路径
//也可以通过在控制台输入node argv.js --test a = 1之类的外部命令
//这样就可以在控制台读出除了两个参数外的 --test a = 1
})
console.log(argv0)//对argv第一个值的引用
console.log(execArgv) //可在node --inspect argv.js 在node读取文件之间写参数
console.log(execPath)//当前脚本的路径 也就是argv里面的第一个参数
- const {env} = process
- console.log(env) 可以看到很多的可以直接调用的属性
- console.log(process.cwd())可以打印当前执行的路径
- setImmediate(()=>{}) 这个是在global中的传入一个参数 当前事件队列执行完之后在执行 与之对应相关的是 process.nextTick(()=>{})也是传入一个参数 但是他是放在了当前队列的最后一个执行 而setImmediate是放在了下个队列的队首 所以process.nextTick要比setImmediate先执行 而setTimeout是在他们两个中间 大部分情况下用setImmediate就行 因为如果process.nextTick里面循环调用就会阻塞后面的执行
调试
- 可以使用 Inspector 或者vscode
- 如果使用inspector 可以看commonjs模块. 打断点啥的都是平常差不多的
- 使用vscode调试步骤
- 点击左侧调试按钮 也可Ctrl+Shift+D快捷键 然后点击左侧上方出现的设置图标 然后替换代码
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Current file", "program": "${file}", "cwd": "${cwd}" }, { "type": "node", "request": "launch", "name": "Launch Program", "program": "${file}" } ] }
然后就可以调试了
也可点击断点添加条件调试 只有完成条件的时候才会触发