react 项目本地能正常运行,但是run build 之后就报错

999 阅读3分钟

前言

这两天因为居家办公,换了台电脑办公,可能环境有些不一样。有个需求产品需要上线,但是上线之后发现现网直接挂了,本地跑起来是好好的,找了很多原因都没找到。

错误信息

Uncaught ReferenceError: require is not defined

image.png

var v=require("object-assign")

image.png

因为这个项目比较老,需要使用 node v8 版本去开发和打包,使用 nvm 切换到 8.x 的 node 版本。项目里有 yarn.lcokpackage-lock.json 文件,个人习惯比较喜欢用 npm,刚开始使用 npm i 安装依赖,依赖安装会报错,因为项目里使用到了公司内部包,内网才能访问,需要使用公司内部的 npm 包管理工具安装,通过 npm 下载了公司内部 npm 包管理工具,使用公司内部的包下载也会报错,切错误信息是公司内部包管理工具 cli 报的错,可能是因为 node 版本太低了导致的。然后又换成了 yarn 安装,使用 yarn 安装,一路畅通。感觉 yarn 装依赖包会比 npm 装依赖包好很多,没有 npm 那么多问题。本地开发,开发好之后提交代码,打包部署,部署到现网发现页面直接蹦了,就是一开始之前那那个错,所以立马回滚了。看到这个错误信息刚开始还以为是 webpack 打包的原因,以为打包时使用了 commonjs 规范, 百度、google 都没找到解决方案,发现 package.json 里有个 type 属性,好像是跟项目使用 commonjses 模块有关的。默认值是 commonjs, 可以改成 module,值为module 则是使用 es 模块。改成 module 之后重新打包发现还是不行,此路不通。想了很久感觉跟 webpack 配置应该没关系,因为公司的电脑和家里电脑的代码都是一样的,没理由是 webpack 配置原因。又继续看了下打包错误的代码上下文,发现这个 require("object-assign")react 用到的,网上和 reactgithub 上搜了一下,也没找到相关问题。这里我就感觉应该是和下载的依赖包有关系,删除 node_modules 依赖包重新安装,这次使用 npm i 安装,为了解决 npm 下载不到公司内部版本的包以及 node v8.x 下载的公司内部的 npm 包管理工具,这次通过设置 npmregistry 来下载公司内部的包(也可以设置 proxy 或者 https-proxy), npm config set registry https://内网地址,再使用 npm i,没有报错,依赖成功下载完成,本地运行完美,再 run build 打包试了下,也没问题了。

总结

这个问题还是花了很长时间才解决的,只是做个记录,感觉还是没有从根本上解决,为什么使用 yarn 安装的依赖本地跑起来没问题,打包之后会报错 Uncaught ReferenceError: require is not defined , 具体打包之后看报错的 js 上下问是 react 中的 var v=require("object-assign") 报的错,还是很疑惑的。不知道有没有大神遇到过这个问题,怎么解决的。