1. 前端工程化的优点:
2. 前端工程化解决方案
早期解决方案:
目前解决方案
3. webpack的概念
webpack的本质是一个第三方模块包,用于识别代码,翻译,压缩,整合打包,达到提高打开网站的速度的命令。
文档
npm i -y
npm i webpack webpack-cli -D
deveDependencies:开发 --save-dev -D
dependencies: 开发和生产中 --save -S
module.exports = {
mode: "development"
}
"scripts": {
"dev": "webpack"
},
这里写的是"dev",那么运行时就时"npm run dev"。当然也可以改成其他名称。
npm run dev
命令,启动项目webpack进行项目的打包。项目根目录生成dist文件夹
,里面有main.js
打包模式不同,文件以及编译速度都有差异
development:开发模式,注重打包速度
production:上线模式,注重文件大小
webpack.config.js:
webpack.config.js
是webpack
的配置文件。webpack
在真正开始打包构建之前,会先读取这个配置文件,从而基于给定的配置,对项目进行打包。
入口:entry (指定要处理哪个文件)
./src/index.js
entry: './path/to/my/entry/file.js'
输出:output (指定生成的文件要存放到哪里)
默认值:./dist/main.js
自定义:
output: {
path: path.join(__dirname, "dist"),
filename: "bundle.js"
},
plugins:插件的数组,将来webpack在运行时,会加载并调用这些插件
loader 用于对模块的源代码进行转换。loader 可以使你在 import
或 “load(加载)” 模块时预处理文件。webpack默认只能打包处理.js后缀结尾的模块,这是webpack开箱可用的自带能力。其他非.js后缀结尾的模块,webpack默认处理不了,需要loader加载器才可以正常打包,否则会报错。loader加载器的作用:协助webpack打包处理特定的文件模块.
使用css-loader,允许你在项目中对css文件进行编译.
css-loader只负责将css文件进行加载,使用import加载,并返回Css代码
安装
npm install --save-dev css-loader
webpack.config.js
module.exports = {
module: {
rules: [
{ test: /\.css$/, use: 'css-loader' },
],
},
};
做完这些后,你会发现css文件没有起效果,这其实时css-loader只是将css代码进行编译,并没有将模块的导出作为样式添加到DOM中,所以就需要style-loader
将模块的导出作为样式添加到DOM中
安装
npm install --save-dev style-loader
然后把 loader 添加到你的 webpack
配置中。比如:
index.css
div {
position: fixed;
border-radius: 50%;
}
入口文件引入
import "./index.css";
小问题
这里发现,如果使用requier引入css文件时,貌似不会对整个文件做强检查(比如代码中出现的无用变量,冗余变量)如果出现就报错.但用import引入文件就会做对代码做强检查.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
],
},
};
注意:
webpack使用多个loader时是从右向左读的。
像 background 和 icon 这样的图像,要如何处理呢?在 webpack 5 中,可以使用内置的 Asset Modules。
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
+ {
+ test: /\.(png|svg|jpg|jpeg|gif)$/i,
+ type: 'asset/resource',
+ },
],
},
};
- 小于8kb文件,文件转
base64
打包在js中,大于8kb,文件自动命名输出到dist下- 图片翻译成了base64,放到js文件中:
- 好处:浏览器不用发请求了,直接可以读取,速度快。
- 坏处:图片太大,再转
base64
就会让图片的体积增大30%左右,得不偿失。
注意:
test: /\.(png|svg|jpg|jpeg|gif)$/i, use:['file-loader']
如果这样按照上面的配置没有加载图片,那是因为webpack4旧版本,需要两个都引入
file-loader
,url-loader
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
+ {
+ test: /\.(woff|woff2|eot|ttf|otf)$/i,
+ type: 'asset/resource',
+ },
],
},
};
npm i [email protected] -D
"scripts": {
"dev": "webpack server"
},
devServer: {
open: true,
host: "127.0.0.1",
port: 3000
}
这里配置了主机号,端口号,以及使用默认浏览器进行开启
- 实时打包,存放到内存中,不可见,自动开启服务器
作用:类似模板引擎,通过此插件自定义index.html页面内容
安装插件:
npm i html-webpack-plugin -D
导入插件:
const HtmlWebpackPlugin = require('html-webpack-plugin');
创建插件实例对象:
const htmlnewplugin = new HtmlWebpackPlugin({
template: './src/index.html',
filename:'./index.html'
}
使用插件:
plugins: [htmlnewplugin],
使用后,生成的html页面会自动引入对应的js文件,不需要我们再引入,而且在dist文件夹会再生成一个html文件,但我们不可见,因为是在内存中。
默认情况下,此插件将output.path
在每次成功重建后删除webpack目录中的所有文件,以及所有未使用的webpack资产。
安装
npm i --save-dev clean-webpack-plugin
+ //clean-webpack-plugin
+ const { CleanWebpackPlugin } = require("clean-webpack-plugin")
module.exports = {
mode: "development", //指明构建模式 development:开发模式
//production :上线模式
entry: "./src/index.js", //设置入口模块
output: {
path: path.join(__dirname, "dist"),
filename: "bundle.js"
},
devServer: {
open: true,
host: "127.0.0.1",
port: 3000
},
plugins: [
htmlplugin,
+ new CleanWebpackPlugin()
],
module: {
rules: [
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
{
test: /\.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource',
},
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
],
},
}
本插件会将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载。
npm install --save-dev mini-css-extract-plugin
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
plugins: [new MiniCssExtractPlugin()],
module: {
rules: [
{
test: /\.css$/i,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
};
这个插件使用 cssnano 优化和压缩 CSS。
$ npm install css-minimizer-webpack-plugin --save-dev
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
module: {
rules: [
{
test: /.s?css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
optimization: {
minimizer: [
// 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
// `...`,
new CssMinimizerPlugin(),
],
},
plugins: [new MiniCssExtractPlugin()],
};
这将仅在生产环境开启 CSS 优化。
如果还想在开发环境下启用 CSS 优化,请将 optimization.minimize
设置为 true
:
webpack.config.js
// [...]
module.exports = {
optimization: {
// [...]
minimize: true,
},
};
然后运行webpack
bable-loader 允许你使用 Babel 和 webpack 转译 JavaScript
文件。
babel:一个javascript编译器,把高版本js语法降级处理输出适配低版本的语法
babel-loader:可以让webpack转义打包的js代码
安装
npm install -D babel-loader @babel/core @babel/preset-env webpack
使用
在 webpack 配置对象中,需要将 babel-loader 添加到 module 列表中,就像下面这样:
module: {
rules: [
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
打包原因
配置打包发布:
"scripts": {
"dev": "webpack server",
"build":"webpack --mode production"
},
–mode指定的参数,会覆盖webpack.config.js中的 mode选项
控制台输入
npm run build
整理dist目录下的文件:
output: {
path: path.join(__dirname, "dist"),
+ filename: "js/bundle.js",
assetModuleFilename: 'images/[hash][ext][query]'
},
设置输出目录:js/bundle.js
output: {
path: path.join(__dirname, "dist"),
filename: "js/bundle.js",
+ assetModuleFilename: 'images/[hash][ext][query]'
},
MiniCssExtractPlugin