ReactJS 本地服务器在 Emacs 中编辑文件后崩溃,即使不保存



我正在尝试遵循 ReactJS 教程 https://reactjs.org/tutorial/tutorial.html。我正在使用Emacs来编辑index.js,当我编辑文件(比如说添加换行符(时,即使不保存文件,服务器也会立即崩溃,我得到以下输出:

/home/myname/Code/project/reactapp/node_modules/react-scripts/scripts/start.
js:19
throw err;
^
[Error: ENOENT: no such file or directory, stat '/home/myname/Code/project/r
eactapp/src/.#index.js'] {
errno: -2,
code: 'ENOENT',
syscall: 'stat',
path: '/home/myname/Code/project/reactapp/src/.#index.js'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! reactapp@0.1.0 start: `react-scripts start`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the reactapp@0.1.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional log
ging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/myname/.npm/_logs/2020-06-25T03_16_55_466Z-debug.log

我已经检查了文件.#index.js,它是一个隐藏文件,看起来像这样

lrwxrwxrwx 1 myname myname   32 Jun 25 13:16  .#index.js -> myname@myname-pc.4444:1593054984

当我尝试打开它时,它告诉我它是指向不存在的文件的符号链接。

我尝试重新启动我的机器,创建一个新的 ReactJS 项目,但我真的不确定发生了什么。我以前从未使用过 npm/nodejs/reactjs。任何帮助将不胜感激。

>Emacs 使用锁文件来避免编辑冲突。.#index.js是Emacs在您的情况下自动创建的锁定文件index.js因为它已被编辑但尚未保存。如果是本地计算机,则不太可能发生冲突,因此可以安全地禁用此功能

(setq create-lockfiles nil)

正如 Rorschach 在评论中提到的,如果您只想禁用此特定项目的锁定文件,最好的方法是将其设置为目录变量:

;; /home/myname/Code/project/reactapp/.dir-locals.el
((nil . ((create-lockfiles . nil)))) 

看起来 emacs 锁定文件导致了 watchpack(webpack 的一部分(如何使用 chokidar(文件系统监视器(的错误。

viam0Zah 的答案和 Rorschach 的评论有利于阻止 emacs 写入锁定文件。

相反,我去寻找为什么锁定文件崩溃 webpack,并找到了大致区域,但无法完全理解它。

我确实想出了一个全面的黑客临时解决方案:编辑您的node_modules/watchpack/lib/DirectoryWatcher.js文件。在第 57 行从followSymlinks: false更改为followSymlinks: true

当然,对node_modules的任何编辑都将在下次更新版本或以其他方式重新加载节点模块时丢失。

我认为实际问题与这个问题有关,我现在没有意志力去解决这个问题:https://github.com/webpack/watchpack/issues/130

注释掉node_modules/react-scripts/scripts/start.js的第19行作为解决方法,直到它被修复。 这比禁用锁定文件并可能丢失编辑要好。

你可以将 webpack 配置为忽略某些文件。 如果您使用的是创建-反应-应用程序,则该文件位于:node_modules/react-scripts/config/webpackDevServer.config.js

要让 webpack 忽略 emacs 锁文件和备份文件,请将此忽略语句添加到 watchOptions 中(应该从第 98 行开始(。

忽略:/.#|~$/,

最新更新