Как я могу добавить номер версии к пути, используя Laravel Mix? - PullRequest
0 голосов
/ 25 июня 2018

Я использую Laravel Mix для компиляции моих ресурсов JS и CSS. В настоящее время я использую .version() для достижения этой цели.

Проблема в том, что при этом создается файл, похожий на:

/css/app.css?id=03def6a69840076e8f29

Это прекрасно работает при локальном обслуживании, но если я использую CDN для обслуживания этого контента посредством извлечения источника, тогда строка запроса не вызывает нового извлечения файла. В идеале я хотел бы получить следующее:

/css/03def6a69840076e8f29/app.css

Или:

/css/03def6a69840076e8f29.css

Оба этих файла - разные, поэтому он вызывает CDN.

Как этого добиться с помощью Laravel Mix?

Ответы [ 2 ]

0 голосов
/ 14 августа 2018

У меня была такая же проблема, и я нашел решение:

  1. Добавьте следующую строку в public/.htaccess:

    RewriteRule ^assets/[a-f0-9]+/(.*)$ /$1 [L]

прямо перед RewriteCond %{REQUEST_FILENAME} !-d

это будет относиться к URL как /assets/ab7320d/css/whatever.css как /css/whatever.css

  1. Поместите следующий код в resources/assets/js/rewriteMixManifest.js

    let fs = require('fs')
    let mixManifestPath = `${process.cwd()}/public/mix-manifest.json`
    let mixFileContents = fs.readFileSync(mixManifestPath)
    let oldMapping = JSON.parse(mixFileContents)
    function updateMapping(path) {
        if(path.indexOf("?") < 1) {
            return path
        }
        let [filename, idPart] = path.split("?")
        let [_, id] = idPart.split("=")
        return `/assets/${id}${filename}`
    }
    let newContent = {}
    for(let file in oldMapping) {
        newContent[file] = updateMapping(oldMapping[file])
    }
    console.log("Manifest rewritten.")
    fs.writeFileSync(mixManifestPath, JSON.stringify(newContent, null, 2))
    
  2. В package.json добавьте следующую строку в scripts (точно так же, как клавиша «dev»)

    "rewrite-manifest": "node resources/assets/js/rewriteMixManifest.js",
    
  3. После каждой сборки (например, npm run production) также запускается npm run rewrite-manifest

Что делает файл public/mix-manifest.json, так это сопоставляет каждый файл ресурсов (для {{ mix('css/app.css') }}) с какой-то строкой, которая фактически переходит в HTML. Мой скрипт переписывает строку, чтобы поместить версию не в строку запроса, а в путь. .htaccess гарантирует, что путь интерпретируется правильно.

Структура пути, конечно же, зависит от вас, чтобы она вам понравилась

Для меня это решило проблему с Google Cloud CDN, надеюсь, оно вам тоже поможет

0 голосов
/ 25 июня 2018

Вы можете попробовать назвать актив следующим образом:

<link rel="stylesheet" type="text/css" href="{{ mix('css/app.css') }}">
...