当前位置: 首页 > news >正文

[Vue CLI 3] 配置解析之 css.extract

大家还记得我们在老版本中,对于线上环境配置中会把所有的 css 多打成一个文件

核心是使用了插件 extract-text-webpack-plugin,方式如下:

第一步都是加载插件

const ExtractTextPlugin = require('extract-text-webpack-plugin')

这个插件的描述如下:

Extract text from a bundle, or bundles, into a separate file.

然后配置如下:(省去了 rules 相关的配置)

一般配置 filename 来保证最终生成的 css 文件名

plugins: [
  new ExtractTextPlugin({
      filename: utils.assetsPath('css/[name].[contenthash].css')
  })
]

我们可以预先用 vue inspect --plugin extract-css 看看最终生成的配置:

/* config.plugin('extract-css') */
new MiniCssExtractPlugin(
  {
    filename: 'css/[name].[contenthash:8].css',
    chunkFilename: 'css/[name].[contenthash:8].css'
  }
)

在文件 @vue/cli-service/lib/config/css.js 中:

最开始需要获取 vue.config.js 里面配置的 css.extract

const isProd = process.env.NODE_ENV === 'production'

const {
  extract = isProd
} = options.css || {}

设置一个变量 shouldExtract

const shadowMode = !!process.env.VUE_CLI_CSS_SHADOW_MODE
const shouldExtract = extract !== false && !shadowMode

如果变量 shouldExtract 为 true,调用 plugin 方法来生成一个插件配置:

这里依赖的插件为 mini-css-extract-plugin

if (shouldExtract) {
      webpackConfig
        .plugin('extract-css')
          .use(require('mini-css-extract-plugin'), [extractOptions])
}

filename 内部也有一个判断过程,如果设置了 filenameHashing,它默认是 true:

filenameHashing: true

类型为 boolean:

filenameHashing: joi.boolean()
const filename = getAssetPath(
      options,
      `css/[name]${options.filenameHashing ? '.[contenthash:8]' : ''}.css`
    )

处理 filename 之后,插件还有一个配置项:chunkFilename

下面就是通过 Object.assign 来生成 extractOptions

const extractOptions = Object.assign({
      filename,
      chunkFilename: filename
    }, extract && typeof extract === 'object' ? extract : {})

相关文章:

  • 如何实现360度的手游安全防护?网易云易盾专家分享最新实践
  • 读入优化摸板
  • 有用的生活有关的website
  • 安卓学习阶段的回顾整理
  • ACM-ICPC 2018 焦作赛区网络预赛 A Magic Mirror(签到)
  • Python - 闭包Closure
  • 什么是注入点
  • 网易云易盾关于极验所述问题的致歉和说明
  • workflow的简介
  • Navicat Premium
  • 在python中安装basemap
  • 开拓创新,这才是该做的事情
  • 区块链技术,存在即合理,躺着就赚钱?
  • ppwjs之bootstrap文字排版:abbr元素 -- 创建缩写元素 和 到缩写元素
  • 如何在CentOS 6或7服务器上安装Cuberite
  • 30天自制操作系统-2
  • Computed property XXX was assigned to but it has no setter
  • download使用浅析
  • egg(89)--egg之redis的发布和订阅
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Invalidate和postInvalidate的区别
  • javascript数组去重/查找/插入/删除
  • ng6--错误信息小结(持续更新)
  • PHP CLI应用的调试原理
  • 分享几个不错的工具
  • 工程优化暨babel升级小记
  • 缓存与缓冲
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 通过npm或yarn自动生成vue组件
  • 一个JAVA程序员成长之路分享
  • 移动端 h5开发相关内容总结(三)
  • 用Visual Studio开发以太坊智能合约
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #git 撤消对文件的更改
  • #pragma multi_compile #pragma shader_feature
  • #宝哥教你#查看jquery绑定的事件函数
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (a /b)*c的值
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (LeetCode C++)盛最多水的容器
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)jdk与jre的区别
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NetCore部署微服务(二)
  • .NET连接数据库方式
  • /etc/fstab 只读无法修改的解决办法
  • ;号自动换行
  • @RunWith注解作用