Webpack概念
webpack是一个静态模块打包器。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle
使用前提 下载webpack webpack-cli 包 (webpack v4以上要装webpack-cli )
Webpack结构
?了解webpack先从理解webpack四个核心概念,认识webpack结构开始
- 入口 (entry)
- 输出 (output)
- 加载器 (loader)
- 插件 (plugins)
以及模式 (development 或 production)
以下是webpack.config.js配置文件
const path = require('path');
const Html = require('html-webpack-plugin');
module.exports = {
entry: path.resolve(__dirname,"src/index.js"),
output:{
path: path.resolve(__dirname,"dist"),
filename: "bundle.js"
},
module:{
rules:[
{ test: /\.txt$/, use: 'raw-loader' }
]
},
plugins: [
new Html({template: './src/index.html'})
],
mode: "development"
}
结构配置
入口起点
默认为src目录下的index.js文件 如果不存在index.js文件,打包时采用
webpack --entry "./入口路径/文件名" --output "./输出路径/文件名"
或者在webpack.config.js 中指明入口
module.exports = {
entry: "./src/index.js"
}
输出
默认为dist目录下的bundle.js文件 如果不存在文件夹或文件会自动创建 也可以自定义输出
webpack --entry "./入口路径/文件名" --output "./输出路径/文件名"
或者在webpack.config.js 中指明输出
const path = require('path');
module.exports = {
entry: "./src/index.js",
output:{
path: path.resolve(__dirname,"dist"),
filename: "bundle.js"
}
}
loader
loader用于对模块的源代码进行转换。
loader 可以使你在import 或"加载"模块时预处理文件。因此,loader 类似于其他构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。
为什么要使用loader? 因为在开发中,不仅仅有基本的js代码要处理,要需要加载css 图片 字体图标等; ?需要将ES6代码代码降级ES5代码,TypeScript转ES5代码; ?将scss/less转css,将.jsx/.vue文件转成js文件. webpack本身并不具备这些能力,webpack会将这些文件交给对应的loader处理
loader 可以将文件从不同的语言(如 TypeScript)转换为 JavaScript; loader 可以将内联图像转换为 data URL; loader 甚至允许你直接在 JavaScript 模块中 import CSS文件!
打包css文件
要用到css-loader ?webpack处理css文件,css代码转成js代码 ??????style-loader ?将css插入DOM中
- 先安装上述两个包
npm install css-loader style-loader --save-d
- 在入口文件里引入css文件
@import "./css/index.css"
- 配置webpack.config.js
module.exports = {
module: {
rules = [
{
test:/\.css$/i,
use:["style-loader","css-loader"]
}
]
}
}
loader支持链式传递,比如css-loader处理后交给style-loader, 在最后一个 loader,返回 webpack 所预期的 JavaScript。
打包less文件
要用到less-loader ????负责加载less文件 ???less ??????????负责将less转css ??????css-loader ??????style-loader
- 先安装上述包
npm install css-loader style-loader less less-loader --save-d
- 在入口文件里引入css文件
@import "./css/index.less"
- 配置webpack.config.js
module.exports = {
module: {
rules = [
{
test:/\.less$/i,
use:["style-loader","css-loader","less-loader"]
}
]
}
}
资源模块
webpack5之前不支持 ?不支持前,使用以下三个loader
- raw-loader?将文件导入为字符串
- url-loader?将文件作为data URL内联到bundle
- file-loader?将文件发送到输出目录
使用loader图片
module.exports.module = {
rules = [
{
test:/\.(png|jpg|gif|jpeg)$/i,
use:[
{
loader:'url-loader',
options:{
limit:8*1024
}
}
]
}
]
}
webpack5之后 依靠资源模块 资源模块(asset module)是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外 loader。
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:
asset/resource asset/inline asset/source asset
使用资源模块处理图片:
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif|jpeg)$/i,
type: 'asset'
}
]
},
}
使用资源模块处理字体图标:
module.exports = {
module: {
rules: [
{
test: /\.(eot|svg|ttf|woff|woff2)$/i,
type: 'asset/resource',
generator: {
filename: "路径/[name].[hash:6][ext]"
}
}
]
},
}
使用Babel
将高版本js语法降级成兼容的低版本语法
- 使用前先下包
npm install babel-loader @babel/core @babel/preset-env --save-d
- 配置webpack.config.js
module: {
rules: [
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
插件
HtmlWebpackPlugin
HtmlWebpackPlugin 简化了 HTML 文件的创建,以便为你的 webpack 包提供服务。 这对于那些文件名中包含哈希值,并且哈希值会随着每次编译而改变的 webpack 包特别有用。 该插件将为你生成一个 HTML5 文件, 在 body 中使用 script 标签引入你所有 webpack 生成的 bundle。 只需添加该插件到你的 webpack 配置中,如下所示:
要使用,先下包 npm install html-webpack-plugin --save-d
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
module.exports = {
entry: 'index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
plugins: [new HtmlWebpackPlugin({
template:'./src/index.html'
})],
};
使用前 文件结构 使用后 文件结构 且dist/index.html中引入了bundle.js文件
|