webpack 插件实战笔记(一)

2023-11-13

 

cnpm init

111Air:webpackSerial1 i$ cnpm init

This utility will walk you through creating a package.json file.

It only covers the most common items, and tries to guess sensible defaults.

 

See `npm help json` for definitive documentation on these fields

and exactly what they do.

 

Use `npm install <pkg>` afterwards to install a package and

save it as a dependency in the package.json file.

 

Press ^C at any time to quit.

package name: (webpackserial1)

version: (1.0.0)

description:

entry point: (index.js)

test command:

git repository:

keywords:

author:

license: (ISC)

About to write to /Users/wangxianggui/vueProject/webpackSerial1/package.json:

 

{

  "name": "webpackserial1",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "author": "",

  "license": "ISC"

}

 

 

Is this OK? (yes) yes

 

结果

生成package.json

 

 

 

工程准备

新建文件

新建webpack.config.js 、 src/index.js  、dist/index.html

新建结果如下所示

+ ├─package.json
+ ├─dist          // 存放最终打包的文件
+ │  └─index.html
+ ├─src           // 存放入口文件等开发文件
+ │  └─index.js
+ ├─webpack.config.js  // webpack的配置文件

 

运行cnpm install webpack webpack-cli --save-dev

安装 lodash

 

配置webpack.config.js

const path = require('path')



module.exports = {

    entry: './src/index.js',//指定入口文件

    mode: 'development',//指定开发模式

    output: {

        filename: "main.js",//指定输出文件名字

        path: path.resolve(__dirname,'dist')//指定输出文件路径,也就是刚刚建立的dist目录

    }



}

 

编辑src/index.js入口文件

import _ from 'lodash';



function createElement(){

    let div = document.createElement('div');

    div.innerHTML = _.join(['my', ' project', ' is', ' wxg'], '');

    return div;

}

document.body.appendChild(createElement());
 

打包

npx webpack

结果

在dist 生成了main.js文件

 

验证开发成果

 

 dist/index.html 中引入打包后的 main.js,打开浏览器测试:

<script src="./main.js"></script>
<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>





</head>

<body>

<script src="./main.js"></script>



</body>

</html>

 

在webstorm 中使用预览,可以看到结果如下所示

webpack 功能测试

webpack 处理 CSS 模块

 

 src 中,新建 style 文件,并新建 index.css 文件:

 

  ├─package.json

  ├─dist          // 存放最打包的文件

    └─index.html

  ├─src           // 存放入口文件等开文件

    ├─index.js

+   └─style

+      └─index.css

  ├─webpack.config.js  // webpack的配置文件

 

 

 

在入口文件index.js 中新建元素方法,添加 class  box这样新建的元素就 box  class 属性:

.box{

    color: #00ff22;

}
css-loader : 用于处理 css 文件,使得能在 js 文件中引入使用;

    使用 import './style/index.css'; 引入我式文件,是没法解析使用

 

style-loader  用于将 css 文件注入到 index.html 中的 <style> 标签上

在webpack.config.js 中添加 css 解析的 loader 配置:

 

module: {

  rules: [

    {

      test: /\.css$/,

      use: ["style-loader", "css-loader"]

    }

  ]

}

 

参数介绍:

test需要匹配的模块后缀名 use:对应处理的 loader 插件名称(处理顺序是从右往左)。

添加快捷打包命令

 package.json  scripts 中添加一个命令 build,以后打包只要 cnpm run build 即可:

 

"scripts": {

  "build": "npx webpack -c webpack.config.js"

},

 

调试样式

webpack 开启 SourceMap 和添加 CSS3 前缀

 css-loader  sass-loader 都可以通过设 options 选项启用 sourceMap。如下所示:


 

rules: [

  {

    test: /\.(sc|c|sa)ss$/,

    use: [

      "style-loader",

      {

        loader:"css-loader",

        options:{ sourceMap: true }

      },

      {

        loader:"sass-loader",

        options:{ sourceMap: true }

      },

    ]

  }

]

 

 

 

webpack 将 CSS 抽取成单独文件

webpack4 开始使用 mini-css-extract-plugin 插件

 

安装插件:

cnpm install mini-css-extract-plugin --save-dev

cnpm install postcss-loader autoprefixer --save-dev

 

 style-loader,替 MiniCssExtractPlugin.loader ,然后添加 plugins 配置

 

const path = require('path')

const MiniCssExtractPlugin = require('mini-css-extract-plugin');





module.exports = {

    entry: './src/index.js',

    mode: 'development',

    output: {

        filename: "main.js",

        path: path.resolve(__dirname,'dist')

    },

    module: {

        rules: [

            {

                test: /\.css$/,

                use: [MiniCssExtractPlugin.loader,

                    {

                        loader:"css-loader",

                        options:{ sourceMap: true }

                    },

                    {

                        loader:"postcss-loader",

                        options: {

                            ident: "postcss",

                            sourceMap: true,

                            plugins: loader => [require('autoprefixer')()]

                        }

                    },

                    {

                        loader:"sass-loader",

                        options:{ sourceMap: true }

                    },]

            }

        ]

    },

    plugins: [

        new MiniCssExtractPlugin({

            filename: '[name].css', // 最终输出的文件名

            chunkFilename: '[id].css'

        })

    ]



}

在运行打包命令后,在dist目录里发现main.css文件。

 dist/index.html 中,需要手动引入 main.css 

// index.html
<link rel="stylesheet" href="main.css">

 

 

 

webpack 压缩 CSS 和 JS

使用 optimize-css-assets-webpack-plugin 压缩 CSS 的插件。

安装插件:

cnpm install optimize-css-assets-webpack-plugin --save-dev

 

// webpack.config.js

 

const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');

module.exports = {

  plugins: [

  

    new OptimizeCssAssetsPlugin({})

  ],

}

 

压缩 JS

使用 uglifyjs-webpack-plugin 压缩 JS 的插件。

安装插件:

cnpm install uglifyjs-webpack-plugin --save-dev

// webpack.config.js

 

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {

  plugins: [

    new UglifyJsPlugin({

      cache: true, parallel: true, sourceMap: true

    })

  ],

}

 

 

其中 UglifyJsPlugin 的参数:

cache:当 JS 没有发生变化则不压缩;
parallel:是否启用并行压缩;
sourceMap:是否启用 sourceMap

然后重新打包,查看 main.js,已经被压缩了:

 

 

webpack 为文件名添加 hash 值

 

打包出来的 cssjs 文件是静态文件,就存在缓存问题,因此我们可以给文件名添加 hash 值,防止缓存。

添加 hash 值

直接在 webpack.config.js 中,为需要添加 hash 值的文件名添加 [hash] 就可以:

 


module.exports = {

  // ... 省略其他

  output: {

    filename: 'main.[hash].js',

    path: path.resolve(__dirname, 'dist')

  },

  plugins: [

    new MiniCssExtractPlugin({

      filename: '[name].[hash].css',

      chunkFilename: '[id].[hash].css'

    }),

  ],

}

 

由于我们前面给打包的文件名添加了 hash 值,会导致 index.html 引用文件错误,所以我们需要让它能动态引入打包后的文件。

这里我们使用 HtmlWebpackPlugin 插件,它可以把打包后的 CSS 或者 JS 文件直接引用注入到 HTML 模版中,就不用每次手动修改。

安装插件:

cnpm install html-webpack-plugin --save-dev

 

webpack 清理目录插件

打包都会生成新的文件,并且在添加 hash 值以后,文件名不会出现重复的情况,导致旧文件的冗余。

为了解决这个问题,我们需要在每次打包之前,将 /dist 目录清空,再进行打包。

这里我们使用 clean-webpack-plugin 插件来实现。

安装插件:

npm install clean-webpack-plugin --save-dev

引入插件:

// webpack.config.js
 
const {CleanWebpackPlugin} = require('clean-webpack-plugin');

使用插件:

// webpack.config.js
 
plugins: [
  new CleanWebpackPlugin()
],

 

 

附录

 

安装 lodash

cnpm install lodash --save-dev

--save 可以简写为-S--save-dev可以简写为-D.

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack 插件实战笔记(一) 的相关文章

  • centos7安装mysql5.7

    一 下载mysql5 7 1 下载地址 点击跳转 2 然后上传到服务器上面 解压命令 tar xvf mysql 5 7 36 1 el7 x86 64 rpm bundle tar 3 解压后得到以下的rpm包 4 依次安装所需要的rpm

