webpack 入口文件 php,如何实现webpack多入口文件打包配置

本篇文章主要介绍了webpack多入口文件页面打包配置详解,现在分享给大家,也给大家做个参考。

大多数情况下,我们使用 webpack来打包单页应用程序,这个时候只需要配置一个入口,一个模板文件,但也不尽是如此,有时候也会碰到多页面的项目,而且以我的经验来看,这种情况出现的频率还不低,例如项目比较大,无法进行全局的把握,或者项目需要多次的更新迭代等,都适合做成多页面程序,这就涉及到了 webpack的多页面文件的打包配置问题。

手动配置

单页应用程序和多页应用程序的 webpack配置文件其实绝大部分都还是相同的,只不过多页的配置需要在单页配置的基础上顾及到多个页面罢了,loader、output、plugins这些基本都不需要改动,需要改动的一般都是入口文件 entry,如果你用到了 抽离css样式的插件 extract-text-webpack-plugin、自动模板插件 html-webpack-plugin的话,那么还需要对这两个插件进行额外的改写,大多数情况下,我们也都只需要改动这三个地方,所以本文就只简单说下这三个位置,如果在实际的项目中还有其他的地方需要改动,参照这三个位置即可。

示例的文件目录如下:

169c2434fe9c4bfdeb714bb755132095.png

entry

单页应用程序的入口配置一般如下所示:entry: resolve(__dirname, "src/home/index.js")

这个配置就是指定 webpack从 /src/home/index.js这个文件开始进入,进行一系列的打包编译过程。

如果是多页应用程序,则需要多个入口文件,例如:entry: {

home: resolve(__dirname, "src/home/index.js"),

about: resolve(__dirname, "src/about/index.js")

}

这样,整个项目就有了两个入口 home和 about

extract-text-webpack-plugin

extract-text-webpack-plugin 插件主要是为了抽离css样式,防止将样式打包在 js中引起页面样式加载错乱的现象,单页程序中,一般这样使用此插件:plugins: [

new ExtractTextPlugin('style.[contenthash].css')

]

而到了多页程序,因为存在多个入口文件以及对应的多个页面,每个页面都有自己的 css样式,所以需要为每个页面各自配置一下:plugins: [

new ExtractTextPlugin('home/[name].[contenthash].css'),

new ExtractTextPlugin('about/[name].[contenthash].css')

]

除此之外还需要注意一点,每个页面也只需要自己的 css样式,理论上把别的页面 css样式文件也打包到自己的页面中当然也是可以的,但显然是不合理的,这只会增加冗余代码,还可能会导致不可预测的样式覆盖等问题,所以需要对下面这种 loader配置进行修改:{

test: /\.css$/,

loader: 'style!css!autoprefixer'

},

{

test: /\.scss$/,

loaders: [

'style',

'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',

'sass',

'autoprefixer'

]

},

上面的配置会把所有编译出来的 css文件打包到同一个文件中,我们要做的就是把这些 css分离开,每个页面都有各自单独的 css样式文件:// 为每个页面定义一个 ExtractTextPlugin

const homeExtractCss = new ExtractTextPlugin('home/[name].[contenthash].css')

const aboutExtractCss = new ExtractTextPlugin('about/[name].[contenthash].css')

// ...

module: {

rules: [

// 每个页面的 ExtractTextPlugin 只处理这个页面的样式文件

{

test: /src(\\|\/)home(\\|\/)css(\\|\/).*\.(css|scss)$/,

use: homePageExtractCss.extract({

fallback: 'style-loader',

use: ['css-loader', 'postcss-loader', 'sass-loader']

})

},

{

test: /src(\\|\/)about(\\|\/)css(\\|\/).*\.(css|scss)$/,

use: salePersonalCenterExtractCss.extract({

fallback: 'style-loader',

use: ['css-loader', 'postcss-loader', 'sass-loader']

})

}

]

}

// ...

// 每个页面都有各自的 ExtractTextPlugin,所以需要都声明一遍

plugins: [

homeExtractCss,

aboutExtractCss

]

html-webpack-plugin

html-webpack-plugin插件的使用,在单页应用程序和多页应用程序中的 webpack配置没什么区别new HtmlWebpackPlugin({

filename: 'home/home.html',

template: 'src/home/html/index.html',

inject: true,

minify: {

removeComments: true,

collapseWhitespace: true

}

})

