{"id":1555,"date":"2018-03-01T12:41:49","date_gmt":"2018-03-01T11:41:49","guid":{"rendered":"http:\/\/www.matjazev.net\/blog\/?p=1555"},"modified":"2018-03-01T21:08:32","modified_gmt":"2018-03-01T20:08:32","slug":"using-vue-spa-created-with-webpack-in-subfolder","status":"publish","type":"post","link":"https:\/\/www.matjazev.net\/blog\/2018\/03\/01\/using-vue-spa-created-with-webpack-in-subfolder\/","title":{"rendered":"Using Vue SPA (created with webpack) in subfolder"},"content":{"rendered":"<p><strong>There is a common use case where Vue SPA will run in some subfolder in production environment.<\/strong><\/p>\n<p>When you develop Vue app using Vue-cli all your links are targeting root folder. There are some topics on Vue forums about that problem but there are not complete, so here is a solution that works. I am not saying that it is the best or. only possible, but it works!<\/p>\n<p><strong>Solution:<\/strong><\/p>\n<p>I am using two index.html files. One for development (<strong>index.html<\/strong>) and the other for production (<strong>index_prod.html<\/strong>). Files are 95% the same, except some minor changes in index_prod.html. So, if this is basic index.html<\/p>\n<div>\n<pre>\n&amp;lt;!DOCTYPE html&amp;gt;\n&amp;lt;html&amp;gt;\n&nbsp;&nbsp;&amp;lt;head&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;metacharset=&quot;utf-8&quot;&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;metaname=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1.0&quot;&amp;gt;\n&nbsp;&nbsp;&amp;lt;\/head&amp;gt;\n\n&nbsp;&nbsp;&amp;lt;body&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;div id=&quot;app&quot;&amp;gt;&amp;lt;\/div&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;!-- built files will be auto injected --&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;script src=&quot;\/static\/config.js&quot;&amp;gt;&amp;lt;\/script&amp;gt;\n&nbsp;&nbsp;&amp;lt;\/body&amp;gt;\n&amp;lt;\/html&amp;gt;\n\n<\/pre>\n<\/div>\n<p>For production you must use <strong>base tag<\/strong> and change <strong>src link<\/strong> (<em>if you need one!<\/em>)<\/p>\n<div>\n<pre>\n&amp;lt;!DOCTYPE html&amp;gt;\n&amp;lt;html&amp;gt;\n&nbsp;&nbsp;&amp;lt;head&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;strong&gt;&amp;lt;basehref=&quot;\/sub-folder\/&quot; \/&amp;gt;&lt;\/strong&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;metacharset=&quot;utf-8&quot;&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;metaname=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1.0&quot;&amp;gt;\n&nbsp;&nbsp;&amp;lt;\/head&amp;gt;\n&nbsp;&nbsp;\n&nbsp;&nbsp;&amp;lt;body&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;div id=&quot;app&quot;&amp;gt;&amp;lt;\/div&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;!-- built files will be auto injected --&amp;gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;lt;script src=&quot;&lt;strong&gt;\/sub-folder&lt;\/strong&gt;\/static\/config.js&quot;&amp;gt;&amp;lt;\/script&amp;gt;\n&nbsp;&nbsp;&amp;lt;\/body&amp;gt;\n&amp;lt;\/html&amp;gt;\n\n<\/pre>\n<\/div>\n<div>Because I am using index_prod for production I must inform webpack about that. So, I need to <strong>change webpack.prod.config.js<\/strong>, by <strong>adding template property<\/strong> to <strong>HtmlWebpackPlugin<\/strong>:<\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div><span style=\"font-family: Consolas, Monaco, monospace;\">newHtmlWebpackPlugin({<\/span><\/div>\n<div>\n<div>\n<pre>\u00a0 filename: config.build.index,\n&lt;strong&gt;\u00a0 template: &#039;index_prod.html&#039;,&lt;\/strong&gt;\n\u00a0 inject: true,\n\u00a0 ...\n\n<\/pre>\n<\/div>\n<\/div>\n<div>Next, I must inform webpack to use new public path, so I must again <strong>change webpack.prod.config.js<\/strong>, by <strong>adding publicPath property<\/strong> to <strong>webpackConfig.output<\/strong>:<\/div>\n<div>\n<pre>\noutput: {\n&nbsp;&nbsp;path: config.build.assetsRoot,\n&lt;strong&gt;&nbsp;&nbsp;publicPath: &#039;\/sub-folder\/&#039;,&lt;\/strong&gt;\n&nbsp;&nbsp;filename:utils.assetsPath(&#039;js\/[name].[chunkhash].js&#039;),\n&nbsp;&nbsp;chunkFilename:utils.assetsPath(&#039;js\/[id].[chunkhash].js&#039;)\n},\n\n<\/pre>\n<\/div>\n<div>Then I must inform router to use new public path, so I must <strong>add base property to router object<\/strong><\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div><span style=\"font-family: Consolas, Monaco, monospace;\">let router = new Router({<\/span><\/div>\n<div>\n<div>\u00a0 routes: [&#8230;]<\/div>\n<div><strong>\u00a0 base: &#8216;\/sub-folder\/&#8217;,<\/strong><\/div>\n<div>\u00a0 mode: &#8216;history&#8217;<\/div>\n<div>})<\/div>\n<div><\/div>\n<div>And that&#8217;s it! Now I can copy DIST folder to \/sub-folder\/ on production.<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>There is a common use case where Vue SPA will run in some subfolder in production environment. When you develop Vue app using Vue-cli all your links are targeting root folder. There are some topics on Vue forums about that problem but there are not complete, so here is a solution that works. I am &hellip; <a href=\"https:\/\/www.matjazev.net\/blog\/2018\/03\/01\/using-vue-spa-created-with-webpack-in-subfolder\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Using Vue SPA (created with webpack) in subfolder<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[71,72],"_links":{"self":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts\/1555"}],"collection":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/comments?post=1555"}],"version-history":[{"count":7,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts\/1555\/revisions"}],"predecessor-version":[{"id":1562,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/posts\/1555\/revisions\/1562"}],"wp:attachment":[{"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/media?parent=1555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/categories?post=1555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matjazev.net\/blog\/wp-json\/wp\/v2\/tags?post=1555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}