Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hosting from a subdirectory #189

Open
david-saint opened this issue Jun 13, 2018 · 8 comments
Open

Hosting from a subdirectory #189

david-saint opened this issue Jun 13, 2018 · 8 comments

Comments

@david-saint
Copy link

david-saint commented Jun 13, 2018

I'm trying to host a vue app on a subdirectory like https://my.site/folder/ but every time it tries looking for it in https;//my.site/dist/build.js.
Even when I changed the index.html to point to dist/build it finds the build file but nothing displays
I'm also using vue-router
I've checked online but all I keep seeing are to change config/index.js

export.module = {
...
assetsPublicPath: '/folder/'
...
}

but this is for the webpack template.

@jcav2
Copy link

jcav2 commented Sep 18, 2018

Hi david, i solved this problem with 2 things:

first create a file vue.config.js in the project root, in same level of package.json

put this content:
module.exports = {
baseUrl: '/yoursubfolder/'
}

then in route.js

export default new Router({
mode: "history",
base: "yoursubfolder",

@tonmcg
Copy link

tonmcg commented Apr 1, 2019

@jcav2, this worked like a charm. Thank you for posting this solution; it's saved me countless hours of fiddling and debugging.

@simeq-manish01
Copy link

Hi david, i solved this problem with 2 things:

first create a file vue.config.js in the project root, in same level of package.json

put this content:
module.exports = {
baseUrl: '/yoursubfolder/'
}

then in route.js

export default new Router({
mode: "history",
base: "yoursubfolder",

not working on server subfolder....

@laygir
Copy link

laygir commented Sep 15, 2019

Hi,

I managed to make it work but in my case I'm trying to run 2 separate Vue applications under the same host.

For example;

Root Vue app: mysite.com
Second Vue app: mysite.com/secondApp

Now the issue is routing in the second Vue app. If there's a sub route in the second Vue app, accessing those routes directly resolves to the root Vue app.

For example;
Access directly 'www.mysite.com/secondApp/profile' resolves to the root Vue app.

Only partial workaround I could come up with is to remove the history mode from the second vue app and then including hash in the url when directly accessing.

For example;
Access directly 'www.mysite.com/secondApp/#/profile' resolves to correct Vue app.

Any idea how to achieve this when hosting from a subdirectory when running multiple Vue apps?

@BitaShamsafar
Copy link

Hi david, i solved this problem with 2 things:

first create a file vue.config.js in the project root, in same level of package.json

put this content:
module.exports = {
baseUrl: '/yoursubfolder/'
}

then in route.js

export default new Router({
mode: "history",
base: "yoursubfolder",

Instead of "baseUrl" try "publicPath"

@Deele
Copy link

Deele commented Dec 6, 2019

In this project template, what decides how to build application is webpack, and you configure it via webpack.config.js.

To change how webpack builds it for production, go to the webpack.config.js part with if (process.env.NODE_ENV === 'production') { line. Everything inside that implication (if statement) is basically "changes to the project for build process".

So, to change public path, from where everything is hosted, you will need to change publicPath value. As you see it right now in webpack.config.js, it is equal to /dist/.

If you project is served from /subdirectory, then you will have to change publicPath value to /subdirectory/dist/. To do that, simply add at within previously mentioned IF statement line like this:

module.exports.output.publicPath = '/subdirectory/dist/'

That would probably result in webpack.config.js similar to this (look for addition at the bottom of the file):

var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/',
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'vue-style-loader',
          'css-loader'
        ],
      },{{#sass}}
      {
        test: /\.scss$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader'
        ],
      },
      {
        test: /\.sass$/,
        use: [
          'vue-style-loader',
          'css-loader',
          'sass-loader?indentedSyntax'
        ],
      },
      {{/sass}}
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            {{#sass}}
            // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
            // the "scss" and "sass" values for the lang attribute to the right configs here.
            // other preprocessors should work out of the box, no loader config like this necessary.
            'scss': [
              'vue-style-loader',
              'css-loader',
              'sass-loader'
            ],
            'sass': [
              'vue-style-loader',
              'css-loader',
              'sass-loader?indentedSyntax'
            ]
            {{/sass}}
          }
          // other vue-loader options go here
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },
  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js'
    },
    extensions: ['*', '.js', '.vue', '.json']
  },
  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true
  },
  performance: {
    hints: false
  },
  devtool: '#eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
  module.exports.devtool = '#source-map'
  // http://vue-loader.vuejs.org/en/workflow/production.html
  module.exports.plugins = (module.exports.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"production"'
      }
    }),
    new webpack.optimize.UglifyJsPlugin({
      sourceMap: true,
      compress: {
        warnings: false
      }
    }),
    new webpack.LoaderOptionsPlugin({
      minimize: true
    })
  ])
  module.exports.output.publicPath = '/subdirectory/dist/'
}

And another thing is with index.html. You see, the file is generated at the very beginning, when you create your project from this template. When you send it to the hosting place, you will have to change the path to dist directory too in <script src="/dist/build.js"></script>. You can change it either to relative dist/build.js (without leading slash) or absolute /subdirectory/dist/build.js - its up to you.

That would probably result in index.html similar to this (look for src attribute value change at bottom of the file):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>{{ name }}</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="dist/build.js"></script>
  </body>
</html>

@I-am-abdulazeez
Copy link

Hi, can the base option in the vue-router be in an array?

@jhonarendra
Copy link

Hi david, i solved this problem with 2 things:
first create a file vue.config.js in the project root, in same level of package.json
put this content:
module.exports = {
baseUrl: '/yoursubfolder/'
}
then in route.js
export default new Router({
mode: "history",
base: "yoursubfolder",

Instead of "baseUrl" try "publicPath"

Thank you, this worked for me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants