远程服务器部署React应用报模块外使用import语句错误
报错的核心原因是服务器向浏览器返回了React的原始源码文件,而非打包编译后的生产环境产物。
你看到的Cannot use import statement outside a module、Unexpected token 'export'报错,是因为浏览器直接加载了未经过构建工具(Webpack/Vite等)编译转译的源码文件,这类文件里的ES模块语法(import/export)无法直接在非module类型的脚本标签下运行。
你在package.json中添加"type":"module"的操作无效,原因是:这个配置是给Node.js运行环境识别模块格式用的,浏览器加载站点资源时根本不会读取服务器上的package.json文件,对浏览器端代码没有任何作用。
常见触发场景:
- 上传路径错误:把项目根目录下的源码文件(比如src目录下的App.js、根目录的index.js)传到了服务器web根目录,没有上传
build命令生成的生产构建产物 - 服务器站点配置错误:站点根目录指向了React项目的源码根目录,而非构建产物所在的目录
- 重写规则错误:.htaccess配置不当,导致js资源请求被错误转发到了源码文件路径
- 漏传构建产物的入口index.html,浏览器加载了非构建版本的入口文件
- 本地回到React项目根目录,重新执行生产构建命令,生成最新的编译产物:
# npm 环境执行 npm run build # yarn 环境执行 yarn build
构建完成后,检查项目根目录下生成的build文件夹:内部应该包含可直接访问的入口index.html、static资源目录(存放打包压缩后的js、css、媒体文件),该目录下的js文件已经过转译合并,不存在浏览器无法识别的裸import/export语法。
2. 清空服务器web根目录下所有之前上传的文件,包括误传的源码版App.js、index.js、根目录package.json等,避免旧文件干扰访问。
3. 将build文件夹内部的所有文件和子文件夹(不要直接上传build文件夹本身)上传到服务器web根目录,确保上传完成后,web根目录下直接能看到构建生成的index.html、static目录、你的.htaccess文件。
4. 检查.htaccess的重写规则,针对React单页应用的路由fallback配置请使用以下规则,避免资源请求、路由跳转被重写到错误路径:
Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.html [QSA,L]
- 上传完成后,清除浏览器缓存(或打开浏览器无痕模式)重新访问站点,避免浏览器加载之前缓存的错误源码文件。
内容的提问来源于stack exchange,提问作者KevDevKevo

