webpack官网 跟着b站上王红元老师学习,其中04和05章节没问题,下次复习的时候直接看这两个章节
目录
- 认识webpack
- webpack的安装
- webpack的起步
- webpack的配置
- loader(核心)的使用
- webpack中配置Vue
- plugin的使用
- 搭建本地服务器
一. 认识webpack
1.1 认识webpack
打包工具有:grunt(不常用)/gulp/webpack/rollup
前端模块化规范:AMD/CMD/CommonJS(能用,但浏览器不能识别)
在没有ES6的时候,以上3种都需要底层支撑,通过借助其他工具(如webpack),才能进行模块化开发;并且在通过模块化开发完成了项目后,还需要处理模块间的各种依赖,并且将其进行整合打包。
ES6(浏览器就可以支持)
作用:进行模块化和打包。
- 模块化:
- 打包:就是将webpack中的各种资源模块进行打包合并成一个或多个包。并且在打包的过程中,还可以对资源进行处理,比如压缩图片、将scss转成css、将ES6语法转成ES5语法、将TypeScript转成Javascript等操作。
1.2 webpack和gulp的对比
二. webpack安装
2.1 webpack与node、npm之间的关系
2.2 webpack安装
安装webpack,首先需要安装Node.js,Node.js自带了软件包管理工具npm
2.2.1 查看自己的node版本
:::info
//在终端cmd
node -v
:::
2.2.2 全局安装webpack
:::info
// 在终端cmd
npm install webpack -g //默认安装最新的 g(global,全局的意思)
// 指定版本号
npm install webpack@3.6.0 -g (这里老师先指定了版本号为3.6.0,因为vue cli2依赖该版本)
:::
2.2.3 局部安装webpack(后续才需要)
(1)了解局部安装
:::info
//在webstorm里的终端
cd 对应目录 //先cd到对应的目录下面,再执行命令!!! 老是忘记
npm install webpack —save-dev // 此处,webpack也可指定版本号
//—save-dev可以紧跟install后面;也可以放在最后
//—save-dev是开发时依赖,项目打包后不需要继续使用的
:::
:::info
Q:为什么全局安装后,还要再进行局部安装呢?
A:因为在真实的开发中,比如你初入一个公司,从github上clone项目,项目用的可能是webpack3.6.0,但全局的webpack可能是4.1.0,版本不一致有可能会造成打包出现问题。所以通常一个项目,都有自己局部的webpack。
在终端(cmd,某个软件的terminal等)直接执行webpack命令,使用的全局安装的webpack;
当在package.json中定义了script时,其中包含了webpack命令,那么使用的是局部webpack。
:::
三. webpack的起步
3.1 准备工作
说明:/src/main.js 也经常被命名为index.js
3.2 js文件的打包
cd .. //cd到指定的目录下 别忘记了!!!
webpack ./src/main.js ./dist/bundle.js
//含义:就是将src文件夹下的main.js打包成dist文件夹下的bundle.js
//webpack在打包main.js文件的时候,它会看有没有依赖其他文件,然后会自动处理模块间的依赖
四. webpack的配置
为了让打包的命令更为简洁,我们需要创建一个webpack.config.js文件,并在其中对入口和出口进行配置。
使得最后的命令由”webpack ./src/main.js ./dist/bundle.js”简写成”webpack”。(但是一般打包的时候,我们还是不常用这个命令,用npm run build代替,后续会将如何配置,使得这两个命令对应起来)
4.1 入口和出口的映射配置
我们考虑一下,如果每次使用webpack的命令都需要写上入口和出口作为参数,就非常麻烦,有没有一种方法将这两个参数写到配置中,在运行时直接读取呢?(就不用写webpack ./src/main.js ./dist/bundle.js这么长的命令了)
当然可以,就是创建一个webpack.config.js文件,在里面进行这两个参数(文件入口和出口)的配置。
webpack.config.js文件
const path = require('path'); //用于动态设置为绝对路径 path是Node.js中的模块
module.exports = {
//定义文件导入入口
entry:'./src/main.js',
//定义文件导出出口
//出口通常是一个对象,里面至少包含两个重要属性:path、filename
output:{
path:path.resolve(__dirname,'dist'), //要设置绝对路径,且是动态地获取路径(用到node语法)
filename:'bundle.js',
}
}
:::info
注意:因为在设置出口路径的时候用到了node中的path包,所以我们需要在项目中引用包
npm init //一旦涉及到node相关的时候,尽快执行这条命令,最后一开始弄项目的时候就建好
// 在init过程中,需要进行如下设置
package name(02 webpack的配置):meetwebpack //设置包的名字
//如果直接敲回车,默认包名是括号中的名字,但是里面可能中文符号是不能作为包名的
version :(1.0.0)
- description:
- entry point:(webpack.config.js) index.js //默认括号里的名字,但是此处的入口设置肯定不能是括号里的内容,所以目前我们先随便取一个名字
- test command: //先不写
- git repository: //先不写
- keywords: //先不写
- author: //先不写
- license:(ISC) //先不写 :::
:::info
通过npm init生成一个package.json文件
ps:任何一个项目,如果想依赖单独的node环境的话,都必须有一个package.json文件(告诉我们当前项目的信息,如各种工具的版本号)
:::
说明:目前package.json没有依赖任何东西。如果后期有的话,需要执行npm install 命令,以此帮助你在项目中生成一些东西;或者如果你手动更改里面的内容,webstorm软件会提醒你进行更新操作。
4.2 webpack和npm run build命令的映射配置
在package.json中进行配置。
// scripts是脚本的意思,比如你执行npm run test,它会执行"echo \......exit 1"的命令
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack", //进行映射配置
},
:::info 当你在webstorm的终端中执行npm run build(或webpack)的时候,它会按照一定的顺序寻找命令对应的位置
- 首先,会寻找本地的node_modules/.bin路径中对应的命令,有的话,就使用局部安装;
如果没有找到,就回去全局的环境变量中寻找,使用的就是全局安装。
:::4.3 局部安装的流程
目前,我们使用的webpack是全局的webpack,如果我们想使用局部来打包呢?
因为一个项目往往依赖特定的webpack版本,全局的版本可能跟这个项目的webpack版本不一致,导致打包出现问题;
- 所以,通常一个项目都有自己局部的webapck。
(1)安装流程
:::info
npm install webpack —save-dev
或
npm install webpack@3.6.0 —save-dev //指定具体的版本号
:::
知识点补充: 开发时依赖(—save-dev):只有在开发的时候会用到webpack工具,真正项目运行的时候不会用到(webpack在打包完之后就没有用了) 运行时依赖
安装完成后,在package.json文件中会多出以下内容。
"devDependencies": { //devDependencies就是开发时依赖的意思
"webpack": "^5.42.0",
"webpack-cli": "^4.7.2"
}
五. loader(核心)的使用
一般操作流程:先安装:npm isntall —save-dev css-loader(以css为例)
在webpack.config.js文件中配置rule(需要到官网中寻找对应的loader)
5.1 使用css文件时的处理
5.2 使用less文件时的处理
5.3 图片文件的处理
5.4 ES6语法处理
六. webpack中配置Vue
index.js文件 App.vue文件 需要在入口文件index.js文件导入App.vue文件:import App from “./App.vue” (上面图片中没有加)
Vue在构建最终版本的时候,它构建了两类版本。
1.运行时runtime-only:在你的代码中,不可以有任何的template
2.运行时runtime-compiler:代码中,可以有template(组件?)。因为有compiler代码可以用于编译template
spa(simple page web application)在单页面复应用中用得比较多,不过也可以用在多页面
只有一个index.html页面,其他页面通过“vue-router(前端路由)”跳转
但是,在用vue-loader处理vue文件之前,我们还需要借助一个插件来处理vue
七. plugin的使用
7.1 添加版权的Plugin(BannerPlugin)
webpack自带的插件
重新打包(到指定的目录下):npm run build
7.2 HtmlWebpackPlugin
非webpack自带插件,是第三方插件
以下两种操作都需要在webpack.config.js文件中进行设置。
(1)需要设置template中的值
如果没有设置template:’index.html’的时候会导致dist/index.html没有
(2)删除publicPath属性
需要删除之前在output中添加的publicPath属性,否则插入的