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

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

手动配置

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

示例的文件目录如下:

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的配置,虽然只是几行代码的问题,而且基本上都是复制粘贴没什么难度,但毕竟代码再少也需要过问,并且需要改的地方比较多,仓促之下可能还会遗漏,要是能一劳永逸,写一遍代码,无论以后增删页面都不需要过问就好了。

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

每个页面都是 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配置进行手动修改了,虽然开始时开起来似乎这种动态的自动配置代码比较多,而且稍微复杂一点,但是从长期来看,绝对是一劳永逸的好做法。

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

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

相关文章:

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

  1. webpack静态资源地址注入html,Webpack4+ 多入口程序构建

    欢迎关注富途web开发团队,缺人从众 其实,说实话这篇文章的由来也是有很多的原因在里面的.在这之前,我也做过不少的项目.有新的项目,也有旧的项目.通过对旧项目的不断研究,改进.再结合自己的理解,将新的 ...

  2. webpack学习笔记(三):监听文件变化并编译

    在上一篇webpack学习笔记中主要认识了webpack配置文件中相关的基础配置和命令的执行.这次学习如何在文件发生变化时自动打包编译. 首先,我们来看一下配置文件 const path = requ ...

  3. css文件如何设置scss,Webpack - 如何将scss编译成单独的css文件?

    2 个答案: 答案 0 :(得分:3) 这是我在尝试将css编译成单独文件时使用的webpack.config.js文件 |-- App |-- dist |-- src |-- css |-- he ...

  4. woff字体文件怎么用到html,【webpack】font-awesome加载不到woff字体文件

    开发环境:Webpack + React 好几个使用了Font-awesome字体文件的项目中都遇到同一个问题,在本地测试的时候,使用webpack开发服务器,字体图标无法正常显示. 通过Chrome ...

  5. 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称...

    出现这个错误的原因是:windows10中,你的webpack是局部安装的,并没有加入到系统环境变量中,所以控制台找不到webpack命令,有以下方法可以解决: 第一种方法(个人比较喜欢这种),找到项 ...

  6. webpack从入门到精通(四)优化打包配置总结②

    1. tree shaking tree-shaking的本质是消除无用的js代码.无用代码消除广泛存在于传统的编程语言编译器中,编译器可以判断出某些代码根本不影响输出,然后消除这些代码,这个称之为D ...

  7. (23/24) webpack实战技巧:如何在webpack环境中使用Json

    (23/24) webpack实战技巧:如何在webpack环境中使用Json 在webpack1或者webpack2版本中,若想在webpack环境中加载Json文件,则需要加载一个json-loa ...

  8. 玩转webpack(一)下篇:webpack的基本架构和构建流程

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:QQ会员技术团队 接玩转webpack(一)上篇:webpack的基本架构和构建流程 文件生成阶段 这个阶段的主要内容,是根据 chun ...

  9. vue webpack 自动打开页面_vue中webpack技术详解

    1.为什么要使用webpack: 因为我们想把资源整合.如在项目index.html文件中为了请求变得更少我们可以新建一个叫main.js的项目入口文件(里面有引用其它的各种资源,而index.htm ...

最新文章

  1. iBatis 配置文件详解
  2. 解决C#导出excel异常来自 HRESULT:0x800A03EC的方法 .
  3. 重温java中的String,StringBuffer,StringBuilder类
  4. php smarty fetch,fetch()
  5. 两台服务器虚拟成一个ip地址,两台服务器如何用一个ip地址
  6. UBUNTU : Destination Host Unreachable
  7. passport身份验证_了解如何使用Passport.js处理Node身份验证
  8. 杉岩数据:5种常见容灾复制技术图解
  9. jquery[学习心得]ajax的注意点
  10. ISA 2006 服务器 (一)
  11. perl脚本 linux,linux – 通过Perl脚本设置环境变量
  12. 将Firefox浏览器的Google工具栏拖动到浏览器底部
  13. 一文搞懂 | Linux 同步管理(上)
  14. linux 无法生成图片大小,简单点。表演()在Linux上的ImageJ中生成错误
  15. SDKMAN因为网络问题用不了怎么办?
  16. SuperMap webgl 中使用的gltf模型制作方法
  17. 算法_数学问题_Question10_马克思手稿中的数学(java实现)
  18. 尼日利亚一油罐车发生爆炸 造成数十人遇难
  19. 男生可以把女生的裤袜当秋裤穿吗?
  20. 浅谈一下汽车行业中的OTA/FOTA/SOTA

热门文章

  1. Vue全家桶 之 Vue基础
  2. 小程序开发(5)-之封装组件
  3. 读取扫码枪输入_为何超市“扫码枪”这么强?不输密码钱就没了,现在知道还不晚...
  4. C语言 #include <> 与 #include “” 区别 - C语言零基础入门教程
  5. jq(jquery)之点击隐藏段落
  6. linux+守护进程+php,【转载】Linux 守护进程的编程方法
  7. vim复制、删除和粘贴一行
  8. matlab 计算汉明距_matlab实现滑动平均滤波
  9. asp php 用户登录,一个简单的asp.net 单点登录实现
  10. 创建数组_如何创建数组