webpack 基础配置

253 阅读3分钟

babel-loader


es6编译

编译ES6语法

  1. 安装babel-loader、@babel/core、@babel/preset-env
npm install babel-loader @babel/core @babel/preset-env --save--dev
  1. 编写loader配置文件(webpack.config.js)
const webpack = require("webpack");

module.exports = {
    // entry:'./index.js',
    // entery:['index.js','index2.js']
    entry:{
        index: './src/index.js'
    },
    output:{
        path:__dirname+'/mybundle',
        filename:'./js/[name].[hash:5][id].js'
    },
    module:{
        rules:[{
            test:/\.js$/,//识别文件后缀
            use:{
                loader:'babel-loader',
                 options:{
                     presets:[
                     ['@babel/preset-env',{
                         targets:{
                             browsers:['>1%','last 2 versions']//兼容大于市面占有大于百分之一的浏览器、兼容最新的两个版本浏览器。
                             //node:'10' node10 为目标
                             //chrome:'56' chrome 56版本为目标
                         }
                     }]
                     ]
                 }
            }
        }]
    },
}
  1. webpack 开始打包
webpack

编译ES6方法

全局编译

利用es5的写法,重写es6的方法,并把方法赋值到全局环境,生成全局变量。适用于项目开发,打包后文件体积较大

  1. 安装babel-polyfill(全局添加ES6方法)
npm install babel-polyfill --save--dev
  1. 编写loader配置文件(webpack.config.js)
module.exports = {
    entry:{
        index: ['babel-polyfill','./src/index.js']
    },
    output:{
        path:__dirname+'/mybundle',
        filename:'./js/[name].[hash:5][id].js'
    },
    module:{
        rules:[{
            test:/\.js$/,
            // use:'babel-loader'
            use:{
                loader:'babel-loader',
                 options:{
                     presets:[['@babel/preset-env',{
                         targets:{
                             browsers:['>1%','last 2 versions']
                         }
                     }]],
                 }
            }
        }]
    }
}
  1. webpack 打包
webpack

按需编译

利用es5的写法,按需重写es6的方法,并把方法赋值到局部环境,生成局部变量。适用于框架开发,打包后文件体积较小

  1. 安装@babel/plugin-transform-runtime、@babel/runtime(局部添加ES6方法)
npm install @babel/plugin-transform-runtime、@babel/runtime --save--dev
  1. 编写loader配置文件(webpack.config.js)
module.exports = {
    entry:{
        index: ['./src/index.js']
    },
    output:{
        path:__dirname+'/mybundle',
        filename:'./js/[name].[hash:5][id].js'
    },
    module:{
        rules:[{
            test:/\.js$/,
            // use:'babel-loader'
            use:{
                loader:'babel-loader',
                 options:{
                     presets:[['@babel/preset-env',{
                         targets:{
                             browsers:['>1%','last 2 versions']
                         }
                     }]],
                     plugins:[
                        ['@babel/transform-runtime']
                    ]
                 }
            }
        }]
    }
}
  1. webpack 打包
webpack

babel-loader 的配置文件,可以独立出来

生成一个".babelrc"的文件,把option的value迁移过去

  1. babelrc文件
{
    "presets":[
        ['@babel/preset-env',{
        "targets":{
            "browsers":['>1%','last 2 versions']
        }
    }]
    ]
}
  1. webpack.config.js
module.exports = {
    // entry:'./index.js',
    // entery:['index.js','index2.js']
    entry:{
        index: './src/index.js'
    },
    output:{
        path:__dirname+'/mybundle',
        filename:'./js/[name].[hash:5][id].js'
    },
    module:{
        rules:[{
            test:/\.js$/,
            // use:'babel-loader'
            use:{
                loader:'babel-loader',
                // options:{
                //     presets:[['@babel/preset-env',{
                //         targets:{
                //             browsers:['>1%','last 2 versions']
                //         }
                //     }]]
                // }
            }
        }]
    },
}

