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

从0开始用webpack搭建多入口网站脚手架,可复用导航栏-底栏-侧边栏,根据页面文件自动更改配置,支持ES6-Less

时间:2023-04-02 20:18:38 HTML

之前只知道webpack很强大,但是我没有'我深入研究了它,这次是从头看教程,然后从头开始搭建一个多入口网站的开发脚手架。期间遇到了很多问题,特意整理了一下,希望能给大家一点帮助。多个HTML网站使用webpack的必要性如果接到这样的任务,我们需要开发一个简单的官网,比如只有十几个HTML页面。项目很简单,不需要用什么大框架,但是如果用传统的方式写几个html、js、css,肯定会遇到这些问题:网站导航和底部banner是大家共享的页面,如何实现复用?如果不复用,有变化就改n页,太傻了。更改后如何强制清除用户缓存?我们不可能要求用户手动清除浏览器缓存,那太傻了。我想使用ES6进行js开发。如何解决浏览器兼容性问题?我想用less做css样式开发,怎么转换?可见,如果没有自动化打包工具的加入,我们是很难解决这些问题的,所以使用webpack势在必行。要达到的目标看到这里,可能有的同学着急了,废话少说,直奔主题,不行!让我们先设定目标吧!不管做什么事,都要先定下目标,而不是计较自己到了哪里,这样就不会有大的进步。正是在通往目标的道路上,我们克服了各种困难,我们才能取得进步。搭建脚手架前,希望能打包成多个html文件和js文件,即支持多个entry文件名带hash值,解决缓存问题,复用headernavigationbar和bottombanner网站。使用less写样式可以支持ES6开发。使用方便。添加页面不需要手动更改webpack的入口设置。希望能根据目录下的文件自动配置。不想通过js动态插入css样式,会导致页面闪烁,希望直接把css地址引入到html中,就像平时开发一样,可以实时看到开发效果。构建可以压缩代码。目标已定。开始工作时不要担心目录结构。写代码,一个好的目录可以让我们思路清晰,我的目录结构如下+config//环境变量配置文件,开发模式和生产模式使用不同的环境变量,比如接口地址,使用的接口域名开发环境为http://a.com,生产环境使用http://b.com-dev.env.js//本地开发变量-prod.env.js//生产环境变量+src+css//Ownlesscomponentorthird-partycsslibrary+component//less+libofitsowncomponents//第三方css库,比如bootstrap+html//html代码,主要是一些模板,比如headernavigation,bottomcolumn,sidebar+tpl//模板文件+img//图片文件+js//自己的js组件库或者第三方js库+mod//这里是自己的js组件+lib//第三方js库+page//页面文件+index//这个根据自己的情况设置。有些页面相关性高,可以放在一个文件夹中,比如用户文件夹,可以放在个人中心Allpages-index.html//每个页面必须有一个html-index.js//每个页面必须有一个js,名字和html的名字一致-index.less//每个页面必须有一个同名的less文件+test-test.html-test.js-test.less+webpack//webpack配置file-dev-server.js//开发服务设置,可以通过localhost访问页面,实时编译页面-webpack.common.js//开发环境和生产环境通用配置-webpack.dev.js//开发环境的具体配置-webpack.prod.js//生产环境的具体配置首先是config目录,目前我主要放一些环境变量,就是开发环境和生产环境不一样的变量,比如接口地址。我们开发的时候使用本地的api接口地址,打包的时候需要替换成生产环境的api地址。webpack目录存放webpack配置文件,其中开发和生产的通用配置放在webpack.common.js,开发专用的配置放在webpack.dev.js,生产专用的配置放在webpack.prod.js。src是我们开发的主目录。页面目录包含我们的页面文件。这可能与往常不同。我把每个页面用到的html、js和less文件都放在一起了。有的同学可能会把html全部放在一个目录下,而js放在一个目录下,但是这种方式有一个问题。每次换页都要翻目录,很不方便。我们应该把这些高度相关的文件放在一起,提取出来,各种css组件或者js组件可以单独放在页面之外。github地址:https://github.com/501351981/...多入口配置webpack支持多入口,即给定多入口js文件,可以输出多个js文件,那么html呢?我希望开发过程是这样的。我在html中设置标题、SEO等信息,编写HTML内容代码,webpack会自动将相关js文件插入到html底部。是的,这个需要使用html-webpack-plugin插件,调用html模板文件即可打包最终的html。安装html-webpack-pluginnpminstall--save-devhtml-webpack-pluginwebpack.common.js多入口配置constHtmlWebpackPlugin=require('html-webpack-plugin');module.exports={entry:[index:'../src/page/index/index.js',测试:'../src/page/test/test.js'],输出:{文件名:'[name].[hash].js',//输出名称后跟哈希值以解决缓存问题path:path.resolve(__dirname,'../dist')},....template:'../src/page/index/index.html',chunks:['index'],})newHtmlWebpackPlugin({filename:'test.html',template:'../src/page/test/test.html',chunks:['test'],})]}这个设置有问题。每次添加新页面时,我都必须在此处添加它。很麻烦。我们其实可以读取src/page,src/page下的js文件会自动添加到入口配置中;读取src/page下的所有html文件,自动调用newHtmlWebpackPlugin进行实例化。要读取目录下的所有文件名,我们需要引入glob,首先安装npminstall--save-devglob改进配置constglob=require('glob')constCleanWebpackPlugin=require('clean-webpack-plugin');//多入口js配置,读取src/page下的所有js文件**/*.js')让地图={};for(leti=0;i<%=require('raw-loader!../../html/tpl/navbar.html')%>

首页内容在这里

<%=require('raw-loader!../../html/tpl/footer.html')%>一开始在找解决方案的时候看到一篇文章推荐使用raw-loader,结果发现有这样的一个问题,就是导航中无法引用本地图片,比如导航中引用了一个logo图片,但是找不到,因为我们在打包的时候也会对图片进行处理,加上hash以后的价值。不能直接写图片路径。后来改用html-withimg-loader解决了问题。为了安装html-withimg-loader,顾名思义,这个插件可以用图片加载htmlnpminstall--save-devhtml-withimg-loader<%=require('html-withimg-loader!../../html/tpl/navbar.html')%>

首页的内容在这里

<%=require('html-withimg-loader!../../html/tpl/footer.html')%>顺便说一句,在html中引用图片地址需要这样写,需要通过require,只填图片地址是不行的支持ES6写js相信大家现在都学过ES6了,但是考虑到浏览器兼容性,你不能随便用,需要插件支持,我们先安装npminstall--save-devbabel-loaderbabel-corebabel-preset-env添加webpack配置webpack.common.js,我们只转换src目录下的js{test:/\.js$/,use:{loader:'babel-loader'},包括:path.resolve(__dirname,'../src')},同时在项目目录下添加一个名为.babelrc的文件,设置babel,支持大于1%份额的浏览器。2versions{"presets":[["env",{"targets":{"browsers":[">1%","last2versions"]}}]],}Babel只是将ES6语法转换为TheES5的语法,比如箭头函数转换为function(){},但是一些ES6特有的函数没有转换,比如newMap(),封装后还是newMap()。我们需要再安装一个插件来完成这个转换工作npminstall--save-devbabel-plugin-transform-runtime更改.babelrc文件{"presets":[["env",{"targets":{"browsers":[">1%","last2versions"]}}]],"plugins":["transform-runtime"]//Introduceplugins}现在你可以放心大胆的使用ES6了。使用Less编写样式。首先安装相关插件npminstall--save-devlessless-loadercss-loaderstyle-loaderwebpack.common.jsconfiguration{test:/\.css$/,use:["style-loader","css-loader","less-loader"]},在index.js文件中,我们可以像这样引入less文件import'./index.less'打包后,运行html页面,index.js会动态插入css样式进入html页面,这会导致问题。html刚加载的时候是One样式,js插入css样式后又是另一种样式,导致页面闪烁,体验不好(技术也应该追求用户体验,而不只是一个产品经理的事)。有两种解决方法。第一种是在加载JS之前显示加载动画以覆盖整个页面。二是将css文件路径打包到html中,而不是通过js动态添加。选择的第二个选项。我们要把less文件打包成css文件,需要用到插件extract-text-webpack-pluginnpminstall--save-devextract-text-webpack-pluginwebpack.common.jsconstExtractTextPlugin=require("extract-text-webpack-plugin");module.exports={规则:[{test:/\.less$/,使用:ExtractTextPlugin.extract({fallback:"style-loader",使用:"css-loader!less-loader"})},]}plugins:[newExtractTextPlugin("[name].[hash:8].css"),]打包后的html中会引入css文件,像这样webpack的配置实际上是在从0构建的过程中,先进行webpack的配置。之所以放在最后,是为了不影响主要内容。下面简单介绍一下我的webpack。配置。webpack官方建议不要写重复的配置,即将本地和生产环境共享的配置放在一个文件中,然后通过mergewebpack.dev.jsconstwebpack=require('webpack');const合并merge=require('webpack-merge');constcommon=require('./webpack.common');varOpenBrowserPlugin=require('open-browser-webpack-plugin');constenv=require('../配置/dev.env”),newwebpack.NamedModulesPlugin(),newwebpack.HotModuleReplacementPlugin(),newOpenBrowserPlugin({url:'http://localhost:5000'})],})我们可以看到,通过webpack-merge插件,配置webpack.common.js和开发将共享配置合并newwebpack.DefinePlugin({'process.env':env}),DefinePlugin定义全局变量process.envnewOpenBrowserPlugin({url:'http://localhost:5000'})这个插件是为了我们在允许npmrunstart之后,http://localhost:5000这个页面会自动打开,避免了每次都手动打开。webpack-dev-server为我们提供了一个简单的web服务器,并且可以实时重新加载,让我们可以实时看到开发结果。关于webserver的配置,我放在了dev-server.jsconstwebpackDevServer=require('webpack-dev-server');constwebpack=require('webpack');constconfig=require('./webpack.dev');const选项={contentBase:'./dist',hot:true,host:'localhost',};webpackDevServer.addDevServerEntrypoints(config,options);constcompiler=webpack(config);constserver=newwebpackDevServer(compiler,options);server.listen(5000,'localhost',()=>{console.log('devserverlisteningonport5000');});在package.json中,我们添加两个脚本"scripts":{"start":"nodewebpack/dev-server.js","build":"npxwebpack--configwebpack/webpack.prod.js",},这样我们就可以在命令行中输入两个命令npmrunstart:进入开发模式npmrunbuild:打包生产环境代码,基本上我做的脚手架就介绍完了。要了解它,您需要自己尝试一下。看到它是一回事,但它是另一回事。向别人解释就更难了。路漫漫其修远兮,任重而道远。酒吧。github地址:https://github.com/501351981/...这个脚手架不算完美,但基本够用了。后面会再做几个脚手架,比如多页面开发或者结合vue的移动端H5开发,有兴趣的可以继续关注。