MacOS下用cp复制Vue3项目后vite dev报错,rsync复制则正常
你遇到的问题核心在于MacOS系统中cp -rp与rsync -a处理符号链接的行为差异:
cp -rp的行为:
在MacOS上,cp -rp复制目录时,遇到符号链接会默认跟随链接复制其指向的实际文件内容,而非保留符号链接本身。Vue项目里的node_modules/.bin/vite原本是指向vite包内部ES模块文件的符号链接,被cp复制后变成了独立的普通文件。这个普通文件所在的node_modules/.bin目录没有package.json设置"type": "module",Node.js会默认将其识别为CommonJS模块,而文件内的import语句是ES模块语法,因此触发语法错误。rsync -a的行为:rsync -a(归档模式)包含-l参数,会保留符号链接本身,不会跟随链接复制实际文件。复制后的node_modules/.bin/vite仍然是指向vite包内部文件的符号链接,Node.js执行时会解析符号链接指向的真实路径,该路径所在的vite包目录下的package.json已设置"type": "module",因此能正确识别为ES模块,正常运行。为什么
diff -qr显示无差异:diff -qr仅比较文件内容是否一致,复制后的普通文件内容与符号链接指向的源文件内容完全相同,因此不会提示内容差异。但它实际上会输出类似File dir1/node_modules/.bin/vite is a symbolic link to ... while file dir2/node_modules/.bin/vite is a regular file的差异提示,可能你未注意到这部分输出。
内容的提问来源于stack exchange,提问作者Morten K

