Open HolyZheng opened 5 years ago
借助v8引擎,利用c++编写了一个程序——node.exe。所以node是一个JavaScript 的 runtime environment。它跟浏览器提供的runtime environment不完全一致,例如没有document 对象,但是又多了很多浏览器没有提供的对象比如fs http 等等。直白点就是node是一个JavaScript 的 runtime environment。
node以一种异步的方式工作,一个单线程可以处理多个请求,当处理某个请求的时候,执行了相应的请求代码后,不需等待其返回结果,直接处理其他请求。正在等待的请求会放到一个事件队列里
node自带的模块有 os,fs,events,http等。
// node.js var me = '' console.log(global.me) // undefined // js var me = '' console.log(window.me) // ''
因为在JavaScript中,全局环境下定义的变量和方法会添加到全局对象window中,而在node文件中定义的变量和方法,只属于该文件作用域而不是属于global。在node中通常一个文件被认为是一个模块。模块内定义的所以变量和方法都是该模块私有的,如果我们想在模块外使用该模块里的变量或方法,需要将该变量和方法 export 出去。一个node应用通常为模块的集合——主模块和功能模块。
export
// node.js console.log(module) Module { id: '.', exports: {}, parent: null, filename: 'E:\\documents\\Code_learn\\try\\express-learn\\en.js', loaded: false, children: [], paths: [ 'E:\\documents\\Code_learn\\try\\express-learn\\node_modules', 'E:\\documents\\Code_learn\\try\\node_modules', 'E:\\documents\\Code_learn\\node_modules', 'E:\\documents\\node_modules', 'E:\\node_modules' ] }
module.exports 这个对象默认情况下为空对象,任何被添加到该对象中的变量和方法都会从该模块中暴露出去,这些变量和方法变得可在模块外使用。 require 方法用来引入其他模块。
module.exports
require
// log.js let log = () => { console.log(1) } module.exports.log = log // en.js let ob = require('./log') console.log(ob) $ node en.js { log: [Function: log] }
// log.js let log = () => { console.log(1) } module.exports = log // en.js let ob = require('./log') console.log(ob) $ node en.js [Function: log]
node是如何实现它的模块化的呢?其实我们的每一个文件node都会把它转变成一个立即执行函数:
(function (exports, require, module, __filename, __dirname) { // some code in our file })
所以我们每一个文件中的exports require module等并不是全局变量,而是通过该函数的参数传递进来的实参。其中exports是一个指向module.exports的指针。也就是说在每一个模块中:
exports
module
// 我们可以通过以下方式来导出对象或方法 module.exports = fn module.exports.fn = fn module.exports = { fn } exports.fn = fn // 但是不能,因为这样只是改变了exports指向 exports = fn
我们可以看看filename,dirname两个参数的值:
console.log(__dirname) // 该文件所在的目录 console.log(__filename) // 该文件目录 E:\documents\Code_learn\try\express-learn E:\documents\Code_learn\try\express-learn\en.js
node中有很多比较常用的module,比如Buffer,HTTP,File System,OS,Path,Process,Query String,Stream等。
官网相应文档:path
const path = require('path') // 将路径转为一个对象 var pathObj = path.parse(__filename) console.log(pathObj) $ node en.js { root: 'E:\\', dir: 'E:\\documents\\Code_learn\\try\\express-learn', base: 'en.js', ext: '.js', name: 'en' }
官网相关文档:OS
const os = require('os') var totalMemory = os.totalmem() var freeMemory = os.freemem() console.log(`Total Memory: ${totalMemory}`) console.log(`Free Memory: ${freeMemory}`) $ node en.js Total Memory: 8476856320 Free Memory: 3928731648
官网相关文档:file system
const fs = require('fs') // 同步 const files = fs.readdirSync('./') console.log('Sync', files) // 异步 fs.readdir('./', (err, files) => { if (err) console.log(err) else console.log('Async', files) }) $ node en.js Sync [ 'a', 'en.js', 'log.js', 'package.json' ] Async [ 'a', 'en.js', 'log.js', 'package.json' ]
官网相关文档: Event
// logger.js const EventEmitter = require('events') class Logger extends EventEmitter { log () { this.emit('messageLogged', {one: 1, two: 2}) } } module.exports = Logger // app.js const Logger = require('./logger') const logger = new Logger(); logger.on('messageLogged', (arg) => { console.log('Listener called', arg) }) logger.log() $ node app.js Listener called { one: 1, two: 2 }
官网相关文档:HTTP
const http = require('http') const server = http.createServer((req, res) => { if (req.url === '/') { res.write('Hello World') } }) server.listen(3000) console.log('Listening on port 3000!')
什么是node
借助v8引擎,利用c++编写了一个程序——node.exe。所以node是一个JavaScript 的 runtime environment。它跟浏览器提供的runtime environment不完全一致,例如没有document 对象,但是又多了很多浏览器没有提供的对象比如fs http 等等。直白点就是node是一个JavaScript 的 runtime environment。
node如何工作
node以一种异步的方式工作,一个单线程可以处理多个请求,当处理某个请求的时候,执行了相应的请求代码后,不需等待其返回结果,直接处理其他请求。正在等待的请求会放到一个事件队列里
模块系统
node自带的模块有 os,fs,events,http等。
因为在JavaScript中,全局环境下定义的变量和方法会添加到全局对象window中,而在node文件中定义的变量和方法,只属于该文件作用域而不是属于global。在node中通常一个文件被认为是一个模块。模块内定义的所以变量和方法都是该模块私有的,如果我们想在模块外使用该模块里的变量或方法,需要将该变量和方法
export
出去。一个node应用通常为模块的集合——主模块和功能模块。module.exports
这个对象默认情况下为空对象,任何被添加到该对象中的变量和方法都会从该模块中暴露出去,这些变量和方法变得可在模块外使用。require
方法用来引入其他模块。node是如何实现它的模块化的呢?其实我们的每一个文件node都会把它转变成一个立即执行函数:
所以我们每一个文件中的
exports
require
module
等并不是全局变量,而是通过该函数的参数传递进来的实参。其中exports是一个指向module.exports的指针。也就是说在每一个模块中:我们可以看看filename,dirname两个参数的值:
常用的 node module
node中有很多比较常用的module,比如Buffer,HTTP,File System,OS,Path,Process,Query String,Stream等。
path module
官网相应文档:path
os mudule
官网相关文档:OS
File System
官网相关文档:file system
Event
官网相关文档: Event
HTTP module
官网相关文档:HTTP