TLDR - встраивание приложения vue в приложение Phoenix. Создайте приложение vue с помощью vue cli и убедитесь, что файлы попадают в каталоги, которые они должны содержать в проекте Pheonix. После сборки приложение не работает, поскольку путь к файлу ресурса не совпадает с publicPath
.
. Я создаю мое приложение vue в ../../lib/exampleapp_web/templates/page
. Мне нужно использовать собственный html-шаблон для удаления тегов vues <html>
, <head>
и <body>
, поскольку Pheonix отображает этот шаблон страницы в существующем шаблоне макета.
мой vue.config.js выглядиткак это
vue.config.js
module.exports = {
outputDir: '../../lib/exampleapp_web/templates/page',
assetsDir: '../../../../assets/static',
indexPath: 'index.html.eex',
publicPath: './', // should make asset routes relative to route
chainWebpack: config => {
config.plugin('html').tap(args => {
return [{
template: "./public/index.html", // custom vue html template
minify: false, // so I can read it
inject: false // so html, head, body etc isn't injected
}]
})
}
}
При построении пути к отображаемым активам неверны (отображается assetDir, а не путь, указанный в publicPath):
<script src="../../../../assets/static/js/chunk-vendors.74d8847d.js"></script>
Когда мне нужно: <script src="./js/chunk-vendors.74d8847d.js"></script>
Итак, чтобы исправить это, я делаю замену строки в моем шаблоне vue html:
public/index.html
<!-- https://github.com/jaketrent/html-webpack-template/blob/86f285d5c790a6c15263f5cc50fd666d51f974fd/index.html -->
<% for (var css in htmlWebpackPlugin.files.css) { %>
<link href="<%= htmlWebpackPlugin.files.css[css].replace('./../../../assets/static/','/') %>" rel="stylesheet">
<% } %>
<div id="app"></div>
<% for (var chunk in htmlWebpackPlugin.files.chunks) { %>
<script src="<%= htmlWebpackPlugin.files.chunks[chunk].entry.replace('./../../../assets/static/','/') %>"></script>
<% } %>
Это делает:
<link href="./css/chunk-vendors.257c6d34.css" rel="stylesheet">
<link href="./css/app.d5864d1f.css" rel="stylesheet">
<div id="app"></div>
<script src="./js/chunk-vendors.74d8847d.js"></script>
<script src="./js/app.b25a73d8.js"></script>
Это работает .... это просто кажется неуклюжим. Необходимость каждый раз редактировать шаблон, чтобы заменить пути, на самом деле нецелесообразна. Есть ли лучший способ?
Я думал, что опция publicPath сделает это https://cli.vuejs.org/config/#publicpath - у меня просто не работает.
By default, Vue CLI assumes your app will be deployed at the root of a domain, e.g. https://www.my-app.com/. If your app is deployed at a sub-path, you will need to specify that sub-path using this option. For example, if your app is deployed at https://www.foobar.com/my-app/, set publicPath to '/my-app/'