一、介绍

webpack是一个前端构建工具。
前端构建工具就是把开发环境的代码转化成运行环境代码。一般来说,开发环境的代码是为了更好的阅读,而运行
环境的代码则是为了能够更快地执行。因此开发环境和运行环境的代码形式也不相同。比如,开发环境的代码,要
通过混淆压缩后才能放在线上运行,这样代码体积更小,而且对代码执行也不会有任何影响。一般需要构建工具处
理的几种情况:
前端构建工具就是把开发环境的代码转化成运行环境代码。一般来说,开发环境的代码是为了更好的阅读,而运行
环境的代码则是为了能够更快地执行。因此开发环境和运行环境的代码形式也不相同。比如,开发环境的代码,要
通过混淆压缩后才能放在线上运行,这样代码体积更小,而且对代码执行也不会有任何影响。一般需要构建工具处
理的几种情况:
代码压缩
将JS、CSS代码混淆压缩,让代码体积更小,加载更快
编译语法
编写CSS时使用Less、Sass,编写JS时使用ES6、TypeScript等,这些标准目前都无法被浏览器兼容,因此需
要构建工具编译,例如使用Babel编译ES6语法。
处理模块化:
CSS和JS的模块化语法,目前都无法被浏览器兼容。因此开发环境可以使用既定的模块化语法,但是需要构建
工具将模块化语法编译为浏览器可识别形式。例如使用webpack、Rollup等处理JS模块化。
其他的构建工具:
最早普及使用的是Grunt,后面又出现Gulp。Webpack是目前流行的构建工具,可以说是构建工具的神器,
学习成本较高。

1.1什么地方适合使用

适合场景:
1. vue、react、angular 都可以通过webpack构建
2. 全部可供访问的页面数量不超过500个

二、安装配置

webpack官网:https://webpack.docschina.org/
步骤:
npm i webpack webpack-cli —save-dev
1. npm

  1. npm i xxx --save
  2. npm i xxx --save-dev
  3. --save 会把依赖包名称添加到 package.json 文件 dependencies 键下
  4. --save-dev 则添加到 package.json 文件 devDependencies 键下
  5. dependencies是运行时的依赖
  6. devDependencies是开发时的依赖

当npm i webpack webpack-cli —save-dev执行失败时

  • 以管理员身份运行vs code
  • 执行:get-ExecutionPolicy,显示Restricted,表示状态是禁止的
  • 执行:set-ExecutionPolicy RemoteSigned
  • 在执行第二步 显示 RemoteSigned
  1. Yarn
    yarn add jquery // 表示通过“运行依赖”方式安装jquery后边没有参数,运行依赖也有参数,为--save 简称 
    为 -S,但是可以不用设置 
    yarn add webpack -D // webpack后边有-D参数,表示通过“开发依赖”方式安装 开发依赖参数为 --save-dev 
    简称为 -D
    

为什么要设置-D参数呢
项目开发完毕可能会上传到网络(例如github),也有可能给朋友分享,无论哪种方式我们代码分享出去是不带
node_modules目录的,所以我只需要拿到package.json安装依赖就行。

三、案例

在根目录下创建src文件夹,其中一个是入口文件app.js,一个是写内容的work.js。入口文件用来引入真正写页面
的JS文件、CSS文件。
work.js内容:

document.write('铁蛋儿真帅')

app.js内容:

let dt = require('./work.js')

然后,再返回上一层目录,新建index.html文件(该文件和src属于同一层级),内容是:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src=./dist/main.js></script>
</body>
</html>

在命令行中执行:

webpack C:\Users\Administrator\Desktop\demo\demo\src\app.js

四、配置打包模式

给webpack配置打包模式,不配置打包会提示黄色
步骤:
1. 项目根目录创建webpack配置文件,名称为 webpack.confifig.js
2. 给webpack.confifig.js做如下配置

module.exports = {
    mode: 'development'
}

production: 生产模式,打包的文件是优化压缩的
development:开发模式,打包的文件有适当的回车、空白、注释
前期使用development,项目开发完毕即将上线就用production