随机推荐

  • 因为错误消息指示这是由于上一个问题导致的错误,没有写入 apport 报告。

    依赖关系问题 仍未被配置dpkg 依赖关系问题使得 smbclient 的配置工作不能继续 smbclient 依赖于 samba common 2 3 5 8 dfsg 1ubuntu2 3 然而 软件包 samba common 尚未配
  • ubuntu 安装 多版本 cuda 11.4 11.8

    显卡 rtx3060 笔记本已经安装了 cuda 11 4 和 对应的cudnn 现在想要安装 cuda 11 8 和 cudnn 8 8 原理 新的 driver 可以 兼容 旧的 cuda sdk 旧的 driver 不能 兼容 新的c
  • matlab神经网络工具箱的使用

    单变量 单变量取数据 data load ex1data1 txt X data 1 y data 2 多变量取数据 data load ex1data2 txt X data 1 2 y data 3 运行train后弹出 对应的图 比如
  • gradle 添加构建依赖项

    gradle 添加构建依赖项 参考 添加构建依赖项 利用 Android Studio 中的 Gradle 构建系统 您可以轻松地将外部二进制文件或其他库模块作为依赖项添加到您的 build 中 这些依赖项可位于您的计算机上或远程代码库中
  • prometheus监控示例

    prometheus架构图 prometheus 各组件介绍 Prometheus Server 使用pull方式采集监控数据 在该组件上配置监控数据的采集和告警规则 Client Library 客户端库 为需要监控的服务生成相应的 me
  • 安装Redhat

    1 新建虚拟机 选典型 2 下一步 选择稍后安装操作系统 3 下一步 选择Linux 版本选择Red Hat Enterprise 8 版本是什么就选择什么 4 下一步 设置虚拟机名称以及位置 5 下一步 设置虚拟机磁盘容量 6 下一步 点
  • RocketMQ第五篇 RocketMQ API基本使用

    目录 生产者Product 消费者Consumer 前面已经学习了Rocket的基本知识 以及搭建MQ单机版和集群环境 下面开始进行实际开发 根据前面下载的RocketMQ源码 开展讲解RocketMQ 的基本使用 生产者Product 在
  • Python实战

    转载自Python研究者 作者阿辰 今天教大家如何爬取新浪网新闻数据 通过词云可视化展示新闻关键词 快速了解最新的新闻热点 这里爬取了2500条新闻数据进行演示 PS 这里采集的主要是国内最新新闻数据 写这篇文章的时候是4月26号 所以获取
  • 解决Spring的UnsatisfiedDependencyException异常的方法

    解决Spring的UnsatisfiedDependencyException异常的方法 1 引言 在使用Spring框架进行开发时 经常会遇到UnsatisfiedDependencyException异常 这个异常通常是由于依赖注入失败
  • 僵尸进程的查找及僵尸进程的kill

    首先我们来看看什么是僵尸进程 之前的学习过程中时这样理解僵尸进程的 子进程先于父进程退出 并将退出原因保留在pcb中 因此退出后不会自动释放所有资源 子进程退出后操作系统会通知父进程子进程退出了 你去获取一下原因 再完全释放子进程资源 若父
  • 软件测试基础知识(7)——因果图法

    因果图法 定义 因果图法是一种利用图解法分析输入的各种组合情况 从而设计测试用例的方法 它适合于检查程序输入条件的各种组合情况 特点 1 考虑输入条件的相互制约及组合关系 2 考虑输出条件对输入条件的制约关系 因果图法产生的背景 等价类划分
  • 高可用集群HA、LVS+Keepalived、健康检测

    keepalived是集群管理中保证集群高可用 HA 的一个服务软件 其功能类似于heartbeat 用来防止单点故障 2 工作原理 keepalived是以VRRP协议为实现基础的 当backup收不到vrrp包时就认为master宕掉了
  • 快速排序c++实现

    思想 用过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据要小 然后再对这两部分重复此步骤 直到整个数组变成有序序列 对一个数组实现一趟快速排序的过程 1 定义两个变量 一个指向数组最前 一个指向最后
  • uniapp开发的scroll-view的x轴滑动两端不能够完全显示的修改

    uniapp开发多端应用 做一个scroll view后 在h5可以完全显示 app也可以 就是在小程序端两侧都不能够完全显示 把官方简单的示例代码复制下来调试 发现问题在于scroll view层的class的width 如果设置成100
  • HC-05(ZS-040)蓝牙模块使用详情(蓝牙模块配置、手机蓝牙控制单片机、蓝牙与蓝牙之间的通信)含51、32程序

    HC 05是一款主从一体化的蓝牙模块 因此其使用起来比较方便 只需要进行简单的配置即可 本文就手把手的介绍小白入手模块后如何使用 对于模块使用 1 蓝牙配置 2 手机与蓝牙的传输 3 手机通过蓝牙模块控制单片机 4 一对蓝牙之间主 从传输数
  • java随机抽题系统_随机抽取试题(java+sql 2005)

    import java awt BorderLayout import java util import java awt event import java awt Container import java awt EventQueue
  • 强啊,点赞业务缓存设计优化探索之路。

    背景 内容点赞业务在得物社区中是一个非常高频的业务场景 功能本身复杂度不高 但是业务场景多 QPS高 而且由于社区的用户体量 整体点赞的数据量非常大 其中最核心 对响应性能要求最高的主要是 用户是否点赞内容 和 内容点赞数 场景 在得物社区
  • fgets 函数详解

    描述 C 库函数 char fgets char str int n FILE stream 从指定的流 stream 读取一行 并把它存储在 str 所指向的字符串内 当读取 n 1 个字符时 或者读取到换行符时 或者到达文件末尾时 它会
  • PID ------------------------------------

    28条消息 位置式PID和增量式PID的区别 转载 zhangfengmei1987的博客 CSDN博客 位置式pid 28条消息 自动驾驶 PID实现轨迹跟踪 python实现 C 实现 CHH3213的博客 CSDN博客 轨迹跟踪 P
  • webpack 插件实战笔记(一)

    cnpm init 111Air webpackSerial1 i cnpm init This utility will walk you through creating a package json file It only cove