new HtmlWebpackPlugin({

filename: 'about/about.html',

template: 'src/about/html/index.html',

inject: true,

minify: {

removeComments: true,

collapseWhitespace: true

}

})

有几个页面,就对每个页面进行上述配置即可。

自动配置

上述的配置代码已经可以满足多页面开发需求了,但是有一点似乎有些遗憾,那就是每增加一个页面,就需要更新一遍 entry、extract-text-webpack-plugin、HtmlWebpackPlugin的配置,虽然只是几行代码的问题,而且基本上都是复制粘贴没什么难度,但毕竟代码再少也需要过问,并且需要改的地方比较多,仓促之下可能还会遗漏,要是能一劳永逸,写一遍代码,无论以后增删页面都不需要过问就好了。

稍微观察下这个目录就可以发现,这个目录结构其实是很有规律的:

169c2434fe9c4bfdeb714bb755132095.png

每个页面都是 src/目录下的一个文件夹,这个文件夹中有两个子目录,分别存放这个页面的模板 html,样式文件 css,还有一个入口文件 index.js

既然有规则,那么肯定是可以进行程序编码的,如果按照这种规则,每个页面都是 ./src下的一个目录,目录名即为页面名,并且这个目录中的结构也都是相同的,那么可以通过一个通用方法来获取所有的页面名称(例如 home、about),这个通用方法的一个示例如下:function getEntry () {

let globPath = 'src/**/html/*.html'

// (\/|\\\\) 这种写法是为了兼容 windows和 mac系统目录路径的不同写法

let pathDir = 'src(\/|\\\\)(.*?)(\/|\\\\)html'

let files = glob.sync(globPath)

let dirname, entries = []

for (let i = 0; i < files.length; i++) {

dirname = path.dirname(files[i])

entries.push(dirname.replace(new RegExp('^' + pathDir), '$2'))

}

return entries

}