语法糖编译

编译Typescript

  1. 安装typescript、ts-loader
npm install typescript ts-loader --save--dev
  1. 编写loader配置文件(webpack.config.js)
module.exports = {
    // entry:'./index.js',
    // entery:['index.js','index2.js']
    entry:{
        index: './src/index.js'
    },
    output:{
        path:__dirname+'/mybundle',
        filename:'./js/[name].[hash:5][id].js'
    },
    module:{
        rules:[{
            test:/\.js$/,
            // use:'babel-loader'
            use:{
                loader:'babel-loader',
                 options:{
                     presets:[['@babel/preset-env',{
                         targets:{
                             browsers:['>1%','last 2 versions']
                         }
                     }]]
                 }
            }
        },{
            test:/\.tsx?$/,
            use:{
                loader:'ts-loader',
            }
        }]
    }
}
  1. 编写tsconfig.json 文件(ts 的配置文件)
{
    "compileOptions": {
        "module":"common.js",//模块化方式
        "target":"es5",//编译语法目标
    },
    "exclude":["./node_modules"]//排除不处理的文件夹
}
  1. webpack 打包
webpack

css-loader、style-loader


简介

css可以通过js文件被引入,但必须使用相应的loader

  1. css-loader,让css可以被js正确引入
  2. style-loader,让css被引入后可以被正确的以一个style标签插入页面
  3. 两者顺序很重要,要先经过css-loader处理,再由style-loader处理

使用

  1. 安装style-loader、css-loader
npm install style-loader css-loader --save--dev
  1. 在js中引入css
import "./index.css"
import "./index2.css"
function component() {
    console.log('index1')
}
component()
  1. 编写loader配置文件(webpack.config.js)
  • style-loader

webpack.config.js

{
    test:/\.css$/,
    use:[{
        loader:'style-loader',
        options:{
            insert:'top',//相对于头部的top,buttom:相对于头部的buttom
            injectType:'singletonStyleTag',////多个css文件的时候,是否合成一个style节点
        }
    },{
        loader:'css-loader'
    }]
}
  • css-loader
{
        loader:'css-loader',
        options:{
            modules:true,//启用/禁用CSS模块及其配置
            //modules:{
            //localIdentName:'[path][name]_[local]_[hash:4]'//名字格式
            //},
        }
}

index2.css

.bc{
    width: 100px;
    background-color: yellow;
}
:global .border-white{/*全局*/
    border:4px solid white;
}
:local .border-green{/*局布*/
   border: 3px solid #00ff00;
}
:local .div1{/*局布*/
    width: 50px;
    height: 50px;
    background-color: pink;
    composes: border-yellow from './index.css';
}

index.css

body{
    background-color: brown;
}
.border-yellow{
    border: 4px solid yellow;
}

index.js

import test1 from "./index.css";
import test2 from "./index2.css";
document.getElementById("mydiy").setAttribute('class',test1.div1) //因为local修饰的css类名,会把css修饰为hash值。

关于css-loader 请看css-loader

  1. webpack 打包
webpack

less-loader、sass-loader


简介

  1. less,sass是css预处理语言,用来帮助我们更方便的写css。更方便团队合作
  2. less,sass浏览器是无法直接识别的,需要编译成css才能被识别。所以我们用less,sass写的文件都要编译。

使用

  1. 安装less、less-loader sass-loader、node-sass
npm install less less-loader --save--dev
npm install sass-loader node-sass --save--dev
  1. 编写loader配置文件(webpack.config.js)
{
    loader:'less-loader'
}
  1. webpack打包
webpack

注意:这里要注释loader的顺序,是一个由下到上的顺序,所以我们是一个逆序,从下到上分别是less-loader、css-loader、style-loader

extract-text-webpack-plugin


简介

