当前位置: 首页 > Web前端 > HTML5

Webpack4.0打包总结

时间:2023-04-05 15:27:38 HTML5

1.webpack的概念WebPack可以看作是一个模块打包器:它所做的就是分析你的项目结构,找到JavaScript模块和其他浏览器不能直接运行的扩展语言(Scss、TypeScript等)并打包转换为适合浏览器使用的格式。构建是将源代码转换成可执行的JavaScript、CSS、HTML代码,发布在网上,包括以下内容:代码转换:TypeScript编译成JavaScript,SCSS编译成CSS等文件优化:压缩JavaScript、CSS、HTML代码,压缩以及合并图片等。代码拆分:提取多个页面的公共代码,将不需要在首屏执行的代码提取出来,让其异步加载。模块合并:一个模块化项目中会有很多模块和文件,需要一个构建函数将模块分类合并到一个文件中。自动刷新:监控本地源代码变化,自动重建和刷新浏览器。代码校验:代码提交入库前,需要校验代码是否符合规范,单元测试是否通过。自动发布:代码更新后,自动构建在线发布代码并传输至发布系统。构建其实就是工程化和自动化思想在前端开发中的体现。用代码实现一系列流程,代码自动执行这一系列复杂的流程。Build为前端开发注入了更多活力,解放了我们的生产力。2.初始化项目初始化package.jsonnpminit-ypackage.json"scripts":{"build":"webpack--profile--progress--colors--display-error-details","dev":"webpack--display-modules--profile--progress--colors--display-error-details"},color输出结果有颜色,例如:耗时较长的步骤会显示为红色。Profile输出性能数据,可以看到每一步的耗时进度输出当前编译的进度,以百分比的形式呈现display-modules默认会隐藏node_modules下的modules,添加这个参数即可displaythesehiddenmodulesdisplay-error-detailsoutputdetailed全局安装的报错信息npminstallwebpack-glocalinstallationnpminstallwebpackwebpack-cli-D//-D表示需要开发环境,不是在线的,同下。一般建议本地安装,安装在自己的项目中,否则版本不同会出现不兼容的情况。3.1webpackEntry的核心概念:entry,Webpack执行构建的第一步会从Entry开始,可以抽象为input。Module:模块,在Webpack中一切都是模块,一个模块对应一个文件。Webpack会递归地从配置的Entry中查找所有依赖的模块。Chunk:代码块,一个Chunk由多个模块组成,用于代码合并和拆分。Loader:模块转换器,用于将模块原有的内容按要求转换成新的内容。Plugin:扩展插件,在Webpack构建过程的特定时刻注入扩展逻辑,改变构建结果或做你想做的事情。Output:输出结果,Webpack经过一系列处理得到最终想要的代码后输出结果。3.2配置webpacknpminstallwebpackwebpack-cli-Dcreatesrccreatedistcreateindex.html配置文件webpack.config.jsentry:配置入口文件地址output:配置导出文件地址module:配置模块,主要是用于配置不同的文件Loaderplugins:configureplugindevServer:configuredevelopmentserver//node-basedletpath=require('path');//nodemodulemodule.exports={entry:'./src/index.js',//entryoutput:{filename:'build.js',//这个路径必须是绝对路径path:path.resolve('./dist')},//退出devServer:{contentBase:'./dist',port:8080,compress:true,//服务器压缩open:true,//自动打开浏览器//hot:true//hotupdate},//开发服务器module:{},//模块配置plugins:[],//插件配置mode:'development',//可以更改模式resolve:{},//配置解析}//webpack中如何配置开发服务器webpack-dev-server配置开发服务器npmiwebpack-dev-server–DcontentBase配置开发服务运行时的文件根目录host:开发服务器监听的主机地址tocompress开发服务器是否启动gzip等压缩端口:开发服务器监听的端口devServer:{contentBase:path.resolve(__dirname,'dist'),host:'localhost',compress:true,port:8080}//开发服务器"scripts":{"build":"webpack--modedevelopment","dev":"webpack-dev-server--open--modedevelopment"}//启用本地服务npmrundeventry文件类型5.1单项+单项输出这种情况很少见,一般可以以字符串的形式出现,例如:entry:'./src/index.js',5.2多入口数组格式+单出口entry:['./源代码/index.js。js','./src/a.js']5.1。多入口+多出口有时候我们的页面可以是多个HTML页面,会有多个页面,所以我们需要多入口entry:{index:'./src/index.js',main:'./src/main.js'},输出:{路径:path.resolve(__dirname,'dist'),文件名:'[name].[hash].js',publicPath:PUBLIC_PATH},newHtmlWebpackPlugin({minify:{removeAttributeQuotes:true},hash:true,template:'./src/index.html',chunks:['index'],filename:'index.html'}),newHtmlWebpackPlugin({minify:{removeAttributeQuotes:true},hash:true,chunks:['main'],template:'./src/main.html',filename:'main.html'})],支持加载css文件6.1什么是Loader通过使用不同的Loader,Webpack可以将不同的文件转换为JS文件,如CSS、ES6/7、JSX等。扩展名的正则表达式use:loadername,就是你要使用的模块名include/exclude:手动指定必须处理的文件夹或屏蔽不需要处理的文件夹query:提供附加装载机的设置选项。loader的三种写法useloaderuse+loader6.2css-loadernpmistyle-loadercss-loader-D配置加载器模块:{rules:[{test:/.css$/,use:['style-loader','css-loader'],//从右往左写,webpack特性include:path.join(__dirname,'./src'),exclude:/node_modules/}]},支持图片7.1手动添加图片npmifile-loaderurl-loader-Dfile-loader解决了在CSS和其他文件中导入图像路径的问题。当图片较小时,url-loader会对图片进行BASE64编码,当图片大于limit参数时,使用file-loader进行拷贝。letlogo=require('./images/logo.png');letimg=newImage();img.src=logo;document.body.appendChild(img);{test:/\.(jpg|png|gif|svg)$/,use:'url-loader',include:path.join(__dirname,'./src'),exclude:/node_modules/}7.2在CSS中引入图片也可以在CSS文件中引入图片.img-bg{background:url(./images/logo.png);width:173px;height:66px;}自动生成html8.1插件是什么插件是wepback的支柱功能webpack本身也是内置的在上面的webpack配置中使用的同一个插件系统上!插件使用npminstall插件名-D因为插件都是类,可以通过plugins数组中的新插件名使用引用方式。8.2我们希望自动生成HTML文件,并将生成的资源导入其中。npmihtml-webpack-plugin-Dminify是压缩html文件,removeAttributeQuotes是去掉属性的双引号hash。导入输出资源时,添加Upperhash以避免缓存模板模板路径插件:[newHtmlWebpackPlugin({minify:{removeAttributeQuotes:true},hash:true,template:'./src/index.html',filename:'index.html'})]分离CSS并行下载CSS和JS。当一个大的HTML文件很大时,我们可以单独提取和加载CSS。webpack4中的mini-css-extract-plugin也可以实现。但是目前bug比较多,不能分多个文件。CSS。npminstall--save-devextract-text-webpack-plugin@next{test:/\.css$/,使用:ExtractTextWebpackPlugin.extract({use:'css-loader'}),include:path.join(__dirname,'./src'),exclude:/node_modules/},plugins:[newExtractTextWebpackPlugin('css/index.css'),]处理图片路径问题constPUBLIC_PATH='/';output:{path:path.resolve(__dirname,'dist'),filename:'bundle.js',publicPath:PUBLIC_PATH},//指定打包图片的位置use:[{loader:'url-loader',options:{limit:1024,outputPath:'images/'}}],在HTML中使用图像png">

{test:/.(html|html)$/,use:'html-withimg-loader',include:path.join(__dirname,'./src'),exclude:/node_modules/}编译less和sassnpmilessless-loader-Dnpminode-saassass-loader-D@color:orange;.less-container{border:1pxsolid@color;}$color:green;.sass-container{边框:1px纯色$color;}constcssExtract=newExtractTextWebpackPlugin('css.css');constlessExtract=newExtractTextWebpackPlugin('less.css');constsassExtract=newExtractTextWebpackPlugin('sass.css');{test:/\.less$/,use:lessExtract.extract({use:['css-loader','less-loader']}),include:path.join(__dirname,'./src'),exclude:/node_modules/},{test:/\.scss$/,use:sassExtract.extract({use:['css-loader','sass-loader']}),包括:path.join(__dirname,'./src'),exclude:/node_modules/},为了浏览器兼容处理CSS3属性前缀,有时候我们不得不加上-webkit,-ms,-o,-moz这些前缀三叉戟内核:主要代表是IE浏览器,前缀是-msGecko内核:主要代表是Firefox,前缀是-mozPresto内核:主要代表是Opera,前缀是-oWebkit内核:主要代表是Chrome和Safari,前缀是-webkitnpmipostcss-loaderautoprefixer-Dpostcss-loaderpostcss.config.jsmodule.exports={plugins:[require('autoprefixer')]}.circle{transform:translateX(100px);{test:/\.css$/,使用:cssExtract.extract({使用:['css-loader','postcss-loader']}),include:path.join(__dirname,'./src'),exclude:/node_modules/},}escapeES6/ES7/JSXBabel其实就是编译好的JavaScript了平台可以将ES6/ES7、ReactJSX转换为ES5npmibabel-corebabel-loaderbabel-preset-envbabel-preset-stage-0babel-preset-react-D{test:/\.jsx?$/,使用:{loader:'babel-loader',options:{presets:["env","stage-0","re??act"]}},include:path.join(__dirname,'./src'),exclude:/node_modules/},如何调试打包后的代码webapck可以通过配置自动给我们sourcemaps文件,map文件是编译文件对应的方法,源文件source-map将map文件生成成一个单独的文件,最完整和最慢的cheap-module-source-map在单独的文件中生成没有列映射的Mapeval-source-map使用eval打包源文件模块并在同一个文件中生成完整的sourcemapcheap-module-eval-source-mapsourcemap和打包后的JS同行显示没有映射栏-webpack-plugin-DnewCopyWebpackPlugin([{from:path.join(__dirname,'public'),//静态资源目录源地址to:'./public'//目标地址,相对于输出路径目录}]),清空打包目录前的输出npmiclean-webpack-plugin-DnewcleanWebpaclPlugin(path.join(__dirname,'dist'))压缩csswebpack可以剔除不用的cssnpmi-Dpurifycss-webpackpurify-cssglobnewPurifyCSSPlugin({//purifycss按照这个路径配置遍历你的HTML文件,找到你使用的CSSpaths:require('glob').sync(path.join(__dirname,'src/*.html'))}),resolve17.1extensions指定扩展名后,require时不需要添加文件或者importExtensions,会尝试添加extensions以匹配resolve:{//自动补全后缀,注意第一个必须是空串,后缀必须以点开头extensions:["",".js",".css",".json"],},17.2alias配置别名可以加快webpack查找模块的速度每当引入jquery模块时,会直接导入jqueryPath,而不是根据从node_modules文件夹中查找模块的搜索规则需要webpack解析jquery.js文件constbootstrap=path.join(__dirname,'node_modules/bootstrap/dist/css/bootstrap.css')resolve:{alias:{'bootstrap':bootstrap}},区分很多库和环境变量会和process.env.NODE_ENV环境变量相关联,来决定库中应该引用什么。例如,某些库可能会添加额外的日志记录(log),以便在不在生产环境中时更轻松地进行调试。和测试。事实上,当使用process.env.NODE_ENV==='production'时,一些库可能会针对特定用户的环境优化代码,从而删除或添加一些重要的代码。我们可以使用webpack内置的DefinePlugin为所有依赖项定义这个变量:npminstallcross-env-D"scripts":{"build":"cross-envNODE_ENV=productionwebpack--modedevelopment","dev":“webpack-dev-server--open--modedevelopment”},插件:[newwebpack.DefinePlugin({NODE_ENV:JSON.stringify(process.env.NODE_ENV)}),if(process.env.NODE_ENV=='development'){console.log('这是开发环境');}else{console.log('这是生产环境');}作者:认真的娇娇链接:https://juejin.im/post/5af8fa806fb9a07ac162876d来源:掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处