一、node的模块化

// 全局变量就是可以直接访问的变量
// 如果定义在global上的属性,肯定是一个全局变量, 可以直接访问
// node 里面默认在文件中打印this的问题
console.log(process.version);
console.log(global);
console.log(this);   // 在文件执行的过程中,默认这个文件会被加一层函数 主要是为了实现node的模块化功能
 
// 通过函数的参数进行传入,我们在文件中可以直接进行访问
// exports require module __filename  __direname
console.log(__filename); //当前的这个文件  绝对路径
console.log(__dirname);  // 当前文件运行的文件夹
console.log(process.cwd());  //当前工作目录  可以更改
 
// node 中模块化会使用到这三个属性,exports require module node 
// 模块化  
    /**
     * 1.可以帮我们解决命名冲突的问题  
     * 2.每一个js文件 都是一个模块  
     * 3.模块之间可以相互引用 
     * 4.module.exports
     * module.exports 导出模块  node的规范 common.js 规范
     * 每个文件外面都会包装一个函数
     * 高内聚  低耦合
     * esModule (es6规范) cmd(sea.js)  amd(require.js)  umd(统一模块化规范,cmd amd common,不包含es6)
     * 两大主流:esModule,common.js node中默认不支持es6 
     * common.js 规范动态引入,import 静态引入 
     * node中的模块化实现 ==  webpack模块的实现
     * node中的模块是如何加载的
     * 
     * 目前如果在node中使用import或者export 则要使用babel-node来进行转化
     * 
     * node中的模块可以分为三类
     * 
     * 1.核心模块(内置模块)fs http path 不需要安装 引入的时候不需要增加相对路径、绝对路径
     * 2.第三方模块 require('co')  需要安装 别人写的
     * 3.自定义模块 需要通过绝对路径或者相对路径引入 
     * */
 
    console.log(Object.keys(global))

二、核心模块

// fs path vm 
// fs:file system  path:操作路径的   vm 做一个虚拟运行环境
// readFileSync    同步  读取文件全部使用绝对路径
/* const fs=require("fs");
let r=fs.readFileSync('.gitignore','utf-8');
console.log(r); */
// 如果需要拼接/ 必须采用join resolve 会回到根目录
const fs=require("fs");
const path=require('path');
let w=path.join('a','b','c','/');   //拼接  join 可以拼接/
let r1=path.resolve(__dirname,'a','b','c','/');  //解析出绝对路径
console.log(w,r1);
/* let flag=fs.existsSync(path.resolve(__dirname),'../../.gitignore');
if(flag){
    let r=fs.readFileSync('.gitignore','utf-8');
} */
let ext=path.extname('a.js');
let basename=path.basename('a.js','js');
console.log(ext,basename);
  let vm=require("vm");
// eval  new Function
// 如果在前端中,如果在前端中需要让一个模块执行,
// 模块之间要相互独立,不希望模块之间的变量共享
let a=100000;
let str=`console.log(a)`;
eval(str);
 
vm.runInContext()   //沙箱环境,就是一个干净的运行环境

三、node中采用同步读取文件

//node 中可以采用同步的方式读取文件
// 异步代码需要通过回调函数来解决
// 闭包是有返回值的。
let a=require("./a.js")
console.log(a)
 
/* let a=function (exports,require,module,__filename,__dirname){
    module.exports="hello";
    return module.exports;
}() */
 
// 通过读取文件内容,将内容包装到一个自执行函数中,默认返回module.exports 作为函数的结果
  
function sum(a){
    return function (){
 
    }
}
 
let fn=sum('1');
fn('2');
 
/***
 * 1.通过浏览器中调试node代码
 * 2.vscode 进行代码调试
 */