关于Laravel中使用Laravel-mix打包资源文件的一个坑

Posted 洛尔卡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Laravel中使用Laravel-mix打包资源文件的一个坑相关的知识,希望对你有一定的参考价值。

  今天在尝试把写了一周的项目用laravel-mix中的 mix.version() 命令生成版本化文件时,遇到了一个报错,大概长这样:

fs.js:675
    return binding.read(fd, buffer, offset, length, postion);
                          ^

Error: EISDIR: illegal operation on a directory, read 
    at Object.fs.readSync (fs.js:675:18)
    at .....

  一开始还以为哪里写错了,前后检查了几遍无果,配合错误提示分段排查,发现只要这句代码:

mix.copy(‘resources/assets/js/lib/editor.md‘,‘public/lib/editor.md‘);

存在就会导致报错。

  有趣的是:

  1.前一句mix.copy还跑得好好的。

  2.版本化的代码压缩和生成mix-manifest.json都被正确地执行了,但在那句copy未被执行。

  3.如果不执行版本化 mix.version() ,那句代码就跑得毫无问题。

  按照文档的说法,mix.copy仅仅是把一处资源文件复制到另一处,怎么会和mix.version扯上关系呢。

  虽然手动复制也能解决问题,但就它这么特殊总是令人不爽。

  Google给出的答案也很迷,有人提出是version的过程与copy的过程同时进行了导致的问题【https://github.com/JeffreyWay/laravel-mix/issues/852】,建议 mix.then( ()=>{ ...COPY CODE ... }) 解决,然而我试了并没有什么卵用。 mix在执行结束后,then内再对mix进行的操作就已经无效了。

  随后又在文档中发现一句 “The mix.version() will automatically version any compiled javascript, Sass/Less, or combined files. ” 。emmmm,似乎copy过去的内容哪怕没在html中被以{{ mix()}}的方式引用,也会被mix.version()盯上呢。

  最后,我决定把editor.md目录下的全部内容挨个审批,结果令人意外,哪怕editor.md是个空目录,它TM也会报错。这倒提醒了我,于是我试着修改了一下文件名到 “editor-md” --- >通过了。

  经过测试,似乎只有mix.copy()的源文件目录中不能出现 “ . ”,更深入的研究大概要翻version()源码了。

以上是关于关于Laravel中使用Laravel-mix打包资源文件的一个坑的主要内容,如果未能解决你的问题,请参考以下文章

Laravel-mix Webpack 公共路径

laravel-mix 热重载404的问题

未捕获的 ReferenceError:使用 laravel-mix webpack 时未定义 Vue

带有 laravel-mix 的 vue-loader 15

laravel-mix 文档翻译

Laravel-mix 中文文档