webpack基本使用

4 篇文章 0 订阅

webpack是模块化打包工具,能帮助我们打包css,js,html,png等资源,打包到一个js文件下,并可以帮助我们把less文件编译成css,ES6转译成ES5等。

一、基本打包命令

条件: node环境,并全局安装webpack npm install webpack webpack-cli -g

  • 开发环境指令:webpack ./src/index.js -o ./build/built.js --mode=development
    webpack以./src/index.js为入口文件开始打包,打包后输出到./build/built.js

  • 生产环境指令:webpack ./src/index.js -o ./build/built.js --mode=production
    webpack以./src/index.js为入口文件开始打包,打包后输出到./build/built.js

打包后文件运行:

  • 使用node ./build/built.js可直接运行
  • 手动创建html页面,并引入<script src="./built.js"></script>运行

webpack只能处理js、json文件,不能处理css、img等资源
测试目录及入口文件如下:
文件路径

二、webpack配置文件

我们可以将一些编译选项放在配置文件中,以便于统一管理:
创建 webpack.config.js 文件,代码如下所示:
webpack有5项核心概念的配置,entry,output,module,plugins,mode

/*
    webpack的配置文件
    当运行webpack时,会加载里面的配置
    所有构建工具都是基于nodejs的,用的模块化是commonjs
*/
// resolve用来拼接绝对路径的方法
const { resolve } = require('path');
module.exports={
    // 入口文件
    entry: "./src/index.js",
    // 出口
    output:{
        filename: "build.js",
        // __dirname 是nodejs的变量,代表当前文件的绝对路径目录
        path: resolve(__dirname,"build")
    },
    // loader配置
    module:{
        rules:[]]
    },
    // plugins配置
    plugins: [],
    // 开发模式配置
    mode: "development",
    // mode: "production",
}

在webpack文件目录下直接运行webpack,和一运行的效果是一样的

三、loader(打包css/less文件)

Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。
所以如果我们需要在应用中添加 css 文件,就需要使用到 css-loader 和 style-loader,他们做两件不同的事情,css-loader 会遍历 CSS 文件,然后找到 url() 表达式然后处理他们,style-loader 会把原来的 CSS 代码插入页面中的一个 style 标签中。

这个就用到node包,需要package.json文件记录

  1. 初始化生成pakage.json文件 npm init
  2. 下载依赖
    • npm install webpack webpack-cli --save-dev
    • npm install style-loader css-loader --save-dev

修改webpack配置文件的loader配置

// loader配置
module:{
 rules:[
   {
    // 匹配哪些文件
    test: /\.css$/,
    //使用哪些loader
    use:[
     // 创建style标签,将js中的样式字符串插入到style标签中,并添加到head标签中生效
     "style-loader",
     // 将css文件转换成commonjs模块加载的js文件中,里面内容是样式字符串
     "css-loader"
    ]
  }
 ]
},

在webpack配置文件目录下直接运行webpack
在这里插入图片描述
注意:node包在当前目录及上一层或者往上上层放都行,因为node找包是这个原则。

再打开index.html(引入build.js),就可以看到css生效了

打包图片资源

需要url-loader、file-loader、html-loader

module:{
 rules:[
 ......
  {
   test: /\.png|jpg|gif$/,
   // 下载url-loader file-loader;
   //处理的是css中url引入的图片
   loader: "url-loader",
   options:{
     // 图片大小小于100kb时会被base64处理,(通常对8-12kb以下的图片进行base64处理)
     //这样做的好处是减少请求次数,减轻服务器压力
     //缺点是,图片体积会增大(文件请求速度变慢)
     limit: 100 * 1024,
     // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
     // 解决:关闭url-loader的es6模块化,使用commonjs解析
     esModule: false,
     //给图片进行重命名
     //[hash:10]取图片的hash前10位
      //[ext]图片的原拓展名
      name: '[hash:10].[ext]'
   }
 },
 {
   // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
   test: /\.html$/,
   loader: "html-loader",
   options: {
     esModule: false,
   },
 }
]}