借助 glob这个库,遍历 .src/目录下具有这种规律 src/**/html/*.html的子目录,通过正则匹配出这个子目录的名称

获取到了所有的页面名称,下面就好办了。

entry// entry: resolve(__dirname, "src/home/index.js")

// 改为

entry: addEntry()

//...

function addEntry () {

let entryObj = {}

getEntry().forEach(item => {

entryObj[item] = resolve(__dirname, 'src', item, 'index.js')

})

return entryObj

}

extract-text-webpack-plugin// plugins: [

// new ExtractTextPlugin('home/[name].[contenthash].css'),

// new ExtractTextPlugin('about/[name].[contenthash].css')

//]

// 改为

const pageExtractCssArray = []

getEntry().forEach(item => {

pageExtractCssArray.push(new ExtractTextPlugin(item + '/[name].[contenthash].css'))

})

// ...

plugins: [...pageExtractCssArray]

module.rules样式相关的两个loaders删掉,改为动态添加:getEntry().forEach((item, i) => {

webpackconfig.module.rules.push({

test: new RegExp('src' + '(\\\\|\/)' + item + '(\\\\|\/)' + 'css' + '(\\\\|\/)' + '.*\.(css|scss)$'),

use: pageExtractCssArray[i].extract({

fallback: 'style-loader',

use: ['css-loader', 'postcss-loader', 'sass-loader']

})

})

})

// ...

module.exports = webpackconfig

html-webpack-plugin

plugins中无需手动初始化 html-webpack-plugin,改为动态添加:getEntry().forEach(pathname => {

let conf = {

filename: path.join(pathname, pathname) + '.html',

template: path.join(__dirname, 'src', pathname, 'html', 'index.html')

}

webpackconfig.plugins.push(new HtmlWebpackPlugin(conf))

})

// ...

module.exports = webpackconfig

完成了上述修改后,以后无论是在项目中添加页面还是删除页面,都无需再对 webpack配置进行手动修改了,虽然开始时开起来似乎这种动态的自动配置代码比较多,而且稍微复杂一点,但是从长期来看,绝对是一劳永逸的好做法。

另外,如果你的项目目录结构和我示例的目录结构不一样,那么就需要你根据自己的目录结构对代码进行少许的修改,但整体解决问题的方法是不变的,一个易于维护的项目,目录结构都该是有律可循的。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口里面的方法都是抽象方法吗_大家都在讲高中学习的方法有哪些,那方法和技巧有什么异同的吗?...

大家都在讲高中学习的方法有哪些&#xff0c;那方法和技巧有什么异同吗&#xff1f;高中怎样学习&#xff0c;方法重要还是技巧更重要&#xff1f;老牛倒是觉得&#xff0c;二者密不可分&#xff0c;缺一不可。那么&#xff0c;我们一起来看看&#xff0c;高中怎样学习才是最好…

python 笔试题 英方_4000字转型数据分析师笔试面试经验分享

大家好&#xff0c;我是戴师兄~在上一篇文章中我分享了快速自学数据分析的经验。本篇文章&#xff0c;我将跟大家分享下我的笔试和面试心得。开头先说说我转型前的职业背景&#xff1a;想看笔试面试经验的同学萌可以直接跳过这一段~2018年我从中国人民大学经济管理学专业毕业&a…

android 抓取webview中的所有图片_如何一键提取PDF文档中的所有图片?

原标题&#xff1a;如何一键提取PDF文档中的所有图片&#xff1f;目前PDF文档被大家广泛应用&#xff0c;主要是因为PDF文档在传输和转换的过程中比较稳定&#xff0c;所以PDF格式几乎是办公文件格式的首选。大家都知道PDF文档转换格式以及编辑都需要专门的PDF编辑器来实现。但…

php shell 交互,通过 Tinker 实现 Laravel 命令行交互式 Shell

通过 Tinker 实现 Laravel 命令行交互式 Shell由 学院君 创建于2年前, 最后更新于 1年前版本号 #19508 views4 likes0 collectsREPL 与 PsySHLaravel 自带了一个功能强大的 REPL —— Tinker&#xff0c;所谓 REPL&#xff0c;是 Read–Eval–Print-Loop 的缩写&#xff0c;这是…

戴尔电脑好还是华为好_华硕和戴尔笔记本哪种好 华硕和戴尔优缺点分析【详解】...

随着时代快速的发展&#xff0c;笔记本电脑已经成了我们生活中的标配。如今&#xff0c;市面上笔记本电脑的款式众多&#xff0c;相信大家对华硕和戴尔并不陌生吧&#xff01;那么&#xff0c;我们该怎么去选择呢&#xff1f;今天小编就给大家介绍华硕和戴尔笔记本哪个好&#…

电脑扫描二维码_线上分享 | 网络工作坊:平板电脑工作术

澳门生产力暨科技转移中心将于9月29日下午3时&#xff0c;举办资讯科技工具应用线上工作坊&#xff0c;讲解平板电脑办公应用&#xff0c;欢迎有兴趣人士报名&#xff0c;名额有限&#xff0c;先到先得。该中心早前已举办是次主题的应用工作坊&#xff0c;坊间反应积极&#xf…

数据库设置_CentOS7 - 设置MySQL数据库

设置MySQL数据库本文介绍如何在CentOS上执行流行的MySQL数据库服务器的基本安装。 MySQL是当今使用最广泛的数据库系统&#xff0c;它可以在许多不同的行业中找到&#xff0c;为动态网站和大型数据仓库等各种产品提供数据存储。准备此配方要求CentOS系统具有有效的网络连接和管…

提出离职后怎么定last day_不管你因为什么离职,用正规的离职方式是你最正确的选择!...

#不管你是因为什么离职&#xff0c;用正规的离职方式离职是你最正确的选择&#xff0c;如果因为不恰当的方式造成与公司的矛盾&#xff0c;可能让你今后会非常被动。书面离职是最具有法律效力的&#xff0c;按照劳动法&#xff0c;你有权在提出正式离职一个月后走人&#xff0c…

人脸识别代码_10行代码实现人脸识别

什么是人脸识别人脸识别&#xff0c;是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流&#xff0c;并自动在图像中检测和跟踪人脸&#xff0c;进而对检测到的人脸进行脸部识别的一系列相关技术&#xff0c;通常也叫做人像识…

ticketvalidationexception票根不符合目标服务_如何在有效降低企业仓储成本的同时不降低企业的总体服务质量目标水平?...

对于企业而言&#xff0c;如何降低仓储成本&#xff0c;同时要保证物流总成本最低和不降低企业的总体服务质量和目标水平的前提下进行&#xff0c;常见的措施有以下几点&#xff1a;一用“先进先出方式&#xff0c;减少仓储物的保管风险。”先进先出是储存管理的准则之一&#…

python科学计算_可视化图解Python科学计算包NumPy

NumPy包是python生态系统中数据分析、机器学习和科学计算的主力。 它极大地简化了向量和矩阵的操作。Python的一些主要软件包依赖于NumPy作为其基础架构的基础部分&#xff08;例如scikit-learn、SciPy、pandas和tensorflow&#xff09;。我们将介绍一些使用NumPy的主要方法&am…

php 导出excel 特殊字符,PHPEXCEL导出,存在特殊字符遇到的问题

[13] > Array([payment_success_at] >[user_name] > ?.琳琳?[remarks] >[product_name] > 香菇[sku_name] > 斤[product_property] > 斤[price_original] > 5.50[price_current] > 5.50[consignee] > ?.琳琳?)以上代码中用户名中存在特殊符号…

win10任务栏怎么还原到下面_详解:新版 WIN 10 V2004 任务栏和开始菜单全透明

是不是很酷炫&#xff1f;继续往下看&#xff0c;你也可以简单做到导语本文将告诉你如何借助一个小工具&#xff0c;将最新版 WIN 10 开始菜单和任务栏设置成全透明&#xff0c;以获得超酷的视觉体验。安装和设置都很简单&#xff0c;关键是一定要找到适合 WIN 10 版本的 Start…

10.8.8.8柠檬wifi网页登录_基于企业邮箱进行wifi实名认证的方案

之前我们介绍过如何用钉钉认证和企业微信认证来实现企业内部的实名上网认证。此外邮箱认证也是企业进行wifi实名认证的一个有效手段。因为很多企业都给员工开通了企业邮箱&#xff0c;直接让员工输入邮箱账号和密码进行认证上网。配置、使用和维护都相对比较简单。本文我将介绍…

php tire树,Immutable.js源码之List 类型的详细解析(附示例)

本篇文章给大家带来的内容是关于Immutable.js源码之List 类型的详细解析(附示例)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。一、存储图解我以下面这段代码为例子&#xff0c;画出这个List的存储结构&#xff1a;let myL…

nodejs missing script: dev_nodejs深入学习系列之v8基础篇

V8这个概念大家都不陌生了&#xff0c;那么你动手编译过V8源码吗&#xff1f;编译后有尝试去了解V8背后的一些概念吗&#xff1f;如果没有&#xff0c;那么也不用心慌&#xff0c;下文将跟大家一一解释这些东西。在编译V8之前我们先要了解一个东西-构建系统1、构建系统1.1、构建…

cmos存储器中存放了_天津大学姚建铨院士,张雅婷副教授JMCC:具有宽光谱调控特性的阻变存储器...

【引言】存储器是计算机中数据存放的主要介质。随着5G时代到来&#xff0c;带动人工智能、物联网、智慧城市等应用市场发展并向存储器提出多样化需求&#xff0c;加上传统存储器市场价格变化等因素&#xff0c;新型存储器将在市场发挥越来越重要的作用。因此具有存储密度更高&a…

matlab转差频率控制,转差频率控制的异步电机调速系统的研究

1 引言交流变频调速的方法是异步电机最有发展前途的调速方法。随着电力电子技术、计算机技术和自动控制技术的不断发展&#xff0c;交流电机变频调速已经逐步取代直流电机调速&#xff0c;并经历了采用电压频率协调控制、转差频率控制、矢量控制以及直接转矩控制的发展过程。其…

oracle错误1327,Oracle中的PGA监控报警分析(r11笔记第97天)

最近接到一个数据库报警&#xff0c;让我颇有些意外&#xff0c;这是一个PGA相关的报警。听起来感觉是应用端的资源调用出了问题。报警内容大体如下&#xff1a;报警内容: PGA Alarm on alltest------------------------------------报警级别: PROBLEM------------------------…

php函数内的循环,PHP 循环列出目录内容的函数代码

PHP 循环列出目录内容的函数代码复制代码 代码如下:function list_files($dir){if(is_dir($dir)){if($handle opendir($dir)){while(($file readdir($handle)) ! false){if($file ! "." && $file ! ".." && $file ! "Thumbs.db&quo…