• home > tools > webServer > apache >

    web静态资源处理:相对路径和绝对路径的引用—css资源404

    Author:zhoulujun Date:

    前端开发中使用相对路径的地方无非就两处:html 文件中引入资源(js、css、img等)css 文件中引入背景图片、icon等。对于主域次级目录,css里面的资源出现404如何解决?

    webpack静态资源处理,这里略过,感兴趣,请看:https://www.zhoulujun.cn/html/tools/Bundler/webpack/

    对于静态资源打包,https://webpack.docschina.org/configuration/output/ 看了这个文档打包出来,放到服务器上还是会遇到一系列问题

    其实重点就这个几个点:

    配置好这些,对于在域名首页下的单面,基本没有啥的问题,但是二级、三级等子目录下的页面,会有各种问题。这里逐一展开。


    系统中的相对路径和绝对路径

    • 相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。使用相对路径可以为我们带来非常多的便利。

      相对路径简而言之就是相对自己所在的目录来引用其他文件,比如:

      • “. ./“ 代表当前文件的上一级目录

      • “./” 代表当前文件所在目录

    • 绝对路径绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。

      绝对路径就是相对根目录(磁盘)开始,每个文件使用的路径都是一样的。

    web页面中的相对路径与绝对路径

    前端开发中使用相对路径的地方无非就两处:

    1. html 文件中引入资源(js、css、img等)

    2. css 文件中引入背景图片background-image

    html 和css 中引用资源时

    • 相对路径都是相对文件本身路径

    • 绝对路径都是网页 URL的根路径

    不管是相对路径还是绝对路径,两者情况大体相同:

    1. html 中引入的资源(包括js、css、img)

      • 相对路径:相对的是 网页本身的 URL,即 http://example.com/beta/test

      • 绝对路径:相对的是 网页 URL 的根路径,即 http://example.com

    2. 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:

    Vue static 静态资源路径 和 style问题


    直接修改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