详解在vue-cli3.0中自定css、js和图片的打包路径


Posted in Javascript onAugust 26, 2019

前言

我们有时候因为一些特殊需求,可能需要将js/css/img等资源文件都打包到根路径下,但vue-cli3.0的路径配置中仅有 assetsDir配置项能够配置所有的静态文件所在的文件夹,并不能针对css/js/img等资源文件分别来做设置,那么请看我如何尝试的吧!

分析

众所周知,vue-cli3.0使用了webpack进行打包处理,那么我们是否可以拿到目前打包默认的一些webpack配置,并在这些配置中找到一些蛛丝马迹,从而更改配置来实现对打包路径的更改呢?

好在vue-cli3.0提供了这样的功能!

我假设您已经安装了vue-cli3.0,那么打开命令行,运行一下命令:

vue ui

这个命令将会启动一个页面,用来简化开发过程中的一系列操作。

我们先导入当前项目(自己摸索下,此处不展开详说)。

我们进入<任务>页面,点击inspect选项卡,并点击运行按钮,将会得到该项目下所有的webpack配置项。

将这个配置复制到我们的编辑器中,然后我们查找路径'js/', 'css/', 'img/',将会看到这些路径所配置的一些地方,我的项目中这些配置在以下部分:

output配置为:

output: {
  path: 'xxx',
  filename: 'js/[name].[contenthash:8].js',
  publicPath: '',
  chunkFilename: 'js/[name].[contenthash:8].js'
}

plugin配置为:

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

loader配置为:

/* config.module.rule('images') */
{
  test: /\.(png|jpe?g|gif|webp)(\?.*)?$/,
  use: [
    /* config.module.rule('images').use('url-loader') */
    {
    loader: 'url-loader',
    options: {
      limit: 4096,
      fallback: {
      loader: 'file-loader',
      options: {
        name: 'img/[name].[hash:8].[ext]'
      }
      }
    }
    }
  ]
},
/* config.module.rule('svg') */
{
  test: /\.(svg)(\?.*)?$/,
  use: [
    /* config.module.rule('svg').use('file-loader') */
    {
    loader: 'file-loader',
    options: {
      name: 'img/[name].[hash:8].[ext]'
    }
    }
  ]
},

// 其他类型资源的loader等等

那么问题就简单了,我们更改掉这些webpack配置就可以了。

更改webpack配置

需要更改的webpack相关配置如下:

js路径配置更改

js路径更改output配置即可,output配置在configureWebpack配置项中进行更改,因为vue.config.js中对于configureWebpack选项的配置将会被merge到webpack配置中,所以更改该项配置即可,如下:

module.exports = {
  configureWebpack: config => {
    // js output config
    config.output.filename = '[name].[contenthash:8].js'
    config.output.chunkFilename = '[name].[contenthash:8].js'

  },
}

更改MiniCssExtractPlugin插件配置

更改该配置需要先安装MiniCssExtractPlugin插件到开发依赖中,如下:

npm install --save-dev mini-css-extract-plugin
# 或者
yarn add mini-css-extract-plugin --dev

然后在vue.config.js文件中添加相关配置到chainWebpack即可,如下所示:

module.exports = {
  chainWebpack: config => {
    // css output config
    let miniCssExtractPlugin = new MiniCssExtractPlugin(
      {
        filename: '[name].[contenthash:8].css',
        chunkFilename: '[name].[contenthash:8].css'
      }
    )
    config.plugin('extract-css').use(miniCssExtractPlugin)
  },
}

更改各种资源loader配置

更改该配置仍然需要将相关配置添加到chainWepack配置项中,如下:

module.exports = {
  chainWebpack: config => {
    // image output config
    config.module.rule('images')
      .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
      .use('url-loader')
      .loader('file-loader')
      .options({
        name: '[name].[hash:8].[ext]'
      })
    config.module.rule('svg')
      .test(/\.(svg)(\?.*)?$/)
      .use('file-loader')
      .loader('file-loader')
      .options({
        name: '[name].[hash:8].[ext]'
      })
  },
}

结语

总的配置项如下所示:

module.exports = {
  configureWebpack: config => {
    // js output config
    config.output.filename = '[name].[contenthash:8].js'
    config.output.chunkFilename = '[name].[contenthash:8].js'

  },
  chainWebpack: config => {
    // css output config
    let miniCssExtractPlugin = new MiniCssExtractPlugin(
      {
        filename: '[name].[contenthash:8].css',
        chunkFilename: '[name].[contenthash:8].css'
      }
    )
    config.plugin('extract-css').use(miniCssExtractPlugin)

    // image output config
    config.module.rule('images')
      .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
      .use('url-loader')
      .loader('file-loader')
      .options({
        name: '[name].[hash:8].[ext]'
      })
    config.module.rule('svg')
      .test(/\.(svg)(\?.*)?$/)
      .use('file-loader')
      .loader('file-loader')
      .options({
        name: '[name].[hash:8].[ext]'
      })

  },
}

这时,在运行inspect检查webpack配置,即可看到相关路径前的css/,js/,img/等前缀已经消失,快快打包尝试吧!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript自动显示最后更新时间
Mar 15 Javascript
类之Prototype.js学习
Jun 13 Javascript
javascript jQuery插件练习
Dec 24 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
Jquery焦点与失去焦点示例应用
Jun 10 Javascript
jquery实现对联广告的方法
Feb 05 Javascript
JavaScript实现的encode64加密算法实例分析
Apr 15 Javascript
元素绑定click点击事件方法
Jun 08 Javascript
使用js复制链接中的部分文字的方法
Jul 30 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
Oct 30 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
May 08 Javascript
微信小程序实现手势滑动效果
Aug 26 #Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 #Javascript
Vue路由之JWT身份认证的实现方法
Aug 26 #Javascript
Vue中跨域及打包部署到nginx跨域设置方法
Aug 26 #Javascript
js实现跟随鼠标移动的小球
Aug 26 #Javascript
vue 源码解析之虚拟Dom-render
Aug 26 #Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 #Javascript
You might like
PHP注释实例技巧
2008/10/03 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
三种php连接access数据库方法
2013/11/11 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php上传文件问题汇总
2015/01/30 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Python如何在bool函数中取值
2020/09/21 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
运动会通讯稿200字
2014/02/16 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
创意婚礼策划方案
2014/05/18 职场文书
冬季安全检查方案
2014/05/23 职场文书
会计学专业求职信
2014/07/17 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
销售业务员岗位职责
2015/02/13 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL