Vuejs,使用相对路径构建的困难
Vuejs, Difficulties to build with relative path
当我 运行 npm run build
时,我在使用相对路径进行正确构建时遇到困难。解析资产很容易,但我不知道如何配置两件事:
1/config/index.js
中的assetsPublicPath
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/ONLY_ABSOLUTE_PATH_ARE_ALLOWED/',
productionSourceMap: true,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css']
},
dev: {
env: require('./dev.env'),
port: 8080,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}
2/ vue-router
配置中的 base
选项似乎也只接受绝对路径...
const router = new VueRouter({
mode: 'history',
base: '/ABSOLUTE_PATH_ONLY/',
routes: [
{ path: '/', redirect: '/fr/poster/home' },
{ path: '/:lang', redirect: '/:lang/poster/home' },
{
path: '/:lang/poster',
component: PosterLayout,
children: [
{
// UserProfile will be rendered inside User's <router-view>
// when /user/:id/profile is matched
name: 'home',
path: 'home',
component: Home
},
{
// UserPosts will be rendered inside User's <router-view>
// when /user/:id/posts is matched
name: 'themeCover',
path: ':theme',
component: ThemeCover
}
]
},
{
name: 'themeDetails',
path: '/:lang/theme/:theme',
component: ThemeDetails
}
]
})
因此,当我指定正确的未来 URL 时它会起作用,但它不是 "future proof" 以防服务器被修改...
如果这个问题可以解决,有什么解决办法吗?
绝对路径可以不包含域名,从根开始即可。
想想 HTML5 URLs。例如,如果您的静态文件夹位于 http://www.example.com/static
,而当前 url 为 http://www.example.com/users
,那么相对路径将为 ../static
。但是,如果您尝试查看用户的详细信息并转到 http://www.example.com/users/john-doe
,则相对路径将为 ../../static
。如果您不知道资源在哪里,您将无法加载它们,这就是为什么您需要一个起点,一个绝对 URL。
你害怕什么问题?你可以说得更详细点吗?
我知道从你写 post 开始一切都变了。但是此时使用最新版本的 Vue 和 Vue Cli 你可以通过 vue 配置文件获取它(我不是这个平台的专家):
在项目的主路径创建一个"vue.config.js"文件
给个相对路径。示例:
module.exports = {
publicPath: './'
};
它不适用于 css 中添加的字体,我不知道为什么,我还在谷歌搜索。如果有人阅读可以提供帮助,那就太好了。
我已经通过以下 vue.config.js
设置解决了我的问题:
module.exports = {
publicPath: process.env.BASE_URL,
assetsDir: process.env.BASE_URL
};
我认为您也可以通过更改 output.publicPath
对 webpack.config.js
执行相同的操作。
参考:https://cli.vuejs.org/guide/html-and-static-assets.html#url-transform-rules
你也可以publicPath: process.env.BASE_URL + '/static/'
使用 vue-cli 4.5.7 我必须编辑 ./config/index.js
并更改为相对的:assetsPublicPath: './',
你可以为 dev:{}
和 build:{}
做.本来只是'/'
.
对于 Vue 3 和 Vite 组合,我必须编辑 vite.config.js
文件(该文件已经存在)并将文件夹名称添加为 base
参数。
// https://vitejs.dev/config/
export default defineConfig({
base: './', // Path relative to project root
...
})
当我 运行 npm run build
时,我在使用相对路径进行正确构建时遇到困难。解析资产很容易,但我不知道如何配置两件事:
1/config/index.js
assetsPublicPath
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/ONLY_ABSOLUTE_PATH_ARE_ALLOWED/',
productionSourceMap: true,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css']
},
dev: {
env: require('./dev.env'),
port: 8080,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}
2/ vue-router
配置中的 base
选项似乎也只接受绝对路径...
const router = new VueRouter({
mode: 'history',
base: '/ABSOLUTE_PATH_ONLY/',
routes: [
{ path: '/', redirect: '/fr/poster/home' },
{ path: '/:lang', redirect: '/:lang/poster/home' },
{
path: '/:lang/poster',
component: PosterLayout,
children: [
{
// UserProfile will be rendered inside User's <router-view>
// when /user/:id/profile is matched
name: 'home',
path: 'home',
component: Home
},
{
// UserPosts will be rendered inside User's <router-view>
// when /user/:id/posts is matched
name: 'themeCover',
path: ':theme',
component: ThemeCover
}
]
},
{
name: 'themeDetails',
path: '/:lang/theme/:theme',
component: ThemeDetails
}
]
})
因此,当我指定正确的未来 URL 时它会起作用,但它不是 "future proof" 以防服务器被修改...
如果这个问题可以解决,有什么解决办法吗?
绝对路径可以不包含域名,从根开始即可。
想想 HTML5 URLs。例如,如果您的静态文件夹位于 http://www.example.com/static
,而当前 url 为 http://www.example.com/users
,那么相对路径将为 ../static
。但是,如果您尝试查看用户的详细信息并转到 http://www.example.com/users/john-doe
,则相对路径将为 ../../static
。如果您不知道资源在哪里,您将无法加载它们,这就是为什么您需要一个起点,一个绝对 URL。
你害怕什么问题?你可以说得更详细点吗?
我知道从你写 post 开始一切都变了。但是此时使用最新版本的 Vue 和 Vue Cli 你可以通过 vue 配置文件获取它(我不是这个平台的专家):
在项目的主路径创建一个"vue.config.js"文件
给个相对路径。示例:
module.exports = {
publicPath: './'
};
它不适用于 css 中添加的字体,我不知道为什么,我还在谷歌搜索。如果有人阅读可以提供帮助,那就太好了。
我已经通过以下 vue.config.js
设置解决了我的问题:
module.exports = {
publicPath: process.env.BASE_URL,
assetsDir: process.env.BASE_URL
};
我认为您也可以通过更改 output.publicPath
对 webpack.config.js
执行相同的操作。
参考:https://cli.vuejs.org/guide/html-and-static-assets.html#url-transform-rules
你也可以publicPath: process.env.BASE_URL + '/static/'
使用 vue-cli 4.5.7 我必须编辑 ./config/index.js
并更改为相对的:assetsPublicPath: './',
你可以为 dev:{}
和 build:{}
做.本来只是'/'
.
对于 Vue 3 和 Vite 组合,我必须编辑 vite.config.js
文件(该文件已经存在)并将文件夹名称添加为 base
参数。
// https://vitejs.dev/config/
export default defineConfig({
base: './', // Path relative to project root
...
})