美文网首页
webpack工程化06(文件处理)

webpack工程化06(文件处理)

作者: Mr绍君 | 来源:发表于2018-12-31 14:12 被阅读10次

今天来说说,webpack中文件的处理,先来看一个简单的demo。

//base.css
body {
    background: url('../assets/img/2017yj.jpg')
}
//app.js
import './style/base.css'
webpack.config.js
const path = require('path')

module.exports = {
    entry: {
        app: path.join(__dirname, 'src/app.js')
    },
    output: {
        filename: '[name].bundle.js',
        path: path.join(__dirname, 'dist')
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    {loader: 'style-loader'},
                    {loader: 'css-loader'}
                ]
            }
        ]
    }
}

我们之前讲过style-loader,跟css-loader一个是处理css一个是把css插入到html中。

但是在我们进行打包的是时候,会报一个错误,这是因为图片属于资源文件,我们需要额外的loader来处理。

所以,我们需要借助file-loader来处理图片资源。

在rules下面加一条规则

            {
                test: /\.(png|jpg|jpeg|gif)$/,
                use: [
                    {
                      loader: 'file-loader',
                      options: {}
                    }
                ]
            }

然后我们再重新打包一下。

打包成功,但是页面上依然没有图片,我们可以打开开发工具看一下,这张图片的地址,发现图片的地址不对,应该是从dist下面取,所以我们在output中加一个publicPath


 output: {
        filename: '[name].bundle.js',
        publicPath: 'dist/',
        path: path.join(__dirname, 'dist')
    },

再重新打包,图片就出来。

有些时候,我们可能需要把一些小图片打包成base64位,那么我们就可以使用url-loader

                test: /\.(png|jpg|jpeg|gif)$/,
                use: [
                    {
                      loader: 'url-loader',
                      options: {
                        limit: 1000
                      }
                    }
                ]

如果limit不设置,则默认打包成base64位


再优化一点,我们可以使用img-loader将图片的大小进行压缩。

test: /\.(png|jpg|jpeg|gif)$/,
                use: [
                    {
                      loader: 'url-loader',
                      options: {
                        limit: 1000
                      }
                    },
                    {
                        loader: 'img-loader',
                        options: {
                            plugins: [
                                require('imagemin-mozjpeg')({
                                    progressive: true,
                                    arithmetic: false
                                }),
                            ]
                        }
                    }
                ]

再打包一下,图片就由原来的125kb变成了80kb


此外还有一些小图标,我们希望可以合成雪碧图或者是字体图标,这样可以减少网络请求,使用也方便。

我们可以使用一个插件webpack-spritesmith

        new SpritesmithPlugin({
            src: {
                // 需要合成雪碧图的目录,以及图片格式
                cwd: path.resolve(__dirname, 'src/assets/img'),
                glob: '*.png'
            },
            target: {
                // 成功雪碧图的目录,以及字体样式
                image: path.resolve(__dirname, 'src/assets/img/sprite.png'),
                css: [
                    path.resolve(__dirname, 'src/assets/font/sprite.styl'),
                ]
            },
            apiOptions: {
                cssImageRef: "~sprite.png"
            }
        })

而且在npm上,css配置可以用函数来处理,也就是说我们根据自己的需求来生成文件,比如h5有时候需要2倍的图标。


华丽的分割线,下面说说第三方依赖的处理


比如我现在要在项目中用jquery,要怎么处理呢?

第一种方式,就是直接用cdn在项目中引入,这种方式当然是可以的,但项目中一般不这么干。

第二种方式就是通过插件来处理,(ProvidePlugin)这个插件是webpack自带的,所以不需要额外安装包,只需要引入webpack就行。

        new webpack.ProvidePlugin({
            $: 'jquery'
        })

配置也很简单,给ProvidePlugin传一个key-value的对象。

//app.js
import './style/base.css'

setTimeout(()=> {
    $('#app').html('this is jquery')
},2000)

其他不变,我们打包试一下。

app.bundle.js的文件大小变成了80KB,我们再来看一下结果。(2秒之后,内容变成了this is query)

之前jquery是通过npm安装的,但是如果jquery文件在本地怎么办呢?

我们可以配置一个路径映射来解决。

npm uninstall jquery -D

我们先把jquery卸载掉,然后下载一个jquery.min.js放在本地。

在配置文件中加一个映射

 resolve: {
        alias: {
            jquery: path.join(__dirname, 'src/common/jquery.min.js')
        }
    },

重新打包,也是正常的。

相关文章

网友评论

      本文标题:webpack工程化06(文件处理)

      本文链接:https://www.haomeiwen.com/subject/hwyxlqtx.html