Webpack学习

背景

虽然在网上看了挺多webpack的教程,但还是对webpack这个工具一知半解,故想用自己的语言去理解webpack

一、webpack能做什么?

项目里的很多资源文件不能直接被浏览器识别,例如:ES6语法、sass/less预处理等,而Webpack可以把ES6的语法转为ES5语法、sass/less的语法转为css的语法,这样浏览器就可以识别出来了,相当于webpack给做了层转换。

代码压缩:缩小项目体积
热更新:代码发生变动后自动刷新浏览器页面,提升本地开发效率

...

二 、loader(模块加载器) 

对于webpack来说项目里的各种文件都称为资源,所以webpack在打包这些资源文件的时候需要用对应的loader来处理对应的文件类型,例如:
遇到.css后缀的资源文件需要用到css-loader 、style-loader
遇到.less后缀的资源文件需要用到less-loader 

...

需要注意的是当使用多个loader时webpack的处理顺序是从右往左,例如style-loadercss-loader的顺序

module: {
    rules: [
        {
            test: /\.css$/,
            // css-loader只负责加载css文件
            // style-loader负责将css样式添加到DOM中
            loader: ['style-loader','css-loader']
        },
        {
            test: /\.js$/,
            loader: 'babel-loader',
            include: [resolve('client'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
        },
        {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: 'url-loader',
            options: {
                limit: 10000,
                name: utils.assetsPath('img/[name].[hash:7].[ext]')
            }
        },
        {
            test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
            loader: 'url-loader',
            options: {
                limit: 10000,
                name: utils.assetsPath('media/[name].[hash:7].[ext]')
            }
        },
        {
            test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
            loader: 'url-loader',
            options: {
                limit: 10000,
                name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
            }
        }
    ]
}

三 、plugins (插件)

output: {
    path: path.resolve(__dirname,’./dist’), 
    filename:’./js/[name] - [chunkhash].js’//[name] 函数名 [chunkhash] 
    },
plugins: [
    new htmlWebpackPlugin({})
]

四 、webpack.config.js 默认webpack 配置文件 

const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');//npm 安装

module.exports = {
    //entry:'./src/js/index.js', 单文件入口
    //entry:['./src/js/index.js','./src/js/hello.js'],//单文件合并入口
    entry: {//
        index: './src/js/index.js',
        hello: './src/js/hello.js',
        world: './src/js/world.js'
    },
    output: {
        path: path.resolve(__dirname, './dist'),//导出路径
        filename: 'js/[name].js',//[name] 函数名 [chunkhash]
        // publicPath:'http:www.music.com'//公共的path
    },
    module: { //loader
        rules: [
            {
                test: /\.js$/,
                include: path.resolve(__dirname, 'src'),//包含路径
                //exclude:/node_modules/, 或使用绝对路径
                exclude: path.resolve(__dirname, 'node_modules'),
                use: {
                    loader: 'babel-loader',
                    // options: {
                    // presets: ['env']
                    // }
                }
            },
            {
                test: /\.css$/,
                include: path.resolve(__dirname, 'src'),//包含路径
                //exclude:/node_modules/, 或使用绝对路径
                exclude: path.resolve(__dirname, 'node_modules'),
                // loaders:'style-loader!css-loader'
                // use:['style-loader','css-loader']
                use: [
                    { loader: 'style-loader' },
                    {
                        loader: 'css-loader',
                        options: { modules: true, importLoaders: 1 }
                        //importLoaders处理css中import的css
                    },
                    {
                        loader: 'postcss-loader',
                        options: {
                            ident: 'postcss',
                            plugins: [
                                require('autoprefixer')({
                                    broswers: ['last 5 versions']
                                }),
                            ]
                        }
                    }
                ]
            },
            {
                test: /\.less$/,
                include: path.resolve(__dirname, 'src'),//包含路径
                //exclude:/node_modules/, 或使用绝对路径
                exclude: path.resolve(__dirname, 'node_modules'),
                use: [
                    { loader: 'style-loader' },
                    { loader: 'css-loader' },
                    { loader: 'less-loader' }
                ]
            },
        ]
    },
    plugins: [//插件
        new htmlWebpackPlugin({//会生成html文档位置与output有关
            template: 'index.html',//源模板文件
            filename: 'index.html',//生成html的文件名
            inject: true,//'head' 'body' false true定义嵌入js的位置
            title: 'this is good',//html的title标题
            minify: { //压缩html
                // collapseWhitespace:true,//删除空格
                // removeComments:true,//移除注释
                // minifyJS:true,//压缩js
            }
        })
    ]
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值