五、配置入口和出口文件

项目主模板文件:index.html
项目主入口文件:src/app.js
项目出口文件:dist/main.js
现在我们要对入口和出口文件做配置
入口:src/app.js
出口:dist/main.js
步骤:

1. 配置快速启动项package.json

"scripts": { "build": "webpack" },

2. 给webpack.confifig.js做如下配置

 // webpack中引入其他的模块要使用commonJS模块化require导入 
 因为webapck是nodeJS开发的 不能使用 import导入
const ph = require('path')
module.exports = {

    mode: 'development',
    entry: ph.resolve('./src/app.js'),//出口文件
    output: {
        path: ph.resolve('./dist'),//配置出口目录
        filename: 'main.js' //出口文件名
    }
}

3. 打包 npm run build

六、编译模板页面

现在给项目做打包处理,要通过手动方式在index.html中引入打包好的main.js文件,太笨了
webpack有一个插件,可以实现同时打包/(复制)index.html到达dist目录,并自动就引入main.js文件,我们要做到
的事情就是直接运行打包好的模板文件即可
实现步骤:
1. 安装工具 yarn add html-webpack-plugin -D
2. 在webpack.confifig.js中配置如下信息:

// webpack中引入其他的模块要使用commonJS模块化require导入 因为webapck是nodeJS开发的 不能使用 import导入
const ph = require('path')
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {

    mode: 'development',
    entry: ph.resolve('./src/app.js'),//出口文件
    output: {
        path: ph.resolve('./dist'),//配置出口目录
        filename: 'main.js' //出口文件名
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: ph.resolve('./index.html')
        }),
    ],
};
  1. 在index.html模板中不用引入任何的js文件了
    4. 做物理打包 npm run build(编译生成模板文件了,并且有自动引入main.js文件)

七、实时打包

项目开发都是对src目录内部的文件进行更新,不要去修改dist打包好的文件
现在对src内部的任何文件做修改操作后,都需要重新打包,才可以看到对应效果
果,不需要反复打包,这样就非常好。
webpack-dev-server安装运行起来之后,会给我们创建一个http的web服务。
步骤:
1. 安装

yarn add webpack-dev-server

npm i webpack-dev-server --save-dev
  1. 在webpack.confifig.js中做如下配置
    // webpack中引入其他的模块要使用commonJS模块化require导入 因为webapck是nodeJS开发的 不能使用import导入
    const ph = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
     mode: 'development',
     entry: ph.resolve('./src/app.js'), // 绝对路劲
     devServer: {
         host: '127.0.0.1',
         port: '12345',
         open: true, // 是否自动打开浏览器
         compress: true, // 对网络请求文件进行压缩处理
     },
     output: {
         path: ph.resolve('./dist'), // 配置出口目录
         filename: "main.js" // 配置出口文件名称
     },
     plugins: [
         new HtmlWebpackPlugin({
             template: ph.resolve('./index.html'),
         }),
     ]
    }
    
    image.png
    3. 在package.json中做如下配置
    "scripts": {
     "build": "webpack",
     "serve": "webpack-dev-server"
    },
    
    image.png
    一定要注意webpack各个插件的版本问题,版本会报很多错。
    image.png
    指定版本下载方式
    npm install webpack-cli@3.3.12 --save-dev
    
  2. 通过 npm run serve 就可以实现 实时打包、实时编译、实时浏览器查看效果了
    注意:
    1. npm run serve指令执行后,其是一个“前台”进程,不能关闭
    2. 浏览器看到的实时效果是服务器通过“内存”提供的,没有物理文件,也不会生成dist目录

八、运行css文件

在当前项目中创建css文件并做引入使用会报错
1. 创建css文件 src/css/1.css, 和简单的样式 li{color:red;}
2. 在app.js中引入css文件 , import ‘./src/css/1.css’
3. 此时实时打包报错了
错误提示:需要一个适当的loader来处理css文件

8.1loader-介绍

