官方定义:Node.js是一个基于V8 JavaScript引擎的JavaScript运行时的环境
node js.js num=10
console.log(process.argv);
[
'F:\\nodejs\\node.exe',
'D:\\Mrzhang\\Study\\前端\\CSS\\code\\js.js',
'num=10',
]
console.log()
即可process.argv
是比较常用的setTimeout
setInterval
setImmediate(function () {})
process.nextTick(function(){})
这些对象实际上是 模块中的变量,只是 每个模块都有,看起来是全局变量
在命令行交互中不可以使用
__dirname/__filename/exports/module/require()
//显示文件所在目录(不包含文件名称)
console.log(__dirname);
//显示文件所在目录(包含文件名称)
console.log(__filename);
模块化的提出,主要是为了应对前端页面更加复杂的局面
在ES正式提出模块化前,社区提出了模块化的规范CommonJS(依旧再用),AMD、CMD(后面的两者均不在用了)
在ES6的时候,正式提出了标准的模块化ESModule
CommonJS是一个规范,最开始提出来的时候,主要应用于服务器的
Node是CommonJS在服务器端一个具有代表性的实现
Browserify是CommonJS在浏览器中的一种实现
webpack打包工具具备对CommonJS的支持和转换
因为Node对CmmmonJS进行了支持和实现,因此在开发Node过程中可以使用模块化开发
需要导出的文件
let until_name = "until";
function foo() {
console.log("zhangcheng");
}
function bar() {
console.log("bar");
}
//导出相关变量
exports.until_name = until_name;
exports.foo = foo;
exports.bar = bar;
//引入变量
const until = require("./until.js");
//可以通过until.的方式访问变量
console.log(until.until_name);
until.foo();
until.bar();
-----------------------------------------
//我们可以借助解构赋值的方式,简化代码
//引入变量
const { until_name, foo, bar } = require("./until.js");
console.log(until_name);
foo();
bar();
exports实际上是一个对象,通过require函数,将导入文件中的变量与exports进行了引用赋值
exports.name
的值,并在两个文件中打印,即可观察到CommonJS导出,实际上是通过module.exports进行导出的,而module.exports和exports是同一个对象
let until_name = "until";
function foo() {
console.log("zhangcheng");
}
function bar() {
console.log("bar");
}
//导出相关变量
module.exports.until_name = until_name;
module.exports.foo = foo;
module.exports.bar = bar;
let until_name = "until";
function foo() {
console.log("zhangcheng");
}
function bar() {
console.log("bar");
}
//导出相关变量
module.exports = {
until_name,
foo,
bar,
};
let until_name = "until";
function foo() {
console.log("zhangcheng");
}
function bar() {
console.log("bar");
}
//导出相关变量
module.exports = {
until_name,
foo,
bar,
};
//在导入的时候,until_name为“until”,而不是“hhhh”
exports.until_name = "hhhh"
module.exports
进行导出通过 module.exports = {}
进行导出
因此通过以上两幅图,可以看出,在内存中 module.exports
和 exports
的对应关系
那么我们通过维基百科中对 CommonJS规范的解析
我们知道 require是一个函数,可以帮助我们引入一个文件(模块)中导出的对象,接下来,我们就要看一下它的查找规则是什么样的
require(X)
//会直接返回核心模块,并停止查找
const http = require("http")
const until = require(./until)
//首先会将until当成文件,查找until.js/until.json/until.node
//若没有查到,就会将until当成目录,查找它下面的index.js/index.json/index.node文件
const axios = require("axios")
//会在node_module目录中查找axios
const until = require(./until)
//until.js中的代码会先运行一次
//打印------
console.log(------);
//运行until.js中的代码
const until = require(./until)
//打印+++++
console.log(+++++);
//下面的引入不会再被加载
const until1 = require(./until)
const until2 = require(./until)
const until3 = require(./until)
ES6提出的模块化,前提是浏览器支持
与CommonJS不同之处
采用ES Module会默认采用严格模式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<!--注意,在本地测试的时候,ES Module需要启用live server进行测试,单纯运行文件不行-->
<script src="./main.js" type="module"></script>
<!--until.js暴露变量-->
<script src="./until.js" type="module"></script>
</body>
</html>
let until_name = "until";
function foo() {
console.log("zhangcheng");
}
function bar() {
console.log("bar");
}
//导出相关变量
export { until_name, foo, bar };
import { until_name, foo, bar } from "./until.js";
console.log(until_name);
foo();
bar();
//通过export直接导出
export{name,foo}
//导出的时候取别名
export{name as unName}
//直接导出变量
export let name = "zhangcheng"
//直接导入
import {name} from "./until.js"
//导入的时候取别名
import {name as unName} from "./until.js"
//导入的时候将这个module取别名
import * as foo from "./until.js"
foo.name
常见于开源的框架中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script src="./main.js" type="module"></script>
</body>
</html>
import { name, foo } from "./until/index.js";
console.log(name);
console.log(foo());
//统一引入
import { name } from "./tool.js";
import { foo } from "./tool2.js";
//统一导出
export { name, foo };
------------------还可以做出以下优化
//export和import的结合
export { name } from "./tool.js";
export { foo } from "./tool2.js";
//写成这样也可以
export * from "./tool.js";
export * from "./tool2.js";
export let name = "zhangcheng";
export function foo() {
return "foo";
}
前面用到的都是有名字的导出,default是默认导出
//默认导出方式一
function foo() {
console.log(123);
}
export default foo;
//默认导出方式二
export default function(){
console.log(123)
}
import aaa from "./until.js"
aaa()
当我们需要动态引入文件的时候,需要用到import函数
import {name} from "./index.js"
//逻辑代码
let flag = true
if(flag){
import("./index.js").then(res=>{
console.log(res)
})
}