目录
webpack:webpack-dev-server本地服务器
webpack
Webpack官网号称“打包所有的样式、资源、脚本、图片”,接下来将基于Webpack搭建前端项目模块化开发的基本骨架。
webpack简介
webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler),主要用于编译JavaScript模块,基于webpack的cli脚手架或者API可实现前端应用的模块化开发。
当webapck处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将这些模块打包成一个或者多个bundle。
webpack起步
(1)初始化项目。创建webpack项目,需要使用npm init命令初始化一个项目,然后使用如下命令在本地安装webpack依赖、webpack-cli脚手架,其中:后者webpack-cli脚手架工具用于在命令行中运行webpack。
npm init -y
npm install webpack webpack-cli --save-dev
(2)创建入口文件。创建index.html文件、src/index.js,其中:后者src目录下的index.js我们称之为“入口文件(entry point)”,index.js通常需要在webpack.config.js配置文件中指定,并将其作为webpack应用构建的入口脚本文件。
(3)配置文件编写。编写一个最简单的配置文件如下,
/**
* webpack项目的配置文件
*/
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
}
};
(4)配置package.json,添加npm命令,用于替换npx webpack的运行方式。
(5)安装lodash.js第三方依赖模块(该模块提供了一系列用于处理数组、字符串、数学运算相关的JavaScript 实用工具库),并编写入口文件src/index.js、入口页面index.html。
#安装lodash第三方依赖
npm install --save lodash
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cesium-Webpack</title>
<!-- <script src="https://unpkg.com/lodash@4.16.6"></script> -->
</head>
<body>
<script src="./src/index.js"></script>
</body>
</html>
import _ from 'lodash';//使用webpack管理JavaScript资源
/**
* 创建一个子组件
*/
function component(){
const element = document.createElement("div");
element.innerHTML = _.join(["hello","webpack"],' ');
return element;
}
document.body.appendChild(component());
(7)执行如下命令,打包资源,可以看到项目根目录下出现了一个main.js——JavaScript脚本文件,这文件就是之前我们编写好的代码和依赖库中的脚本合并压缩之后的、可以在浏览器端直接运行的JS脚本文件。
npm run build
(8)注意到:webpack默认打包时,不会生成index.html主页面,那么,此处我们可以手动提供一个,并使用script标签引入main.js脚本库。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cesium-Webpack</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>
(9) 此时,双击打开dist输出目录下的index.html文件,就可以看到显示效果。
webpack:管理静态资源
那么,webpack如何管理资源,例如图片、字体呢?以下部分进行详细介绍。
webpack通过loader引入除了JavaScript以外任何类型的文件,即:Webpack除了用于管理相互之间具有依赖关系的JavaSript模块,同样可以用来构建网站或者web应用程序中的所有非JavaScript内容。
webpack:加载CSS资源
我们尝试编写一个global.css,来执行全局样式——DOM元素边界的清零操作。注意:webpack可以将所有资源视为一个模块化应用的子模块,也就是说,我们将使用import命令导入一个global.css全局样式文件。
(1)安装style-loader和css-loader,命令如下,
npm install --save-dev style-loader css-loader
(2)通过modules属性,配置loader,修改webpack.config.js文件的内容如下,
/**
* webpack项目的配置文件
*/
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
}
]
}
};
(3)尝试通过如下命令,导入src/global.css样式文件。
import './global.css' //导入全局样式文件
(4)运行构建/打包命令:npm run build,重新打开dist文件夹下的index.html文件,查看网页样式。如下图所示,使用import命令导入的样式文件已经生效了。
webpack:加载图片资源
现在,我们在src目录下新建一个assets子文件夹,用来存放一张照片,并尝试在webpack项目中,使用import命令引入,并通过原生JavaScript编程,将其插入index.html页面中展示。
(1)安装file-loader。安装命令如下,
npm install --save-dev file-loader
(2)修改webpack.config.js配置文件内容,如下所示,
/**
* webpack项目的配置文件
*/
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
}
]
}
};
(3)修改index.js入口文件的代码如下,并使用import命令导入image图片资源,将其添加到index.html页面中,代码如下,
import _ from 'lodash' //使用webpack管理JavaScript资源
import './global.css' //导入全局样式文件
import img_hg from './assets/xjqxz.jpg' //导入图片资源
/**
* 创建一个子组件
*/
function component() {
const documentFrags = document.createDocumentFragment();
//创建DOM元素
const div = document.createElement('div')
div.innerHTML = _.join(['hello', 'webpack'], ' ')
//创建img元素
const image = document.createElement("img");
image.src = img_hg;
//添加到文档片段容器中
documentFrags.appendChild(div);
documentFrags.appendChild(image);
//返回文档片段
return documentFrags;
}
document.body.appendChild(component())
(4)重新执行打包命令:npm run build,可以看到dist目录下出现了刚才使用的图片文件,然后打开dist/index.html页面,查看执行效果如下,图片资源引入成功。
webpack:加载字体资源
现在,我们尝试引入一种电子表和其它样式的字体资源。在webapck项目中,仍然可以使用file-laoder文件加载器在加载字体资源(实际上,file-loader加载器可以用于加载任何类型的文件)。
(1)首先,我们需要更新webpack.config.js配置文件,将file-loader加载器应用于字体资源。
/**
* webpack项目的配置文件
*/
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
}
]
}
};
(2)其次,我们在src/assets文件夹下新建一个fonts子文件夹,用来存放字体资源。
(3)接下来,我们尝试在global.css全局样式文件中,使用@font-face来注册字体,使用这两种字体。
/* 注册字体 */
/* 电子表字体 */
@font-face {
font-family: DS_DIGIT;
src: url('./assets/fonts/DS-DIGIT.TTF');
font-weight:400 ;
font-style: normal;
}
/* 站酷高端黑字体 */
@font-face {
font-family: ZK_BLACK;
src: url('./assets/fonts/zk_black.woff') format('woff'),url('./assets/fonts/zk_black.woff2') format('woff2');
font-weight:400 ;
font-style: normal;
}
*,html,body{
margin: 0;
padding: 0;
box-sizing: border-box;
background-color: skyblue;
}
(4)重新打包,打开dist文件夹下的index.html,可以看到,两种字体文件引入成功。
webpack:加载各种文件
除了图片和字体资源,webpack还可以用于加载各种数据文件,例如:JSON 文件,CSV、TSV 和 XML。类似于NodeJS,webpack对JSON格式天然支持,可以直接使用import命令导入JSON文件,默认运行正常。但是,要导入CSV、TSV和XML文件,就要使用csv-loader和xml-loader,以下其进行配置。
(1)使用如下命令,安装对应的加载器,
npm install --save-dev csv-loader xml-loader
(2)修改webpack.config.js配置文件,为CSV、TSV、XML文件提供对应的加载器。
/**
* webpack项目的配置文件
*/
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
},
//配置CSV、TSV加载器
{
test:/\.(csv|tsv)$/,
use:"csv-loader",
},
//配置XML加载器
{
test:/\.xml$/,
use:"xml-loader",
}
]
}
};
(3)然后我们在src/assets文件夹下创建data子文件夹,并放入几个文件,包括:json、csv、xml格式的,
(4)尝试在index.js入口文件中引入三个文件,并打印内容。
import grid_json from './assets/data/grid.json' //导入json文件
import result_csv from './assets/data/result.csv' //导入csv文件
import test_xml from './assets/data/test.xml' //导入xml文件
console.log(grid_json)
console.log(result_csv)
console.log(test_xml)
(5)重新打包,并打开dist/index.hml文件,查看控制台的内容。可发现:经过webapck的处理,导入的数据资源,已经被转换为JavaScript的Object对象或者Array对象数组。
webpack资源管理的优势
以上我们的项目结构是:将全部的静态资源放在src/assets文件夹中,尽管在前端开发中这是一种经常性的做法,但是,webpakc的这种模块化资源的管理能力,可以使我们将模块和各自的资源文件放在一起,从而减少维护/开发压力。
webpack:管理输出
webpack:自动构建dist目录
到目前为止,我们的dist目录下的index.html文件,仍然是手动编写,然后拷贝过去的。这种做法未免有些low,并且,如果是真正的大型项目开发,随着应用程序增长,并且一旦开始对文件名使用哈希(hash)]并输出多个 bundle,手动地对 index.html
文件进行管理,一切就会变得困难起来。
接下来,我们尝试在webpack中配置插件,使dist目录下的index.html文件可以自动生成。
(1)先清空dist目录中的所有文件;
(2)安装HtmlWebpackPlugin插件,该插件简化了HTML文件的创建,可以为webpack包提供服务,这对于上述情况(经常性发生变化的、包含hash哈希字符的webpack资源十分有用),因为这个插件可以自动为我们生成一个HTML文件。
npm install --save-dev html-webpack-plugin
(3)修改webpack.congfig.js配置文件的内容,使得HtmlWebpackPlugin插件生效。
/**
* webpack项目的配置文件
*/
const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
},
//配置CSV、TSV加载器
{
test:/\.(csv|tsv)$/,
use:"csv-loader",
},
//配置XML加载器
{
test:/\.xml$/,
use:"xml-loader",
}
]
},
//插件配置
plugins:[
new HtmlWebpackPlugin(),
]
};
(4)重新运行打包命令:npm run build,dist输出目录内容和index.html自动构建的内容如下,
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Webpack App</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<script defer="defer" src="main.js"></script>
</head>
<body></body>
</html>
webpack:自动清理dist目录
通常地,按照以上的方式去打包项目,生成在dist目录中的文件只会执行覆盖操作,而不会执行清理操作,时间一长,这对于项目的打包发布是十分不友好的。
因此,可以使用webpack官网推荐的clean-webpack-plugin管理插件,它会自动帮我们在每次执行npx webapck或者npm run build命令之前,先去清理dist目录,然后再生成新的内容。
(1)安装命令如下,
npm install clean-webpack-plugin --save-dev
(2)修改webpack.config.js,在plugins节点中为其配置,
/**
* webpack项目的配置文件
*/
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
},
//配置CSV、TSV加载器
{
test:/\.(csv|tsv)$/,
use:"csv-loader",
},
//配置XML加载器
{
test:/\.xml$/,
use:"xml-loader",
}
]
},
//插件配置
plugins:[
new HtmlWebpackPlugin({
title: 'Output Management'
}),
new CleanWebpackPlugin(),//指定要清理的目录
]
};
webpack:打包进度条
除了第三方插件,webapck也提供了一些内置插件,其中之一就是ProgressPlugin——用于在打包前端项目时显示打包进度条,只需要修改webpack.cionfig.js配置文件的内容为如下即可。
/**
* webpack项目的配置文件
*/
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const webpack = require('webpack'); //获取webpack内置插件
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
},
//配置CSV、TSV加载器
{
test:/\.(csv|tsv)$/,
use:"csv-loader",
},
//配置XML加载器
{
test:/\.xml$/,
use:"xml-loader",
}
]
},
//插件配置
plugins:[
new webpack.ProgressPlugin(),//打包进度条
new HtmlWebpackPlugin({
title: 'Output Management'
}),
new CleanWebpackPlugin(),//指定要清理的目录
]
};
webpack开发配置
webpack:错误追踪
通常的,我们在开发时,非常乐于看到开发工具能够直接提示我们:代码报错的文件、位置信息,而不是泛泛的告诉你一声:代码运行错误,这样的错误提示是没有意义的。
为了追踪代码中的出错位置,我们可以使用source map配置项,在启用此配置项时,JavaScript内部就会通过一中反映射,将打包后的代码中错处的问题,映射到打包之前的文件之中,并进行提示。
(1)修改webapck.config.js配置文件中的配置项,
/**
* webpack项目的配置文件
*/
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const webpack = require('webpack'); //获取webpack内置插件
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
devtool: 'inline-source-map',//source-map配置
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
},
//配置CSV、TSV加载器
{
test:/\.(csv|tsv)$/,
use:"csv-loader",
},
//配置XML加载器
{
test:/\.xml$/,
use:"xml-loader",
}
]
},
//插件配置
plugins:[
new webpack.ProgressPlugin(),//打包进度条
new HtmlWebpackPlugin({
title: 'Output Management'
}),
new CleanWebpackPlugin(),//指定要清理的目录
]
};
(2)我们故意在index.js中加入一句代码如下,
(3)重新打包,并运行程序,看到如下的出错提示,这样,根据错误提示信息,我们看可以直接追踪到index.js文件的38行,这正是我们刚才故意抛出Error错误的地方。
webpack:启用观察者模式
webpack当前搭建的项目,每次修改之后,都需要重新打包,然后找到dist/index.html重新打开,才能看到修改之后的效果,这种重复性的操作在实际开发中显得异常繁琐。我们需要一种插件/配置,可以在修改代码之后,实时更新看到index.html视图中修改之后的内容。
要实现此种效果,只需要在package.json文件中的scripts标签中,添加如下脚本即可,
"watch": "webpack --watch",
然后,我们使用命令:npm run watch,启动项目,然而却不会退出命令行。这是因为 script 脚本还在观察文件。现在,webpack 观察文件的同时,我们先移除我们之前引入的错误:
此时,我们注释掉刚才的throw new Error()抛出错误的语句,然后刷新浏览器,即可看到最新的效果。
从此种行为可以得到:观察者模式下,如果其中一个文件被更新,代码将被重新编译,所以你不必手动运行整个构建。
webpack:webpack-dev-server本地服务器
webpack的观察者模式帮我们解决了自动编译/构建的问题,但是,在每次修改代码之后,我们仍然需要手动刷新浏览器,才可以看到最新的内容,这显然也不是十分友好。
因此,我们可以通过使用 webpack-dev-server搭建一个本地服务器,使其能够实时重新加载(live reloading),实现类似于java后端的热部署操作。
(1)安装webpack-dev-server依赖包,
npm install --save-dev webpack-dev-server
(2)修改webpack.config.js配置文件,使得webpack-dev-server可以起作用,
/**
* webpack项目的配置文件
*/
const HtmlWebpackPlugin = require('html-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const webpack = require('webpack'); //获取webpack内置插件
const path = require("path");
module.exports = {
//提供 mode 配置选项,告知 webpack 使用相应模式的内置优化-[也可以从cli中传递模式参数]
mode:"production",
//入口文件配置
entry:"./src/index.js",
//出口文件
output:{
filename: '[name].js',//占位符[name],保证文件名唯一
path: path.resolve(__dirname,"dist"),//指定输出文件保存在根目录下的dist文件夹中
},
devtool: 'inline-source-map',//source-map配置
//devserver配置
devServer:{
static: './dist',//指定dist目录下的内容为devServer实时监视的目录
},
//模块配置
module:{
rules:[
//css加载器
{
test:/\.css$/,//正则表达式-匹配css样式文件
use:['style-loader','css-loader'],//配置样式加载器
},
//图片加载器
{
test:/\.(png|svg|jpg|gif)$/,//正则表达式-匹配图片文件
use:['file-loader'],//配置图片文件加载器
},
//字体资源加载器
{
test:/\.(woff|woff2|eot|ttf|otf)$/,//正则表达式-匹配字体资源
use:['file-loader'],//配置字体资源加载器
},
//配置CSV、TSV加载器
{
test:/\.(csv|tsv)$/,
use:"csv-loader",
},
//配置XML加载器
{
test:/\.xml$/,
use:"xml-loader",
}
]
},
//插件配置
plugins:[
new webpack.ProgressPlugin(),//打包进度条
new HtmlWebpackPlugin({
title: 'Output Management'
}),
new CleanWebpackPlugin(),//指定要清理的目录
]
};
(3)修改package.json的scripts命令脚本,添加一个 新的script 脚本,可以直接运行开发服务器(dev server):"start": "webpack-dev-server --open",
(4)现在,在命令行中运行 npm start
,就会看到浏览器自动加载页面。如果现在修改和保存任意源文件,web 服务器就会自动重新加载编译后的代码。
(5)此时,浏览器中显示警告信息,尽管这不是Error错误,但是,在webpack程序中,这仍然会阻断程序的运行,我们可以对其进行抑制即可,
截止到目前,我们的package.json文件结构如下,
{
"name": "cesium-webpack",
"version": "1.0.0",
"description": "webpack-Cesium",
"private": true,
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"watch": "webpack --watch",
"start": "webpack-dev-server --open"
},
"author": "Xwd",
"license": "ISC",
"devDependencies": {
"clean-webpack-plugin": "^4.0.0",
"css-loader": "^6.7.1",
"csv-loader": "^3.0.5",
"file-loader": "^6.2.0",
"html-webpack-plugin": "^5.5.0",
"style-loader": "^3.3.1",
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.11.1",
"xml-loader": "^1.2.1"
},
"dependencies": {
"lodash": "^4.17.21"
}
}