webpack本来只能能打包处理.js文件,但是通过强大的loader之后,可以打包处理各种类型的文件。比如:.css文件等。
表面上webpack通过loader可以打包各种文件了,已经完美了。但是在某些场景中也存在着问题的,比如我们的css的内容都被打包到bundle.js里面了。在生产环境中我们通常会利用浏览器的缓存来提高用户体验,用上了webpack的hash(正常js文件hash类型会使用chunkhash)。

那么问题来了:
我只要修改了js部分的代码,那么我的css模块也会被重新打包,被当成css模块也有内容修改。
或者只修改了css模块,js模块是没有变化的,但是他们都是在一个bundle中,所以都会被认为都有修改。

解决方案:
思路:将css模块和js模块分开打包,换句话说把css代码从js文件中抽离出来,单独出一个模块。

使用

  1. 安装extract-text-webpack-plugin
npm install extract-text-webpack-plugin@next webpack --save--dev //webpack4
npm install extract-text-webpack-plugi webpack --save--dev //webpack3
  1. 编写loader配置文件(webpack.config.js)
var extractTextCss =  require('extract-text-webpack-plugin');

{
    test:/\.css$/,
    use:extractTextCss.extract({
        fallback:{
            loader:'style-loader',
            options:{
                singleton:true
            }
        }
        use:[
        {
            loader:'css-loader',
            options:{
                modules:true,//启用/禁用CSS模块及其配置
                modules:{
                localIdentName:'[path][name]_[local]_[hash:4]'//名字格式
                },
            }
        }
        ]
    })
}   

 plugins:[new extractTextCss({
        filename:'[name].min.css' //打包后css的位置和名字
    })]
  1. webpack打包
webpack
  1. 用link标签引入css
<link rel="stylesheet" href="./mybundle/index.min.css">

postcss-loader


简介

postcss-loader 应该是 Webpack 配置中不可或缺的一个 CSS loader。它负责进一步处理 CSS 文件,比如添加浏览器前缀,压缩 CSS 等。

配置 postcss-loader 时,可以在 webpack.config.js 中配置具体选项,也可以新建一个 postcss.config.js,专门定义 postcss-loader 的配置。

使用

  1. 安装 postcss、postcss-loader、autoprefixer、 postcss-cssnext
npm install postcss postcss-loader autoprefixer  postcss-cssnext --save--dev
  1. 编写loader配置文件(webpack.config.js)
{
    loader:"postcss-loader"
    options:{
        ident:'postcss',//plugins的给谁使用
        plugins:[
            require('autoprefixer')({
            'overrrideBrowserslist':[">1%","last 2 versons"]
            
             require('postcss-cssnext')//需要使用cssnext语法的时候加上
                
            })//自动添加前缀 -mom
        ]
    }
}//写在css-loader和less-loader中

这里的'overrrideBrowserslist':[">1%","last 2 versions"]配置还能写在package.json,这里会应用到全局避免重复填写

"browserslist":[
    ">1%","last 2 versions"
]

也可以添加一个.browserslistrc文件

  1. webpack打包
webpack

html-webpack-plugin

简介

为html文件中引入的外部资源如script、link动态添加每次compile后的hash,防止引用缓存的外部文件问题
可以生成创建html入口文件,比如单页面可以生成一个html文件入口,配置N个html-webpack-plugin可以生成N个页面入口
github上有些关于htmlwebpackplugin的属性介绍

使用

  1. 安装 html-webpack-plugin
npm install html-webpack-plugin --save--dev
  1. 配置webpack
var htmlWebpackPlugin = require('html-webpack-plugin')

plugin: [new htmlWebpackPlugin({
    filename:'index.html',
    template:'./index.html',
    minify:{
        collapseWhitespace:true//是否压缩
    },
    inject:true,//自动添加js和css
    chunks:['app1','app2'],//判断需要引入哪些入口文件
})]

3.webpack打包

webpack

总结

以上仅仅是个人的学习到的一些基本用法,可能在详细的loader用法,还需要查看npm文档。请各位大神指导指导