在 webpack 5 之前,我们可以用 file-loader 或 url-loader 处理这些图片文件,但在 webpack 5 中,我们已经没有必要再去安装对应的 loader 了,因为我们可以使用 资源模块Asset Module 来处理这些文件。

{
    test: /\.(png|svg|jpg|jpeg|gif)$/i,
    type: 'asset/resource',
    generator:{
        filename: 'img/[name].[hash:10].[ext]'
    }
},
打包字体图标

可以在iconfont下载字体图标,然后放在src里,在index.js中引入iconfont.css文件,在index.html中加字体图标
目录结构如下
在这里插入图片描述
loader配置如下:

{
    // 处理其他资源
    exclude: /\.(html|js|css|less|png|jpg|gif)$/,
    loader: "file-loader",
    options: {
        name: 'icon/[hash:10].[ext]'
    },
},

webpack5写法

{
    // webpack5处理icon
    test: /\.(woff|woff2|eot|ttf|otf)$/i,
    type: 'asset/resource',
    generator:{
        filename: 'font/[name].[hash:10].[ext]'
    }
},

四、plugins(打包html资源)

下载html-webpack-plugin插件,配置plugins
这样就能自动生成文件了

const HtmlWebpackPlugin = require("html-webpack-plugin");
// plugins配置
plugins: [
  // html-webpack-plugin的配置
  //功能:默认会创建一个空的html文件(没有结构),并自动引入打包的所有资源
  //new HtmlWebpackPlugin()
  new HtmlWebpackPlugin({
    // 会复制"./src/index.html"文件,并自动引入打包的所有资源
    template: "./src/index.html"
  })
],

会发现loader配置和plugins插件配置的区别

  • loader: 1.下载 2.使用(配置loader)
  • plugins: 1.下载 2.引入 3.使用(配置plugins)

五、自动打包

webpack-dev-server,:用来自动化(自动编译,自动打开浏览器,自动刷新),启动命令:npx webpack-dev-server

下载包webpack-dev-server,
添加配置:

devServer: {
  // 项目构建后的路径
  static: {
      directory: path.join(__dirname, 'build'),
  },
  watchFiles: ['./src/index.html'],
  // 启动gzip压缩
  compress: true,
  // 端口号
  port: 9000,
  hot: true,
  // 自动打开浏览器
  open: true,
},

六、分离css,兼容css,压缩css

分离css-MiniCssExtractPlugin

MiniCssExtractPlugin官方文档
步骤

  1. 安装mini-css-extract-plugin控件
npm install --save-dev mini-css-extract-plugin
  1. 引入
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

//在loader中修改配置
test: /\.css$/,
// style-loader会创建style标签,将样式放上去;css-loader是将css文件整合到js文件中
// use: [ "style-loader","css-loader"]
//MiniCssExtractPlugin.loader提取js中的css成单独文件(html会自动引入所有生产的所有资源)
use: [ MiniCssExtractPlugin.loader,"css-loader"]

//在pligins中添加配置
plugins: [
   ...
   new MiniCssExtractPlugin({
      filename: "css/build.css"
  }),
],
兼容css(postcss-loader)
npm install --save-dev postcss-loader postcss postcss-preset-env

//修改loader
{
    test: /\.css$/,
    // style-loader会创建style标签,将样式放上去;css-loader是将css文件整合到js文件中
    // use: [ "style-loader","css-loader"]
    //MiniCssExtractPlugin.loader提取js中的css成单独文件(html会自动引入所有生产的所有资源)
    use: [ MiniCssExtractPlugin.loader,"css-loader",{
        loader: 'postcss-loader',
        options: {
            postcssOptions: {
                plugins: [
                    require('postcss-preset-env')
                ],
            },
        },
    }]
},

压缩css(CssMinimizerWebpackPlugin)

官方文档CssMinimizerWebpackPlugin

步骤

  1. 安装 css-minimizer-webpack-plugin
npm install css-minimizer-webpack-plugin --save-dev
  1. 配置
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

//webpack.config.js配置文件中添加
optimization: {
    minimizer: [
        // 压缩css
        new CssMinimizerPlugin(),
    ],
    //在开发环境下启用 CSS 优化
    minimize: true,
},
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值