事实上随着前端的快速发展,目前前端的开发已经变的越来越复杂了:
但是对于很多的前端开发者来说,并不需要思考这些问题,日常的开发中根本就没有面临这些问题:
Webpack到底是什么呢?
我们先来看一下官方的解释:
webpack is a static module bundler for modern JavaScript applications.
webpack是一个静态的模块化打包工具,为现代的JavaScript应用程序;
我们来对上面的解释进行拆解:
下图来自webpack官网
JavaScript的打包:
Css的处理:
资源文件img、font:
HTML资源的处理:
处理vue项目的SFC文件.vue文件;
webpack的官方文档是https://webpack.js.org/
Webpack的运行是依赖Node环境的,所以我们电脑上必须有Node环境
webpack的安装目前分为两个:webpack、webpack-cli
那么它们是什么关系呢?
npm install webpack webpack-cli –g # 全局安装
npm install webpack webpack-cli –D # 局部安装
我们可以通过webpack进行打包,之后运行打包之后的代码:在目录下直接执行 webpack 命令
生成一个dist文件夹,里面存放一个main.js的文件,就是我们打包之后的文件:
我们发现是可以正常进行打包的,但是有一个问题,webpack是如何确定我们的入口的呢?
当然,我们也可以通过配置来指定入口和出口—>npx webpack --entry ./src/main.js --output-path ./build
前面我们直接执行webpack命令使用的是全局的webpack,如果希望使用局部的可以按照下面的步骤来操作。
npm init
npm install webpack webpack-cli -D
npx webpack
npm run build
在通常情况下,webpack需要打包的项目是非常复杂的,并且我们需要一系列的配置来满足要求,默认配置必然是不可以的。
我们可以在根目录下创建一个webpack.config.js文件,来作为webpack的配置文件:
const path = require('path');
//导出配置信息
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "./build"),
filename: "bundle.js"
}
}
继续执行webpack命令,依然可以正常打包
npm run build
但是如果我们的配置文件并不是webpack.config.js的名字,而是其他的名字呢?
webpack --config wk.config.js
但是每次这样执行命令来对源码进行编译,会非常繁琐,所以我们可以在package.json中增加一个新的脚本:
"scripts": {
"build": "webpack --config wk.config.js"
},
"devDependencies": {
"webpack": "^5.37.1",
"webpack-cli": "^4.7.0"
}
之后我们执行npm run build,来打包即可
webpack到底是如何对我们的项目进行打包的呢?
假如我们创建一个element.js,通过JavaScript创建了一个元素,并且希望给它设置一些样式;
//title.less
.title {
color: #12345678;
font-weight: 700;
font-size: 30px;
user-select: none;
}
//style.css
@bgColor: blue;
@textDecoration: underline;
.title {
background-color: @bgColor;
text-decoration: @textDecoration;
}
//element.js
import "../css/style.css";
import "../css/title.less";
const divEl = document.createElement("div");
divEl.className = "title";
divEl.innerHTML = "你好啊,浮游";
document.body.appendChild(divEl);
之后我们执行npm run build,发现报错了
You may need an appropriate loader to handle this file type, currently no loaders…
上面的错误信息告诉我们需要一个loader来加载这个css文件,但是loader是什么呢?
那么我们需要一个什么样的loader呢?
如何使用这个loader来加载css文件呢?有三种方式:
内联方式:内联方式使用较少,因为不方便管理;
在引入的样式前加上使用的loader,并且使用!分割;
import "css-loader!../css/style.css"
配置方式表示的意思是在我们的webpack.config.js文件中写明配置信息:
Loader的配置
const path = require('path');
module.exports = {
entry: "./src/main.js",
output: {
path: path.resolve(__dirname, "./build"),
filename: "bundle.js"
},
module: {
rules: [
{
test: /\.css$/,
// loader: "css-loader"//写法一
// use: ["css-loader"]//写法二
//写法三
use: [
{loader: "css-loader"}
]
}
]
}
}
我们已经可以通过css-loader来加载css文件了
这是为什么呢?
那么我们应该如何使用style-loader:
use: [
//注意:style-loader在css-loader的前面
{ loader: "style-loader" },
{ loader: "css-loader" },
]
在我们开发中,我们可能会使用less、sass、stylus的预处理器来编写css样式,效率会更高。
那么,如何可以让我们的环境支持这些预处理器呢?
比如我们编写如下的less样式:
@bgColor: blue;
@textDecoration: underline;
.title {
background-color: @bgColor;
text-decoration: @textDecoration;
}
我们可以使用less工具来完成它的编译转换:
执行如下命令:npm install less -D npx lessc ./src/css/title.less title.css
但是在项目中我们会编写大量的css,它们如何可以自动转换呢?
这个时候我们就可以使用less-loader,来自动使用less工具转换less到css;
配置webpack.config.js
use: [
{ loader: "style-loader" },
{ loader: "css-loader" },
{ loader: "less-loader" },
]
执行npm run build ,less就可以自动转换成css,并且页面也会生效了。
什么是PostCSS呢?
如何使用PostCSS呢?主要就是两个步骤:
命令行使用postcss
当然,我们能不能也直接在终端使用PostCSS呢?
我们编写一个需要添加前缀的css:
因为我们需要添加前缀,所以要安装autoprefixer: npm install autoprefixer -D
直接使用使用postcss工具,并且制定使用autoprefixer:npx postcss --use autoprefixer -o end.cs
真实开发中我们必然不会直接使用命令行工具来对css进行处理,而是可以借助于构建工具:
在webpack中使用postcss就是使用postcss-loader来处理的;
我们来安装postcss-loader: npm install postcss-loader -D
我们修改加载css的loader:(配置文件已经过多,给出一部分了)
注意:因为postcss需要有对应的插件才会起效果,所以我们需要配置它的plugin;
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
require("autoprefixer")
]
}
}
}
单独的postcss配置文件
当然,我们也可以将这些配置信息放到一个单独的文件中进行管理: 在根目录下创建postcss.config.js
module.exports = {
plugins: [
require("autoprefixer")
]
}
postcss-preset-env
事实上,在配置postcss-loader时,我们配置插件并不需要使用autoprefixer。
我们可以使用另外一个插件:postcss-preset-env
postcss-preset-env也是一个postcss的插件;
它可以帮助我们将一些现代的CSS特性,转成大多数浏览器认识的CSS,并且会根据目标浏览器或者运行时环境 添加所需的polyfill;
也包括会自动帮助我们添加autoprefixer(所以相当于已经内置了autoprefixer);
首先,我们需要安装postcss-preset-env: npm install postcss-preset-env -D
之后,我们直接修改掉之前的autoprefixer即可:
module.exports = {
plugins: [
require("postcss-preset-env")
]
}