關於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()源碼了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM