node esm模块没有__dirname, 运行pnpm run dev报错 __dirname is not defined in ES module scope

//这个文件会帮我们打包packages下的所有文件,最终打包出js文件
// node scripts/dev.js 要打包的名字 -f 打包的格式
import minimist from 'minimist'
import { resolve,dirname } from 'path'
import { fileURLToPath } from 'url'

//node中命令参数获取process.argv,前两个不要 参数1执行的命令,数2执行的文件,后面才是参数
const args = minimist(process.argv.slice(2))
const target = args._[0] || 'web' //打包哪个项目,不传给个默认值web
// console.log(target)
const format = args.f || 'iife' //打包格式,不传给个默认值global
console.log(target, format)  //输出 =》reactivity esm
import { createRequire } from 'module'
/* esm模块使用cmj变量
*获取打包的入口文件
*node esm模块没有__dirname, 运行pnpm run dev报错 __dirname is not defined in ES module scope
*需要自己解析
*获取当前文件的绝对路径,但开头是file: -> 要转为/xx/xx ,通过dirname获取 */
const __filename=fileURLToPath(import.meta.url)
const __dirname=dirname(__filename)
//C:\Users\some8\Desktop\yuanma\Vue\scripts
const require=createRequire(import.meta.url)
console.log(require)
//入口文件,根据命令提供的路径进行解析
const entry = resolve(__dirname, `../packages/${target}/src/index.ts}`)

console.log(import.meta.url)

file:///C:/Users/some8/Desktop/yuanma/Vue/scripts/dev.js

带file开头的绝对路径
const __filename=fileURLToPath(import.meta.url)

console.log(__filename)

C:\Users\some8\Desktop\yuanma\Vue\scripts\dev.js
#获取当前文件
const __dirname=dirname(__filename)

console.log(__dirname)

C:\Users\some8\Desktop\yuanma\Vue\scripts

#获取当前文件目录

需要手动处理

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and 'C:\Users\some8\Desktop\yuanma\Vue\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.

import { createRequire } from 'module'
既可以用esm写法也可以用以前cjs写法,相当于做了兼容处理

const require=createRequire(import.meta.url)
console.log(require)
> vue3-lesson@1.0.0 dev C:\Users\some8\Desktop\yuanma\Vue
> node scripts/dev.js reactivity -f esm

reactivity esm
[Function: require] {
  resolve: [Function: resolve] { paths: [Function: paths] },
  main: undefined,
  extensions: [Object: null prototype] {
    '.js': [Function (anonymous)],
    '.json': [Function (anonymous)],
    '.node': [Function (anonymous)]
  },
  cache: [Object: null prototype] {
    'C:\\Users\\some8\\Desktop\\yuanma\\Vue\\node_modules\\.pnpm\\minimist@1.2.8\\node_modules\\minimist\\index.js': {
      id: 'C:\\Users\\some8\\Desktop\\yuanma\\Vue\\node_modules\\.pnpm\\minimist@1.2.8\\node_modules\\minimist\\index.js',
      path: 'C:\\Users\\some8\\Desktop\\yuanma\\Vue\\node_modules\\.pnpm\\minimist@1.2.8\\node_modules\\minimist',
      exports: [Function (anonymous)],
      filename: 'C:\\Users\\some8\\Desktop\\yuanma\\Vue\\node_modules\\.pnpm\\minimist@1.2.8\\node_modules\\minimist\\index.js',
      loaded: true,
      children: [],
      paths: [Array]
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向画

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值