webpack很厉害,可以打包处理不同的内容(css/img/less/es6、es7等等),但是具体处理工作webpack不参与,具体交给手下 loader去处理,loader是小兵,帮助webpack对不同内容做编码、降级处理
准确定义:
webpack本身就是一个打包机器,其不能对具体代码内容部分进行处理(或处理得非常有限),不同的代码内容(less/scss/ES6(ES7)/image/css等等)需要webpack找到不同的loader(装载器)实现转码、编译、降级处理。

8.2loader-安装配置css相关loader

css内容相关的loader有:style-loader 和 css-loader
安装配置步骤:
1. 安装

yarn add css-loader style-loader -D

npm i css-loader style-loader --save-dev
  1. 在webpack.config.js中做如下配置(注意use的顺序一定是如下)

    // webpack中引入其他的模块要使用commonJS模块化require导入 因为webapck是nodeJS开发的 不能使用import导入
    const ph = require('path');
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    module.exports = {
     mode: 'development',
     // 配置loader
     module: {
         rules: [{
             // 处理CSS loader
             test: /\.css$/, // 正则表达式匹配Css文件
             // 遇到了css文件就交给如下的loader处理
             use:["style-loader", "css-loader"],
         }]
     },
    
     entry: ph.resolve('./src/app.js'), // 绝对路劲
     devServer: {
         host: '127.0.0.1',
         port: '12345',
         open: true, // 是否自动打开浏览器
         compress: true, // 对网络请求文件进行压缩处理
     },
     output: {
         path: ph.resolve('./dist'), // 配置出口目录
         filename: "main.js" // 配置出口文件名称
     },
     plugins: [
         new HtmlWebpackPlugin({
             template: ph.resolve('./index.html'),
         }),
     ]
    }
    

    image.png
    3. 现在重新 实时打包 npm run serve发现 css文件的样式已经生效

九、loader-引入背景图片应用

  1. 创建目录 src/img 并把两个图片(one.jpg two.jpg)存入好
    2. 给模板文件 index.html创建两个div
    <div id="one"></div>
    <div id="two"></div>
    
  2. 在1.css样式文件中给两个div设置样式 和 背景图片
    #one{
     width: 150px;
     height: 150px;
     background: url("../image/1.png");
     background-size: 100% 100%;
    }
    #two{
     width: 150px;
     height: 150px;
     background: url("../image/3.png");
     background-size: 100% 100%;
    }
    
  3. 现在实时打包报错了

    十、loader-安装配置图片相关loader

    img图片相关的loader有两个:url-loader 和 file-loader
    安装配置loader步骤:
    1. 安装

    npm i  url-loader file-loader --save-dev
    yarn add url-loader file-loader -D
    
  4. webpack.config.js中做具体配置,如下 ```java // webpack中引入其他的模块要使用commonJS模块化require导入 因为webapck是nodeJS开发的 不能使用import导入 const ph = require(‘path’); const HtmlWebpackPlugin = require(‘html-webpack-plugin’); module.exports = { mode: ‘development’, // 配置loader module: {

     rules: [{
         // 处理CSS loader
         test: /\.css$/, // 正则表达式匹配Css文件
         // 遇到了css文件就交给如下的loader处理
         use:["style-loader", "css-loader"],
     },
     {
         // 图片处理loader配置
         test: /\.(png|jpg|gif)$/i, // 正则匹配图片文件
         // 遇到图片文件就交给如下loader处理
         use: [
         {
             loader: 'url-loader',
             options: {
                 // limit:设定大小阀值
                 // a. 被处理图片大小 大于该阀值,就通过物理文件重新生成该图片
                 // b. 被处理图片大小 小于等于该阀值,就把图片变为字符串(嵌入到应用文档中,好处是节省一个http资源)
                 limit: 8192,
                 // 做配置,使得生成的物理图片被存储在dist/images里边
                 outputPath: "images",
             }
         }
         ]
     },
    

    ] },

entry: ph.resolve('./src/app.js'), // 绝对路劲
devServer: {
    host: '127.0.0.1',
    port: '12345',
    open: true, // 是否自动打开浏览器
    compress: true, // 对网络请求文件进行压缩处理
},
output: {
    path: ph.resolve('./dist'), // 配置出口目录
    filename: "main.js" // 配置出口文件名称
},
plugins: [
    new HtmlWebpackPlugin({
        template: ph.resolve('./index.html'),
    }),
]

}

loader说明:<br />1. 只配置url-loader,file-loader不用配置,条件满足后url-loader会自动调用file-loader执行<br />2. limit:8192设置图片判断大小阀值的,一般建议是10k左右,原因是图片变为字符串大小会增加的(过大图片变为字符串我们就没有"利润"了)
```java
url-loader: 负责把大小小于等于阀值的图片变为字符串
file-loader: 负责把大小 大于阀值的图片重新以物理文件形成生成在dist目录

