web静态资源处理:相对路径和绝对路径的引用—css资源404
Author:zhoulujun Date:
webpack静态资源处理,这里略过,感兴趣,请看:https://www.zhoulujun.cn/html/tools/Bundler/webpack/
对于静态资源打包,https://webpack.docschina.org/configuration/output/ 看了这个文档打包出来,放到服务器上还是会遇到一系列问题
其实重点就这个几个点:
output.path:webpack打包输出地址
output.publicPath:此选项指定在浏览器中所引用的「此输出目录对应的公开 URL」
配置好这些,对于在域名首页下的单面,基本没有啥的问题,但是二级、三级等子目录下的页面,会有各种问题。这里逐一展开。
系统中的相对路径和绝对路径
相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。使用相对路径可以为我们带来非常多的便利。
相对路径简而言之就是相对自己所在的目录来引用其他文件,比如:
“. ./“ 代表当前文件的上一级目录
“./” 代表当前文件所在目录
绝对路径:绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。
绝对路径就是相对根目录(磁盘)开始,每个文件使用的路径都是一样的。
web页面中的相对路径与绝对路径
前端开发中使用相对路径的地方无非就两处:
html 文件中引入资源(js、css、img等)
css 文件中引入背景图片background-image
html 和css 中引用资源时
相对路径都是相对文件本身路径
绝对路径都是网页 URL的根路径
不管是相对路径还是绝对路径,两者情况大体相同:
html 中引入的资源(包括js、css、img)
相对路径:相对的是 网页本身的 URL,即 http://example.com/beta/test
绝对路径:相对的是 网页 URL 的根路径,即 http://example.com
css 中引入的资源
相对路径:相对的是 css 文件本身的 URL,即 http://example.com/beta/index...
绝对路径:相对的是 网页 URL 的根路径,即 http://example.com
public/static/assets目录的区别
assets 目录,在编译过程中会被 webpack 处理,当做模块依赖,只支持相对路径的形式。一般放置可能会变动的文件。
static 目录,一般存放第三方文件,不会被 webpack 解析,会直接被复制到最终的打包目录(默认是 dist/static )下,必须使用绝对路径引用,这些文件是不会变动的。
使用相对路径,还是会被webpack处理
public 目录,任何放置在 public 文件夹的静态资源都会被简单的复制,而不经过 webpack 。需要通过绝对路径来引用。其实是和static目录是一样的,只是命名不同而已。
css样式文件资源引入路径404解决办法:
最简单的办法就是把图片字体都打包程base64。
如果不是做base64转换呢?
在 webpack 5 之前,我们可以用 file-loader 或 url-loader 处理这些字体文件,但在 webpack 5 中,我们已经没有必要再去安装对应的 loader 了,因为我们可以使用 Asset Modules 来处理这些文件。
Webpack 4
raw-loader(将文件导入为字符串)
file-loader(将文件发送到输出目录)
url-loader(将文件发送到输出目录,或转为 Data URI 内联到 bundle 中)
Webpack 5
asset/resource 发送一个单独的文件并导出 URL(之前通过使用 file-loader 实现)
asset/inline 导出一个资源的 data URI(之前通过使用 url-loader 实现)
asset/source 导出资源的源代码(之前通过使用 raw-loader 实现)
asset 在导出一个 data URI 和发送一个单独的文件之间自动选
比如:
module: { rules: [ // ... { // 添加字体文件的处理规则 test: /.ttf|eot|woff2?$/i, type: 'asset/resource', generator: { // 输出到 font 目录中,占位符 [name] 保留原始文件名, // [hash] 防止出现相同文件名无法区分,[ext] 拿到后缀名 filename: 'font/[name].[hash:6][ext]' } }, { //图片处理 test: /\.(png|jpg|gif)$/, type: 'asset/resource', // (webpack 5) }, ] }
解决css静态路径404问题
第一需要设置 css输出路径,比如 vue-cli:
直接修改webpack 配置如下:
module: { rules: [ { test: /\.css$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { publicPath: "/public/path/to/", }, }, "css-loader", ], }, ], },
替换css里面静态资源路径(font/背景图片)
网上给的方案是这个:https://www.npmjs.com/package/webpack-plugin-replace-css-url
其实可以用这样解决:
const { extname } = require('path'); class ReplaceCSSStaticUrlPlugin { apply(compiler) { // emit: 在生成资源并输出到目录之前 compiler.hooks.emit.tapAsync('ReplaceCSSStaticUrlPlugin', (compilation, callback) => { const assets = Object.keys(compilation.assets); const assetsLen = assets.length; for (let i = 0; i < assetsLen; i++) { const fileName = assets[i]; const name = extname(fileName); if (extname(fileName) !== '.css') { continue; } const asset = compilation.assets[fileName]; let minifyFileContent = asset.source().toString() .replace( /\{\{\s*BK_STATIC_URL\s*\}\}/g, () => '../../', ); /*minifyFileContent.replace(/url\(static\/img\/iconcool/g,($1,$2)=>{//正则替换})*/ if(process.env?.version ==='open'){ minifyFileContent = minifyFileContent.replace('url(static/img/iconcool', 'url(../img/iconcool') // 设置输出资源 compilation.assets[fileName] = { // 返回文件内容 source: () => minifyFileContent, // 返回文件大小 size: () => Buffer.byteLength(minifyFileContent, 'utf8'), }; } callback(); }); } } module.exports = ReplaceCSSStaticUrlPlugin;
参考文章:
web相对路径和绝对路径的区别-前端开发(文件路径,图片路径) https://blog.csdn.net/qq_41271393/article/details/89577063
解惑页面中的相对路径和绝对路径 https://segmentfault.com/a/1190000007491687
转载本站文章《web静态资源处理:相对路径和绝对路径的引用—css资源404》,
请注明出处:https://www.zhoulujun.cn/index.php?m=content&c=index&a=show&catid=186&id=8788