官网解释:从本质上来讲,webpack是一个现代的JavaScript应用的静态模块打包工具。
从模块化和打包两个角度来理解:
webpack其中一个核心就是让我们可能进行模块化开发,并且会帮助我们处理模块间的依赖关系,而且不仅仅是JavaScript文件,CSS、图片、json文件等等在webpack中都可以被当做模块来使用
合并成一个或多个包(Bundle),并且在打包的过程中,还可以对资源进行处理,比如压缩图片,将scss转成css,将ES6语法转成ES5语法,将TypeScript转成JavaScript等等操作。
这样表述的原因是我们最终可以将代码打包成最终的静态资源(部署到静态服务器);
webpack更加强调模块化开发管理,而文件压缩合并、预处理等功能,是他附带的功能
npm i [email protected] -g
--save-dev`是开发时依赖,项目打包后不需要继续使用的。
cd 对应目录
npm i [email protected] --save-dev
要同时安装webpack,webpack-cli(此工具用于在命令行中运行 webpack)
main.js:项目的入口文件。具体内容查看下面详情。
mathUtils.js:定义了一些数学工具函数,可以在其他地方引用,并且使用。具体内容查看下面的详情。
index.html:浏览器打开展示的首页html
现在的js文件中使用了模块化的方式进行开发,他们可以直接使用吗?不可以。
我们应该怎么做呢?使用webpack工具,对多个js文件进行打包。
如何打包?
1.webpack
直接执行webpack默认会将当前目录下的 src/index.js 作为入口文件,所以,如果当前项目中没有存在src/index.js文件,那么会报错,打包后的文件会保存在dist/main.js中
2.webpack --entry ./src/main.js --output-path ./dist指定入口文件和出口文件
将src/main.js文件打包,并把打包好的文件保存到dist/main.js中
打包后会在dist文件下,生成一个main.js文件
main.js文件,是webpack处理了项目直接文件依赖后生成的一个js文件,我们只需要将这个js文件在index.html中引入即可
注意:
在命令行中执行 webpack命令时,会去webpack.config.js文件中找对应的入口文件和出口文件进行打包,但是在命令行中执行webpack使用的是全局安装的webpack,但是一个项目往往依赖特定的webpack版本,全局的版本可能很这个项目的webpack版本不一致,导出打包出现问题
--save-dev 开发时依赖,开发时需要的包,生产环境不要的包,对应的包信息保存在package.json文件中的devDependencies
在package.json的scripts中定义自己的执行脚本。
"build":"webpack" ------当执行npm run build 的时候,执行webpack
package.json中的scripts的脚本在执行时,会按照一定的顺序寻找命令对应的位置。
首先,会寻找本地的node_modules/.bin路径中对应的命令。
如果没有找到,会去全局的环境变量中寻找。
在命令行中使用npx webpack 也是使用的局部webpack
项目开发过程中,我们需要添加很多的样式,而样式我们往往写到一个单独的文件中。
在src目录中,创建一个css文件,其中创建一个normal.css文件,将零散的css文件放在一个css文件夹中。
但是,这个时候normal.css中的样式会生效吗?
当然不会,因为我们压根就没有引用它。
webpack也不可能找到它,因为我们只有一个入口,webpack会从入口开始查找其他依赖的文件。
在入口文件中引用:
通过上述引用,运行npm run build,会报错,需要loader对css文件进行处理
主要是用webpack来处理我们写的js代码,并且webpack会自动处理js之间相关的依赖。
但是,在开发中我们不仅仅有基本的js代码处理,我们也需要加载css、图片,也包括一些高级的将ES6转成ES5代码,将TypeScript转成ES5代码,将scss、less转成css,将.jsx、.vue文件转成js文件等等。对于webpack本身的能力来说,对于这些转化是不支持的。那怎么办呢?给webpack扩展对应的loader就可以啦。
步骤一:通过npm安装需要使用的loader
npm install css-loader --save-dev
npm install style-loader --save-dev
css-loader 负责加载css文件,对css文件进行解析
style-loader 负责把css样式嵌入到文档中
步骤二:在webpack.config.js中的module关键字下进行配置
rules是一个数组,每一项都是一个配置对象
test:匹配以.css结尾的文件,对资源进行匹配,通常使用正则
ues:使用style-loader,css-loader进行处理
注意:style-loader需要放在css-loader的前面,这是因为webpack在读取使用的loader的过程中,是按照从右向左的顺序读取的。
module.rules中各配置项说明:
loader:'css-loader', //必选属性,对应的值是字符串
options:{} //可选属性,值可以是对象或者字符串,值会被传入到loader中
}],
在main.js中引入.less文件
安装 less-loader
注意:这里还安装了less,因为webpack会使用less将less文件转化成css文件
修改对应的配置文件,添加一个rules选项,用于处理.less文件
在项目中加入图片,在css样式中引用图片
处理图片文件,可以分别使用url-loader,file-loader,两者工作方式是相似的,但是url-loader可以将较小的文件,转成base64的URI
file-loader的作用就是帮助我们处理import/require()方式引入的一个文件资源,并且会将它放到我们输出的文件夹中
安装file-loader:
添加配置项:
我们发现webpack自动帮助我们生成一个非常长的名字,这是一个32位hash值,目的是防止名字重复,但是,真实开发中,我们可能对打包的图片名字有一定的要求
比如,将所有的图片放在一个文件夹中,跟上图片原来的名称,同时也要防止重复
所以,我们可以在options中添加上如下选项:
但是,我们发现图片并没有显示出来,这是因为图片使用的路径不正确,默认情况下,webpack会将生成的路径直接返回给使用者
该路径是用在index.html,但是实际生成的图片文件位于dist/img/xx.jpg,所以这里我们需要在路径下再添加一个dist/
修改webpack.config.js文件:
limit 属性的作用:
babel:Babel是一个工具链,主要用于旧浏览器或者环境中将ECMAScript 2015+代码转换为向后兼容版本的 JavaScript;
npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
配置webpack.config.js文件:
Exclude:排除node_modules中的文件,只转换src中的文件
重新打包,查看bundle.js文件,发现其中的内容变成了ES5的语法
babel的底层原理:
webpack另一个核心是插件,官方对插件的描述:
作用:每次打包时,自动删除上一次打包的dist文件夹
下载:npm i clean-webpack-plugin -D
配置:
作用:打包生成的dist文件夹中并且有index.html文件,但是在进行项目部署的时候也是需要入口文件的,HTMLWebpackPlugin插件可以帮助我们对index.html文件进行打包,并且在打包的index.html中引用main.js
下载:npm i html-webpack-plugin -D
配置:
如果要自定义index.html文件的内容?
作用:将资源复制到打包之后的文件夹中
下载:npm i copy-webpack-plugin
配置:
const CopyWebpackPlugin = require('copy-webpack-plugin');
export default {
plugins:[
new CopyWebpackPlugin({
patterns: [
{
from: "public",
to: "./",
globOptions: {
ignore: [
"**/index.html"
]
}
}
]
})
]
}
复制的规则在patterns中设置:
作用:在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安装):
Mode配置选项,可以告知webpack使用响应模式的内置优化: