当前位置: 首页 > 后端技术 > Node.js

Webpack5

时间:2023-04-03 23:39:28 Node.js

前言Webpack是目前最流行的前端资源模块化管理和打包工具。可以将很多松散的模块按照依赖和规则打包成前端资源用于符号生产环境部署,也可以拆分按需加载的模块代码。本文将介绍webpack的配置,配置Html模板,导入CSS文件等。什么是webpack?webpack可以看成是一个模拟打包器:它所做的就是分析你的项目结构,找到JavaScript模块和其他浏览器webpack可以做些什么来扩展不能直接运行的语言(Scss、TypeScript等),打包成适合浏览器使用的格式?代码转换(比如es6转es5,less转sass)文件优化(比如打包过程中压缩代码体积,合并文件等)代码切分(比如开发多个页面时,把公共页面抽走,路由懒加载功能)模块合并(比如将多个模块合并为一个模块)自动刷新(帮我们启动一个本地服务来更新我们代码改动后的页面)codevalidation(验证我们的代码是否符合规范)自动发布(打包完成后可以实现自动补全功能,可以将打包后的代码发布到服务器)webpack基础配置桌面构建webpack文件夹mkdirwebpack初始化项目yarninit-y初始化项目生成package.json文件安装依赖yarnaddwebpackwebpack-cli-D启动devServer需要安装webpack-dev-serveryarnaddwebpack-dev-server-D新建src文件夹mkdirsrcsrc新建index.js文件touchindex.jswebpack可以做一个零配置的打包工具,对JS模块进行打包,然后输出打包。支持JS模块化。使用webpack打包时,默认会打包src下的入口文件index.js。如果没有设置模式,package输出的文件会自动压缩。npxwebpack设置模式为开发模式,打包后的文件不压缩。npxwebpack--modedevelopment注意:在nodev8.2之后,会有一个npxnpx,执行npxwebpack命令时会执行bin中的文件,此时webpack会自动在bin中搜索index.js文件项目的src目录,然后打包生成dist目录下有打包好的main.js文件生成目录配置webpack.config.js新建webpack.config.js文件在webpack项目下新建webpack.config.js文件异步默认配置文件名iswebpack.config.js//webpack是node写的node的写法letpath=require('path')module.exports={mode:'development',//mode默认两种生产开发开发模式entry:'./src/索引。js',//入口文件output:{filename:'bundle.js',//打包文件名path:path.resolve('dist')//路径必须是绝对路径,在当前目录下生成一个distDirectory}}打包后如果项目目录配置脚本觉得名字太长,在package.json配置一些脚本"scripts":{"build":"webpack--configwebpack.config.js","dev":"webpack-dev-server"},这里的--config指的是添加配置文件,webpack.config.js文件名执行npmrunbuild就是我们的打包文件,这个是生产环境和线上npm需要执行的文件rundev是我们开发环境中的文件配置入口文件类型单入口单出口entry:'./src/index.js'多入口单出口有时候我们有多个页面,需要用到多个出口入口:['./src/index.js','./src/other.js']多入口多出口//webpack是node写的letpath=require('path');module.exports={entry:{index:'./src/index.js',other:'./src/other.js'},output:{filename:'[name].js',path:path.resolve('dist')},}此时运行npmrunbuild,会看到打包好的两个js文件,配置html模板安装插件yarnaddhtml-webpack-plugin-D到创建一个新索引。html在src目录下新建index.html文件touchindex.html单页开发然后在webpack.config.js中引用//webpack是node写的node的写法letpath=require('path');letHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={entry:'./src/index.js',//entryfileoutput:{//添加hash可以防止文件缓存,4位每次都会生成hashstringfilename:'bundle.[hash:4].js',path:path.resolve('dist')},plugins:[//使用插件newthisclassnewHtmlWebpackPlugin({//在src目录下创建一个index.html模板:'./src/index.html',hash:true,//打包后的bundle.js后面会加上一个hash字符串})]}执行然后npmrunbuild执行打包之后,自动引入JS进行多页面开发。开发的时候有时候页面不止一个,需要配置多个页面。我们删除之前的dist目录,在webpack.config.js中引用//webpack是node写的node的写法letpath=require('path');letHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={//多页开发,如何配置多页入口:{index:'./src/index.js',other:'./src/other.js'},//导出文件output:{filename:'[name].js',path:path.resolve('dist')},plugins:[newHtmlWebpackPlugin({template:'./src/index.html',filename:'index.html',chunks:['index']//对应,index.js对应index.html}),newHtmlWebpackPlugin({template:'./src/other.html',filename:'other.html',chunks:['other']//对应,login.js对应login.html})]}执行再执行npmrunbuild,会看到dist目录下多了两个文件配置css模块安装yarnaddstyle-loadercss-loader-Dyarnaddlessless-loader-D在src目录新建一个文件创建在src目录下新建style.css文件并新建style.less文件src/index.jsimport'./style.css';导入“./style.less”;webpack.config.js//webpack写的是node节点的写法letpath=require('path');//webpack.config.jsmodule.exports={entry:{index:'./src/index.jsjs'},输出:{filename:'bundle.js',path:path.resolve('dist')},module:{rules:[{test:/\.css$/,//解析cssuse:['style-loader','css-loader']//从右往左解析}]}}然后执行npmrunbuild执行后,对目录进行截图拆分单个CSS安装yarnaddmini-css-extract-plugin-D新建文件并在src文件下新建一个css文件在less文件css文件下新建一个style.css文件在less文件下新建一个style.less文件index.jsimport'./css/style.css';导入'./less/style.less';webpack.config.jsletMiniCssExtractPlugin=require('mini-css-extract-plugin');module.exports={模块:{规则:[{测试:/\.css$/,使用:[MiniCssExtractPlugin.loader,'css-loader']}]},plugins:[newMiniCssExtractPlugin({filename:'css/ming.css'})]}执行后目录截图拆分为多个cssindex.jsimport'./css/style.css';导入'./css/reset.较少的';webpack.config,jsletExtractTextWebpackPlugin=require('extract-text-webpack-plugin');letstyleLess=newExtractTextWebpackPlugin('css/style.css');letresetCss=newExtractTextWebpackPlugin('css/reset.css');module.exports={模块:{规则:[{测试:/\.css$/,使用:resetCss.extract({使用:'css-loader'})},{测试:/\.less$/,使用:styleLess.extract({使用:'css-loader'})}]},plugins:[styleLess,resetCss]}执行后,对目录进行截图,导入图片,打包安装yarnaddfile-loaderurl-loader-Dfile-loader会默认在内部生成图片并发送到构建目录。url-loader是base64编码的显示图片的方法JS创建图片并importsrc/index.jsimportlogofrom'./logo.jpg'//导入图片,返回结果是新的图片地址让image=newImage();image.src='./logo.jpg'//是普通字符串document.body.appendChild(image);webpack.config.js{test:/\.(jpg|png|gif|svg)$/,使用:'url-loader',include:path.join(__dirname,'./src'),exclude:/node_modules/}pageimg参考图片安装yarnaddhtml-withimg-loader-Dsrc/index.cssdiv{width:952px;高度:249px;背景:url("./logo.jpg")}src/index.jsimport'./index.css'webpack.config.jsrules:[{test:/\.(png|jpg|gif)$/,use:'file-loader'},]在webpack.config中引入字体图片和svg图片。jsrules:[{test:/\.(png|jpg|gif)$/,//做一个限制,当我们的图片小于多少k活时,使用base64转换//否则使用file-loader生成一个实图使用:'url-loader',options:{limit:200*1024}},]src/index.js添加CSS3属性前缀以兼容浏览器,有时我们必须添加一些前缀来安装yarnaddpostcss-loaderautoprefixer-Dcreatepostcss.config.jsfilemodule.exports={plugins:[require('autoprefixer')]//引用插件}webpack.config.js配置module.exports={module:{rules:[{test:/\.css$/,use:['style-loader','css-loader','postcss-loader']}]}}转换为es6语法Babel会将ES6代码转换为ES5代码installyarnaddbabel-corebabel-loaderbabel-preset-envbabel-preset-stage-0-Dwebpack.config.jsmodule.exports={module:{rules:[{test:/\.js$/,use:{loader:'babel-loader',options:{//使用babel-loader需要转换es6toes5presets:['@babel/preset-env']}}},}}在服务器配置中添加devServerwebpack.config.js:{//开发服务器配置host:'localhost',//默认为localhost端口:3000,//portprogress:true,//希望在内存包中看到进度条contentBase:'./build',//希望./build目录是静态目录compress:true},配置source-mapwebpack.config.js增加源码调试,会单独生成一个sourcemap文件。如果出现错误,则表示当前错误所在的列和行-source-map',没有参数列,而是一个单独的映射文件devtool:'cheap-module-source-map'//生成后可以保留,不生成文件,集成在打包文件中,不会打包到参数列表中devtool:'cheap-module-eval-source-map'在清理输出目录之前installyarnaddclean-webpack-plugin-Dwebpack.config.jsaddletCleanWebpackPlugin=require('clean-webpack-plugin');module.exports={plugins:[newCleanWebpackPlugin('dist')]}热更新以前每次更新页面都会更新。热更新就是只更新某部分代码,写devServer:{hot:true,}plugins:[//热更新插件newwebpack.NamedModulesPlugin(),//打印更新的Module路径newwebpack.HotModuleReplacementPlugin()//热更新插件]resolve属性resolve的配置常用于配置别名省略后缀名代码写法resolve:{//解析第三方包modules:[path.resolve('node_modules')],extensions:['.js','.css','.json','.vue'],mainFiles:[],//入口文件的名称index.jsalias:{//别名bootstrap:'bootstrap/dist/css/bootstrap.css'}},提取公共代码,从多个页面中提取该页面的代码代码编写module.exports={//优化optimization:{splitChunks:{//分离代码块cacheGroups:{//缓存组common:{//公共模块chunks:'initial',minSize:0,minChunks:2,},vendor:{priority:1,test:/node_modules/,//提取你的chunks:'initial',minSize:0,minChunks:2,}}}},}webpack自带optimizedimport,会自动去除无用代码生产环境tree-shaking,自动删除无用代码,es6模块会将结果放在defalutscopehostingScopeimprovement最后,如果这篇文章是对你有帮助,请为本文点个赞??????欢迎大家加入,共同学习前端,共同进步!