12. 重学webpack——提取CSS,指定CSS和图片的目录

推荐:《webpack学完这些就够了》

《webpack学完这些就够了》该专题主要讲述webpack4.x从入门到成仙的学习笔记,配置和原理应有尽有。现在由于webpack5.0的诞生,打算从现在开始从0开始写一遍webpack5.0的学习笔记,与大家一起分享学习。

以下是本节正文:

提取CSS,指定CSS和图片的目录

  • 因为CSS的下载和JS可以并行,当一个HTML文件很大的时候,我们可以把CSS单独提取出来加载

1. 提取CSS,打包后的css放到指定目录

这里需要借助到mini-css-extract-plugin,并配置两个地方(详见代码)

// webpack.config.js
// 需要修改两个地方
	//  1. 在样式的loader最后一个style-loader改成MiniCssExtractPlugin.loader
	//  2. 调用miniCssExtractPlugin,并且指定输出的filename

module: {
    rules: [
        { test: /\.txt$/, use: 'raw-loader' },
              { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'] }, // 在样式的loader最后一个style-loader改成MiniCssExtractPlugin.loader
              { test: /\.less$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'] }, // 在样式的loader最后一个style-loader改成MiniCssExtractPlugin.loader
              { test: /\.scss$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'] }, // 在样式的loader最后一个style-loader改成MiniCssExtractPlugin.loader
        { test: /\.(jpg|png|bmp|gif|svg)$/, 
         use: [{
             loader: 'url-loader', 
             options: {
                 esModule: false,
                 name: '[hash:10].[ext]',
                 limit: 8*1024
             }
         }]
        }
    ]
},
plugins: [
    new HtmlWebpackPlugin({ template: './src/index.html' }),
    new MiniCssExtractPlugin({
        filename: '[name].css'
    })
]

这时候,进行构建,会将css的文件单独抽出到dist下

那么,如何将抽离的css放到指定文件夹呢?

  • 只需要将插件配置项filename的值改为路径形式,比如filename: '[name].css'改为filename: 'css/[name].css',这样,就能在dist下创建css目录,将样式打包到该目录下

2. 图片放到指定目录

需要将图片放到指定目录,只需要在url-loader配置outputPargpublicPath属性即可

 module: {
     rules: [
         { test: /\.txt$/, use: 'raw-loader' },
         { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'] },
         { test: /\.less$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'] },
         { test: /\.scss$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'] },
         { test: /\.(jpg|png|bmp|gif|svg)$/, 
          use: [{
              loader: 'url-loader', 
              options: {
                  esModule: false,
                  name: '[hash:10].[ext]',
                  limit: 8*1024,
                  outputPath: 'images', // 在这里配置输出的文件路径,在这里能够将图片放到dist下的images下
                  publicPath: '/images' // 这个配置,是更改引用图片时候的路径,如果不写,则默认与outputPath值前面加一个'/',表示根路径(域名)下开始。如果写了,则代表图片前面会加上该路径。这里需要注意:如果outputPath是'images',但是publicPath写了其他的,比如'abcd',那么就会导致编译后图片地址为‘域名/abcd/图片’,而dist下的图片在`dist/images/图片`,显然,这时候页面引用的地址是找不到图片的,所以这样资源引用就是错误的!所以,建议publicPath值为'/'+outputPath的值,除非你讲图片放到了CDN等资源服务器上。
                  // 这里特别注意:publicPath为'/images'与'images'是有区别的,前者是域名后跟/images,例如localhost/images/xxx.png,而后者等同于'./images/,是对当前路径的拼接,假设你css文件中引用了background地址为'./xxx.png',而你这个css抽离到了styles文件夹下,那么这时候其实网页上引用的图片地址是'localhost/styles/xxx.png',而你的publicPath写成了'images‘,相当于css文件引用的background的地址从'./xxx.png'改成了'./images/xxx.png',那么打包出来样式放在styles文件夹下,这时候其实网页上引用的图片地址是'localhost/styles/images/xxx.png' ,但是outputPath又是'images',也就是其实图片都到了images下,并不是在styles下,这就会有问题了。这就是两个值带不带'/'产生的区别。
              }
          }]
         }
     ]
 },
  • outputPath: 'images' : 在这里配置输出的文件路径,在这里能够将图片放到dist下的images下
  • publicPath: '/images'这个配置,是更改引用图片时候的路径,如果不写,则默认与outputPath值前面加一个’/’,表示根路径(域名)下开始。如果写了,则代表图片前面会加上该路径。这里需要注意:如果outputPath是’images’,但是publicPath写了其他的,比如’abcd’,那么就会导致编译后图片地址为‘域名/abcd/图片’,而dist下的图片在dist/images/图片,显然,这时候页面引用的地址是找不到图片的,所以这样资源引用就是错误的!所以,建议publicPath值为’/’+outputPath的值,除非你讲图片放到了CDN等资源服务器上。

3.publicPath为’/images’与’images’的区别

publicPath为’/images’与’images’是有区别的,前者是域名后跟/images,例如localhost/images/xxx.png,而后者等同于’./images/,是对当前路径的拼接,假设你css文件中引用了background地址为’./xxx.png’,而你这个css抽离到了styles文件夹下,那么这时候其实网页上引用的图片地址是’localhost/styles/xxx.png’,而你的publicPath写成了’images‘,相当于css文件引用的background的地址从’./xxx.png’改成了’./images/xxx.png’,那么打包出来样式放在styles文件夹下,这时候其实网页上引用的图片地址是’localhost/styles/images/xxx.png’ ,但是outputPath又是’images’,也就是其实图片都到了images下,并不是在styles下,这就会有问题了。这就是两个值带不带’/'产生的区别。

上面需要特别注意

关于publicPath,可以阅读以下文章:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值