CommonJS和 ES6 模块系统是 JavaScript 中两种主要的模块处理方式。它们在语法、加载方式和使用场景上都有显著的区别。
type
字段的产生用于定义package.json
文件和该文件所在目录根目录中.js
文件和无拓展名文件的处理方式。值为'moduel'
则当作es模块处理;值为commonjs
则被当作CommonJs模块处理pacakage.json
没有定义type
字段,则按照CommonJs规范处理package.json
中type
字段的值package.json
中的type
字段为何值,.mjs
的文件都按照es模块来处理,.cjs
的文件都按照CommonJs模块来处理module.exports
和 require
。export
和 import
。CommonJS 和 ES6 模块系统各有优缺点,选择哪种模块系统取决于你的项目需求和运行环境。对于新的前端项目,推荐使用 ES6 模块,因为它是 JavaScript 的官方标准,并且支持更好的优化。对于现有的 Node.js 项目,CommonJS 仍然是一个可靠的选择。
CommonJs主要为了解决ES6之前无模块概念的问题
引入核心模块不需要写路径,引入文件模块需要写路径(一般是相对路径./
或../
开头)
other.js
var msg = 'this is a model';
function myFunc(){
console.log('this is a function by model');
}
// 批量导出
module.exports = {
msg,
myFunc,
name: 'my name'
}
index.js
// 变量名字可以随便起,一般为文件名
// 引入同目录下的model.js,如果是相对路径,必须以./开头
// 此处的model.js的.js可以省略
var other = require('./other')
other.myFunc();
console.log(other.name);
console.log(other.msg);
other.js
var msg = 'this is a model';
function myFunc(){
console.log('this is a function by model');
}
// 逐一导出
exports.msg = msg;
exports.myFunc = myFunc;
exports.name = 'my name'
index.js
// 无论是批量导出还是逐一导出都可以如下选择性导入
var {myFunc,msg,name} = require('./other')
myFunc();
console.log(name);
console.log(msg);
module.exports
生效other.js
export var msg = 'this is a model';
export function myFunc(){
console.log('this is a function by model');
}
index.js
// 导入方式一:导入的多项组成一个对象
import * as other from './other.js'
other.myFunc();
console.log(other.msg);
// 导入方式二:选择性导入
import {myFunc,msg} from './other.js'
myFunc();
console.log(msg);
other.js
var msg = 'this is a model';
function myFunc(){
console.log('this is a function by model');
}
// 批量导出,一个模块中只能声明一个 export default
export default {
msg,
myFunc,
name: 'my name'
}
index.js
import other from './other.js'
other.myFunc();
console.log(other.msg);
console.log(other.name);
注意:export default
导出的不可以使用import {}
解构导入!
nodel中没有web中的全局变量window,node中的全局变量是global
console.log(global);
输出,看到封装了一些函数可以使用
<ref *1> Object [global] {
global: [Circular *1],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
},
queueMicrotask: [Function: queueMicrotask],
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
}
}
//声明一个全局变量a,因为每个模块单独运行在一个函数里面
a = 10;
console.log(global.a);