注意:
图片loader只能处理css文件的背景图片,而index.html模板中通过img标签做的图片不给处理(只把其当做标签的普通属性了)
3. 现在重新实时打包 npm run serve,发现页面上两个div已经有背景图片效果了

十一、loader-安装配置less相关loader

loader具体为:less-loader、less
步骤:
1. 安装依赖包, yarn add less-loader less -D

npm i less-loader less --save-dev

yarn add less-loader less -D
  1. webpack.config.js做如下配置(位置不能出错)
    {
     //less处理loader配置
     test: /\.less$/,
     use: ["style-loader", "css-loader", "less-loader"]
    },
    
    说明:
    less样式文件处理需要3个loader,具体为上述,它们有严格的顺序,它们有做工作交接
    它们执行的顺序是颠倒的(less>css>style)
    style-loader:负责生成style标签,把css样式体现出来,之后该标签嵌入到应用文档中去
    css-loader:使得css文件可以通过import引入,并合并到main.js中
    less-loader: 该loader负责把less文件内容转变为 css内容
    
  2. 现在在重新实时打包运行 npm run serve,发现less设置样式已经生效

如果less设置样式没有生效,且终端那没有报错,那么在vscode应用商店安装Easy LESS插件可以解决问题。

十二、loader-运行es6标准代码

步骤:
1. 在work.js中应用es6内容(let、箭头函数、对象解构赋值、…展开运算符等等)

// 对es6高级内容做应用
let age = 18
let getShuai = ()=>{
    return '铁蛋儿'
}
  1. 给项目做物理打包 npm run build
    3. 发现情况不好,在main.js中生成的内容还是es6高级的信息

    我们本意是要把es6变为es5的,但是失败了

十三、loader-babel-loader和preset和plugin关键字解读

能够把es6高级内容变为es5的loader名称为 babel-loader
实际处理是这样的
es6/es7/es8等等高级标准有很多(let、箭头函数、对象解构赋值、…展开运算符、反勾号字符串等等),每个标准都需要一个独立的plugin进行降级处理,如果使用许多高级标准内容,那么势必要为此安装许多plugin,这样工作比较繁琐,系统已经考虑到这点了,其通过preset把许多常用的plugin给做了集合,因此一般性的使用只需要安装preset即可搞定(如果项目应用到了一个生僻的高级标准内容,preset处理不来,就还需要再安装对应的plugin处理)

十四、loader-安装配置loader和preset做降低处理

babel-loader官网:https://babel.docschina.org/
步骤:
1. 安装依赖包

yarn add babel-loader @babel/core @babel/preset-env -D

npm i babel-loader @babel/core @babel/preset-env --save-dev
  1. 在webpack.config.js中做如下配置:
    {
     //处理es6
     test: /\.js$/,
     //node_modules不用降级
     exclude: /node_modules/,
     use: "babel-loader",
    },
    
    image.png
    3. 在项目根目录创建 babel.config.js文件,配置如下
    作用:使得babel-loader可以找到preset做代码降级处理
    module.exports = {
     presets: ['@babel/preset-env'],
    }
    
    image.png
    4. 现在给项目做物理打包 npm run build,发现高级内容已经降级处理了

十五、注意事项

npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等);
不要npm和cnpm换着使用容易出错。