typescript Vite“未定义全局”

vxqlmq5t  于 2023-01-06  发布在  TypeScript
关注(0)|答案(4)|浏览(238)

我正在使用Vite和vanilla-ts创建一个项目,有一次我不得不使用fs-extra包中的readdir方法,但它创建了一个错误process is not defined,有人建议我将此代码放在我的vite-config.ts文件中:

import { defineConfig } from 'vite'

export default defineConfig({
  define: {
    'process.env': {}
  }
})

这修复了初始错误,但创建了一个读取global is not defined的新错误,进一步研究并在define对象上添加'global': {},与之前修复的错误一样,但创建了另一个读取Cannot read properties of undefined (reading 'substr')的错误
所用代码:

import { readdirSync } from 'fs-extra';

const folders = readdirSync('./', { withFileTypes: true })
  .filter(dir => dir.isDirectory);

Vite版本:第二年九月五日
FS-额外版本:九月十三日

laawzig2

laawzig21#

更温和的解决方案:

export default defineConfig({
    define: {
      global: {},
    },
  })
tzdcorbm

tzdcorbm2#

问题是vite没有像webpack那样在window中定义一个global字段,而且一些库依赖于它,因为webpack比vite老得多。
只需在任何库导入之前的最开始插入:

// init.js
window.global ||= window;

在导入之前有上述代码的一个好方法是写入新文件,我们称之为init.js,并作为第一个文件导入。

// index.js or main.js
import "./init"
// import your app and libraries after... 
import App from './App'
import ...
e4eetjau

e4eetjau3#

Omg谢谢你Patrick Hübl-Neschkudla
对我有效的是定义全球:'窗口',这样,库依赖于global.something工作(例如lodash使用global.isFinite()这是抛出错误)-帕特里克Hübl-Neschkudla九月13,2022在8:27
我在这个问题上挣扎了2个小时,终于从你那里找到了解决办法。
对我来说,问题是,AWS认证器需要使用需要在vite config上定义“global”的缓冲包,而我也有在其主phase.js代码中声明global.somethingsomething的Phaser包。
使用vite config中定义的“global”,在编译phaser时运行“npm run build”失败,表示在其声明“global”的部分存在意外标记:等等。
当我没有在vite config中定义'global'时,那么'npm run build'不会失败,但是AWS验证器将无法工作并抛出控制台。错误,说'global'没有在缓冲区中定义。
设置

define: {global: 'window'}

在vite.config中解决了这个问题。

eni9jsuy

eni9jsuy4#

您很可能将Vite用于前端项目。fs-extra(文件访问)/global(nodejs global)并不存在于浏览器(前端)中。

修复

使用一个后端项目并导出一个API,然后可以从Vite/frontend使用该API在服务器上进行文件系统更改。

相关问题