JavaScript 有两种模块化规范:
- CommonJS模块化规范——使用require()导入模块,module.exports导出模块
- ES6模块化规范——使用import导入模块,export 导出模块
两种模块化规范不兼容!(两种语法不能在同一个文件中使用,除非用babel转义)
CommonJS模块化规范
方式一【适用于模块只对外输出一个方法】
导出模块
//a.js function log(str){ console.log(str); } module.exports = log
导入模块
//index.js const log= require('./a.js'); log('你好');//打印 '你好'
require的加载过程图解
方式二【适用于模块对外输出多个方法】
导出模块
//a.js module.exports.log = function(str){ console.log(str); }
导入模块
//index.js const logModule = require('./a.js'); logModule.log('你好');//打印 '你好'
ES6模块化规范
导出模块
// a.js export function log(str) { console.log(str) }
导入模块
// b.js import { log } from './a.js' log('你好')
node.js支持ES6模块化规范的方法
nodejs 默认使用CommonJS模块化规范,若想使用ES6模块化规范,有以下方法:
方法一:将文件后缀名修改为.mjs
node.js对.mjs
文件总是使用 ES6 模块化规范,运行文件时,使用 node test.mjs
方法二:在
package.json
文件中,指定type
字段为module
若项目中没有package.json
文件,则在项目文件夹下新建package.json文件
{ "type": "module" }
使用此方法后,所有CommonJS模块化规范的js文件的后缀名需改为.cjs
方法三:安装babel
使用babel将js文件编译成node.js支持的commonjs格式的代码。
安装依赖
npm i babel-register babel-preset-env -D
项目目录下新建babel的配置文件 .babelrc
{ "plugins": [ "transform-es2015-modules-commonjs" ] }
在项目启动文件中,引入babel
require('babel-register')
完整范例代码
目录结构
│ .babelrc │ package.json │ └─src a.js index.js print.js
index.js
require('babel-register') require('./print')
import a from './a'
a.js
console.log('aaa')
运行index.js
node index.js