##require 的实现机制
- 将传入的模块 ID 通过加载规则找到对应的模块文件
- 读取这个文件里面的代码
- 通过拼接的方式为该段代码构建私有空间
- 执行该代码
- 拿到 module.exports 返回
##模块的缓存
- 第一次加载某个模块时,Node 会缓存该模块。以后再加载该模块,就直接从缓存取出该模块的 module.exports 属性(不会再次执行该模块)
- 如果需要多次执行模块中的代码,一般可以让模块暴露行为(函数)
- 模块的缓存可以通过 require.cache 拿到,同样也可以删除
index.js
```js
// 模块的缓存
'use strict';
function $require(id) {
const fs = require('fs');
const path = require('path');
const filename = path.join(__dirname, id); // pathto/module1.js
$require.cache = $require.cache || {};
if ($require.cache[filename]) {
//
return $require.cache[filename].exports;
}
// 没有缓存 第一次
const dirname = path.dirname(filename); // pathto
let code = fs.readFileSync(filename, 'utf8');
// 定义一个数据容器,用容器去装模块导出的成员
let module = { id: filename, exports: {} };
let exports = module.exports; // module.exports
code = `
(function($require, module, exports, __dirname, __filename) {
${code}
})($require, module, exports, dirname, filename);`;
eval(code);
// 缓存起来
$require.cache[filename] = module;
return module.exports;
}
setInterval(() => {
var date = $require('./module/date.js');
console.log(date.getTime());
}, 1000);
```
module/date.js
```
console.log('date module exec');
module.exports = new Date();
```
- 简介
- 配置安装
- window
- 基础知识
- Node 命令基本用法
- 进程和线程
- 调试
- 异步、回调
- 全局对象
- 非阻塞 I/O和事件驱动和非阻塞机制
- npm包概念
- 模块化
- 实现require和cache
- 核心模块操作
- fs文件系统操作
- 同步调用和异步调用
- 缓冲区处理(二进制数据)
- 文件读取
- 文件写入
- 例子:读取歌词文件显示
- 文件流
- 例子:文件复制
- 监视文件
- 其他文件操作
- 目录操作
- 例子:递归加载目录树
- path路径操作模块
- 网络操作
- URL 解析模块
- querystring查询字符串模块
- crypto加密解密模块
- Socket
- 例子:聊天室
- coffeescript
- Gulp-自动化构建工具
- Gulp实现前端构建
- Gulp后端构建
- 插件
- gulp-load-plugins 模块化管理插件
- gulp-minify-css 压缩css插件
- gulp-sass 将sass预处理为css
- gulp-less 将less预处理为css
- gulp-sourcemaps 插件
- gulp-concat 合并插件
- gulp-uglify 压缩JS插件
- gulp-util gulp常用工具库插件
- yargs插件
- gulp-nodemon 自动启动/重启插件
- coffee-script 插件
- gulp-coffee插件
- gulp-livereload 网页自动刷新
- Moment.js-处理时间插件
- express 前端框架
- Async-异步流程控制插件
- node-progress进度条插件
- JSHint-代码规范检查工具
- lodash -JavaScript 工具库
- 资料
- 框架所用包
- bodyParser