zoukankan      html  css  js  c++  java
  • vue-cli webpack url-loader

    在项目打包时发现

    static文件在打包时原封不动的打包到dist下的images文件下了。

    但是奇怪的是还有一个名叫img的文件夹。

     

     经过对比发现img里的文件都是images里的图片文件。

    而且数量远远比images里的文件少,还带了一串哈希值。

    然后发现哈希值前面的名称在images里对应图片名称。

    那么为什么是多出来这些文件呢?这些文件明显重复需要优化,那能不能去掉?

       从文件命名方式应该是url-loader打包生成的文件。

     然后就开始我的踩坑之行

     一、既然是url-loader打包生成的文件,为啥会出现?

    因为webpack打包的原因,在页面使用import引入图片或者css里引入图片时。webpack会对文件分析模块打包,使用url-loader分析打包生成了一个图片。

    至于生成图片的位置不写就是图片默认的位置和名称。

        二、那能不能避免掉?

    1、可以选择在页面<template>里用绝对地址引入。

    2、或者把url-loader的limit属性设置大一点,生成base64。(这个在性能优化上肯定不靠谱,不能用)

    三、既然是url-loader打包的,那能不能修改配置。把打包路径写在相同文件夹下,用同一个名字覆盖掉?

    开始

    vue-cli项目默认是没有生成vue.config.js文件的。需要手动创建。在官网查询了

    给地址吧,请记住这个网址。

     在官网查询了之后,配置了下面的代码。

    configureWebpack: {
            module:{
                rules:[
                    {
                        test: /.(png|jpe?g|gif|svg)(?.*)?$/,
                        include:/src/,               // 在源文件目录查询
                        use: [{ // 图片文件小于8k时编译成dataUrl直接嵌入页面,超过8k回退使用file-loader
                            loader: 'url-loader',
                            options: {
                                limit: 1024*8, // 8k
                                name:'[path]/[name].[ext]', // 利用[path]路径获取文件夹名称并设置文件名
                                fallback: 'file-loader',  // 当超过8192byte时,会回退使用file-loader
                                context: path.resolve(__dirname,'./src'),//过滤掉[path]的相对路径
                                publicPath: './' //采用根路径
                            }
                        }]
                    }
                ]
            }
        },

    打包发现没有再生成img文件了,只有一个images文件。而且是按照src下的目录结构生成的。完美~。

    四、然鹅,在项目编译时,我的图片不见了?我可慌了。

    一开始以为是所有图片地址不对了,然而发现在template里这样引入是可以的。

               <image style=" 200px; height: 200px; background-color:#eeeeee;" 
                              src="/static/images/changeMarjors/apply-checkbox-fill.png"
    ></image>
    

      那就是important的问题了。

    然后以为是使用configureWebpack属性覆盖了其他属性,可能是@别名被覆盖掉了。

    但是在测试组件时发现别名是在的。

     然后我就百度了一天。url-loader 图片丢失的问题。

    发现网友都是在讲,图片打包丢失,相对位置的事情。

    这里给个靠谱网友连接

    网友讲得都对。可是我不是打包后丢失,我是在编译后就丢失了。

    一天无果后,我就打印了一下看看我引入的 img是什么

    这个是什么?眼熟不?这是最开始出现问题的地址啊?气吐血。早点看到这个地址我也不会百度一天!

    我明明已经修改了url-loader的配置。地址已经改到images文件夹下面了。img文件夹根本不存在啊?正确地址应该是下面这个

    如果我的配置不生效那么打包不会正确啊。如果生效那编译不会出现原来的地址啊?

    我真的是想破了脑袋。

    五、多个url-loader配置混乱

    后来我认真想了一下,出现两个结果会不会是有两个url-loader混乱使用。打包时使用我配置的,编译时使用了另外一个。

    这个也不是不可能,vue-cli默认配置好了webpack.config.js。都没有暴露出配置。vue.config.js我也配置了一个。会不会在这里重复的?

    还记得这张图吗?圈红的是什么?

    明明在眼前。我却错过了一天,再次吐血。

    六、替换loader

    下图,要替换就要使用chainWebpack的语法。拿到loader的别名,就是下图中的"svg"字符串,

    要知道vue-loader的别名是什么?那怎么知道别名?

     七、暴露webpack配置拿到别名。还是那张vue-cli官网。

    然而我暴露失败了。生成的input.js是空白的!,空白的!,空白的!

    气死我。

     我没解决这个问题,但是网友暴露成功了,再给个连接,去看这个链接里的图片。

    我自己暴露失败是因为我是全局安装的vue.2.9的版本、这个暴露命令是3.0和4.0版本的。我重新安装4的就可以成功了

    看到这行我都快哭了。

     最后完成了我的配置

    chainWebpack: config => {
            const urlLoader = config.module.rule('images')
            // 清除已有的所有 loader。
            // 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后。
            urlLoader.uses.clear()
            // 添加要替换的 loader
            urlLoader
                .test(/.(png|jpe?g|gif|svg)(?.*)?$/)
                .use('url-loader')
                .loader('url-loader')
                .options( {
                    limit: 1024*1, // 8k
                    name:'[path][name].[ext]', // 利用[path]路径获取文件夹名称并设置文件名
                    fallback: 'file-loader',  // 当超过8192byte时,会回退使用file-loader
                    context: path.resolve(__dirname,'./src'),//过滤掉[path]的相对路径
                    publicPath: './' //采用根路径
                })
        }
    

      发现打印地址终于对了。

    我也以为结束了。天真。

    页面是有两张图片的,一张是css背景图引入,一张是image src import 引入。

    现在出现的是背景图。打印的地址是important引入的。

    也就是说,我打印的地址,还是没有找到。

    还记得我百度一天的rurl-loader 图片丢失的问题吗?

    八、相对地址问题

    网友的链接里讲了这句话:

    但是CSS里相对路径是相对于CSS文件,而JS文件相对路径是相对于index.html。
    导致引入同样的图片,在CSS和JS中指向了不同的目录。

    我打包对应页面也确实是相对路径,这个地址对于index.f3XXX.css是对的,

    但是对于我生成的pages-mine-index.9616a8f8.js是错误的

    正确应该是上级目录下的static

    ../static/images/changeMarjors/apply-checkbox-fill.png

    那么为什么会出现这个相对路径?

    是因为我们根目录配置的publicPath和url-loader里的publicPath。

    因为我在url-loader里的publicPath配置了,在解析图片类型数据时使用的是url-loader里的publicPath,

    因为我配置的都是一样的。”./"所以都使用了这个地址。

    那么我现在修改url-loader内的publicPath,使用绝对路径。

    publicPath: '/' //采用根路径

    这时我在看打包生成地址此时两个都是绝对地址了。

     

    这个时候页面编译也正常了。两个图片都正确显示了。

     

    盒子是import导入图片,这是页面代码。

    <template>
        <view>
            <view>我的页面</view>
            <view class="test" style=" 200px; height: 200px;">
    <!--                        <image style=" 200px; height: 200px; background-color: #eeeeee;"-->
    <!--                               src="/static/images/changeMarjors/apply-checkbox-fill.png"-->
    <!--                        ></image>-->
            </view>
            测试图片
            <image style=" 200px; height: 200px;"
                   :src="img"
            ></image>
            <nav-bar-layout>
                <view slot="content">111111111111</view>
            </nav-bar-layout>
        </view>
    </template>
    <script>
        import img from "@/static/images/changeMarjors/apply-checkbox-fill.png";
        import NavBarLayout from "@/components/NavBarLayout"
        // import img from "@/static/images/termPaper/1.gif"
        console.log(img)
    
        export default {
            components:{
                NavBarLayout
            },
            data() {
                return {
                    img: img
                }
            }
        }
    </script>
    <style lang="scss" scoped>
        .test {
           background-image: url(~@/static/images/termPaper/2.gif)
        }
    </style>
    

      终于算结束了。

    另外,修改vue.config.js是需要重新编译才会生效的

  • 相关阅读:
    Ubuntu18.04下的音频录制和编辑软件Ardour及QjackCtl(jackd gui)
    Adobe After Effects CS6 操作记录
    编译安装和apt安装Nginx1.14.0
    Centos7.4和Ubuntu18.04安装PHP7.2
    Ubuntu与Windows7双系统下, 系统时间不一致的问题
    关于Thinkpad的立体声麦克风输入
    坑人的小米净水器: 漏水, 废水堵塞, 费用陷阱
    Photoshop CS6 操作记录
    Win7 64bit下值得推荐的免费看图软件
    Redis C客户端Hiredis代码分析
  • 原文地址:https://www.cnblogs.com/cbb-web/p/14668338.html
Copyright © 2011-2022 走看看