您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Node.js中如何使用ES6导入语法
## 引言
随着ECMAScript 6(ES6)的普及,JavaScript的模块系统从传统的CommonJS逐渐向ES Modules(ESM)过渡。Node.js作为主流的JavaScript运行时环境,从v12开始逐步支持ES6模块系统。本文将详细介绍在Node.js中使用ES6导入语法的各种方法和注意事项。
---
## 一、Node.js模块系统的发展
### 1.1 CommonJS的统治时期
Node.js最初采用CommonJS规范:
```javascript
// 导入
const fs = require('fs')
// 导出
module.exports = { ... }
ES6标准提出的模块系统:
// 导入
import fs from 'fs'
// 导出
export default { ... }
Node.js从以下版本开始支持ESM: - v12:实验性支持 - v14:稳定支持 - v16+:成为LTS标准功能
将文件保存为.mjs
后缀:
// app.mjs
import { readFile } from 'fs/promises'
执行命令:
node app.mjs
在package.json中添加:
{
"type": "module"
}
使用--input-type=module
参数:
node --input-type=module -e "import fs from 'fs'; console.log(fs.existsSync('index.js'))"
import fs from 'fs'
import { readFile, writeFile } from 'fs/promises'
import fs, { readFileSync } from 'fs'
import { promises as fsPromises } from 'fs'
const module = await import('./module.js')
// esm.mjs
import cjs from './cjs.cjs'
module.exports
会转为ESM的默认导出
import { named } from 'cjs-module' // 错误
// cjs.cjs
const esm = await import('./esm.mjs')
import './module.js' // 必须
import './module' // 错误
import './utils/index.js' // 需要显式指定
import fs from 'node:fs' // 核心模块前缀
import data from './data.json' assert { type: 'json' } // JSON导入
// server.mjs
import express from 'express'
const app = express()
app.get('/', (req, res) => {
res.send('Hello ESM!')
})
app.listen(3000)
// Button.mjs
export default class Button {
constructor(text) {
this.text = text
}
render() {
return `<button>${this.text}</button>`
}
}
// rollup.config.mjs
import { terser } from 'rollup-plugin-terser'
export default {
input: 'src/index.js',
plugins: [terser()]
}
替代方案:
import { fileURLToPath } from 'url'
import { dirname } from 'path'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
解决方案: 1. 检查模块是否支持ESM 2. 使用兼容层:
import _ from 'lodash-es' // ESM版本
渐进式迁移:
双模式发布:
{
"exports": {
"require": "./cjs/index.js",
"import": "./esm/index.js"
}
}
工具辅助:
Node.js对ES6模块的支持标志着JavaScript生态的重要进化。虽然过渡期间可能会遇到兼容性问题,但ESM带来的静态分析、浏览器兼容等优势使其成为未来的发展方向。建议新项目直接采用ESM规范,现有项目可以制定渐进式迁移计划。
注意:本文基于Node.js 18 LTS版本编写,不同版本可能存在细微差异。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。