前端喵前端喵
  • 🎹leetcode算法
  • 🌲后台管理项目
  • 🍎八股文
GithHub
  • 🎹leetcode算法
  • 🌲后台管理项目
  • 🍎八股文
GithHub
  • 首页
  • 系统笔记

    • leetcode算法笔记大全
    • 前端八股文笔记大全
    • 后台管理项目0-1搭建笔记
    • 后台管理项目脚手架0-1搭建笔记
  • 技术文章

    • 常见的性能优化手段
    • 如何修改gitignore并删除远程的ignore文件
    • 如何给GitHub项目提交pr
    • 小米android前端面试全流程
    • git操作指南
    • Promise面试题
    • 如何混合使用commonjs和esm
    • 模拟面试项目拷打1
    • 项目综合模拟面试
    • 如何注册和使用域名
    • git commit提交规范
    • Mysql的并发控制实验

如何混合使用commonjs和esm

背景

在npm的各种模块里,有的模块最新引入,使用的是esm,有些是commonjs。

如果说回退包的版本,都使用commonjs,那么又会错失很多更新的内容。

解决

1. 修改后缀混合使用commonjs和esm。

当我们把文件命名为.mjs时,Node.js会默认使用esm模块化规范。

如果使用.cjs,Node.js会默认使用commonjs模块化规范。

如果是.js,则会看package.json的type字段,如果为module,则使用esm,否则使用commonjs。

利用这一点,就能混合使用commonjs和esm。

这种方式的缺点是不同的只能把esm和commonjs的模块分开文件夹使用,不能把commonjs和esm的模块混合在一个文件里使用。

需要注意,当修改后缀之后,我们在使用node执行的该文件时,需要使用node xxx.cjs,写文件的名称时,要对应的修改

2. 创建ESM包管理器

wrapper.mjs

import inquirer from 'inquirer';
export { inquirer };

import('./wrapper.mjs'),这个语法很重要 main.cjs

const { program } = require('commander');

import('./wrapper.mjs').then(({ inquirer }) => {
    program.version('1.0.0');
    inquirer.prompt([
        {
            name: "userName",
            type: "input",
            message: "你的名字叫什么?"
        }
    ]).then(answer => {
        console.log("回答内容", answer);
    });
});

3. 一律用ESM

对于

const { program } = require('commander');

也可以用

import { program } from 'commander';

导入

Last Updated:
Contributors: namewyf
Prev
Promise面试题
Next
模拟面试项目拷打1