webpack高级配置

1.HTML中img标签的图片资源处理

使用时、只需要在html中正常引用图片即可、webpack就会找到对应的资源进行打包、并修改html中的引用路径

主要是将html中的img路径文件进行打包、和copy-webpack-plugin是有区别的、copy-webpack-plugin主要是拷贝一些资源文件

项目中的图片资源都使用html-withimg-loader

项目中的音频、视频等资源文件使用copy-webpack-plugin

  1. 安装

    npm i -S html-withimg-loader
  2. 配置 loader

    {
    test:/\.(htm|html)$/,
    loader: 'html-withimg-loader'
    }

2.多页应用打包

虽然SPA大行其道、但是多页应用还是非常重要的

  1. 修改配置文件

    entry:{
    index: './src/index.js',
    other: './src/other.js'
    },
    output: {
    path: path.join(__dirname, 'dist'),
    // filename:'bundle.js',
    filename:'[name].js',
    publicPath: '/'
    },
    plugins:[
    // new HtmlWebpackPlugin({
    // filename: 'index.html',
    // template: './src/index.html'
    // }),
    new HtmlWebpackPlugin({
    filename: 'index.html',
    template: './src/index.html',
    chunks:['index']
    }),
    new HtmlWebpackPlugin({
    filename: 'other.html',
    template: './src/other.html',
    chunks:['other']
    })
    ],

3.第三方库的两种引入方式

可以通过 expose-loader 进行全局变量的注入、同时也可以使用内置插件 webpack.ProvidePlugin 对每个模块的闭包空间注入一个变量,自动加载模块,而不必到处import或require

  • expose-loader

    将库引入到全局作用域

    1. 安装

      npm i -D expose-loader
    2. 配置loader

      module:{
      rules:[
      {
      test: require.resolve('jquery'),
      use:{
      loader: 'expose-loader',
      options: '$'
      }
      }
      ]
      }

      require.resolve 用来获取模块的绝对路径、所以这里的loader只会作用于jq模块并且只有在bundle中使用它时才会进行处理

  • webpack.ProvidePlugin

    将库自动加载到每个模块

    1. 引入webpack

      const webpack = require('webpack')
    2. 配置

      plugins:[
      new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery'
      })
      ]

4.区分环境配置文件打包

项目开发时一般需要使用两套配置文件、用于开发阶段打包(不压缩代码、不优化代码增加效率)和上线阶段打包(压缩代码、优化代码,打包后直接上线使用)

  • 需要安装 webpack-merge

    npm i -D webpack-merge
  • 抽取三个配置文件

    • webpack.base.js
    • webpack.prod.js
    • webpack.dev.js
  • 实现步骤

    1. 将开发环境和生产环境公用的配置放入base中,不同的配置内容放置到各自的prod或者dev文件中,如mode
    2. 在dev和prod中使用 webpack-merge 把自己的配置和base的配置进行合并后导出
    3. 将package.json中的脚本参数进行修改,通过 —config 手动指定特定的配置文件
  • webpack配置的路径问题

Webpack 配置时,相对路径都是相对于根目录的,绝对路径就是配置文件所处的文件目录,因此在将配置文件放置的不是在根目录的时候,需要注意绝对路径是否以根目录为参照的

5.定义环境变量

除了区分不同的配置文件进行打包、还需要在开发时知道当前的环境时开发阶段还是上线阶段、所以可以借助内置插件DefinePlugin来定义环境变量、最终可以实现开发阶段和上线阶段的区分

  1. 引入webpack

    const webpack = require('webpack')
  2. 创建插件对象并定义环境变量

    需要注意 DefinePlugin 设置的值是一个表达式,

    IS_DEV: 'true'是设置IS_DEV为boolean类型的true

    number: '1 + 1'是设置number为2,因为是一个表达式,所以'1 + 1'会进行运算将得到的值赋值给健string: '"设置字符串的值"',设置字符串的值需要多嵌套一层引号

    variables: 'textVar'代表的是将textVar变量的值设置给variables,而不是将textVar作为字符串赋值给variables

    plugins:[
    new webpack.DefinePlugin({
    IS_DEV: 'true',
    number: '1 + 1',
    string: '"设置字符串的值"',
    variables: 'textVar'
    })
    ]
  3. 在src打包的代码环境下可以直接使用

    console.log('我是index  js', IS_DEV, number, string)

必懂的webpack高级配置的更多相关文章

  1. 【Webpack】373- 一看就懂之 webpack 高级配置与优化

    本文原载于 SegmentFault 社区专栏 前海拾贝 作者:JS_Even_JS 一.打包多页面应用 所谓打包多页面,就是同时打包出多个 html 页面,打包多页面也是使用 html-webpac ...

  2. 必懂的wenpack优化

    webpack优化 1.production 模式打包自带优化 tree shaking tree shaking是一个术语.通常用于打包时移除js中未引用的代码(dead-code),它依赖于ES6 ...

  3. webpack详细配置解析

    阅读本文之前,先看下面这个webpack的配置文件,如果每一项你都懂,那本文能带给你的收获也许就比较有限,你可以快速浏览或直接跳过:如果你和十天前的我一样,对很多选项存在着疑惑,那花一段时间慢慢阅读本 ...

  4. [转帖]K8s 工程师必懂的 10 种 Ingress 控制器

    K8s 工程师必懂的 10 种 Ingress 控制器 https://www.kubernetes.org.cn/5948.html 控制器有好多啊. 2019-10-18 23:07 中文社区 分 ...

  5. webpack常用配置总结

    1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...

  6. vim的一些高级配置

    今天有幸看到一篇博文,有一些vim的高级配置 在linux或者unix下面的.vimrc文件中,在其中可以添加如下片段,可以实现解释上面你说的那些高级用法 " Ctrl + K 插入模式下光 ...

  7. webpack快速入门——实战技巧:webpack模块化配置

    首先在根目录,新建一个webpack_config文件夹,然后新建entry_webpack.js文件,代码如下: const entry ={}; //声明entry变量 entry.path={ ...

  8. webpack基础配置

    webpack运行规则: Webpack 会给每个模块分配一个唯一的id并通过这个id索引和访问模块.在页面启动时,会先执行入口文件中的代码,其它模块会在运行 require 的时候再执行. 运行时主 ...

  9. webpack环境配置2

    1.webpack安装 Step 1: 首先安装Node.js, 在1中已经详细介绍了. Step2: 在Git或者cmd中输入下面这段代码, 通过全局先将webpack指令安装进电脑中npm ins ...

随机推荐

  1. 为了考PMP,我做了一个刷题小程序

    一.背景 1.我是一名软件工程师,技术出身,担任开发组长,对项目管理不是很熟,所以决定系统学习下项目管理. 2.全球最适合的项目管理学习课程就是PMP,每年有4次PMP考试,证书还是很有含金量的. 3 ...

  2. SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -2(虚拟IP视角)

    1.需求描述 我们知道Windows Cluster 都是多节点的,当虚拟IP漂移的时候,一般都是从一个节点漂移到另外一个节点.如果可以及时捕捉到旧节点信息是什么.新节点信息是什么对我们提供高可用的数 ...

  3. Laravel --- 自动生成数据

    1.创建填充文件:php artisan make:seeder UserTableSeeder 2.在run方法里面写填充数据的代码: use Illuminate\Database\Seeder; ...

  4. Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统

    Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...

  5. memcached--add使用

    memcached是一种管理内存的软件,来动态的分配机器的内存,将需要存储的数据以key-value(键值对)的形式存储在内存中. 1.memcached使用的存储算法是hash算法在内存中存储字符串 ...

  6. 半小时学会V语言

    半小时学会V语言 1. V语言简介 V是一个静态类型.编译型的编程语言,目标是构建可维护软件.与Go语言相似,并受Oberon,Rust和Swift语言影响.V语言非常简单,只需要半小时就能学会这门语 ...

  7. 01(b)无约束优化(准备知识)

    1.解方程转化为优化问题 $n\left\{ \begin{aligned}& {{P}_{1}}(x)=0 \\ & {{P}_{2}}(x)=0 \\ & \text{   ...

  8. 数字IC前后端设计中的时序收敛(三)--Hold违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...

  9. Java连载5-标识符、关键字和字面值

    一.标识符 1.标识符定义:在java源程序中凡是可以自己命名的单词 2.标识符可以标识什么元素? (1)类名(2)方法名(3)变量名(4)接口名(5)常量名 等等 3.标识符的命名要求 (1)一个合 ...

  10. Redis+Twemproxy分片存储实现

    from unsplash 为提高Redis存储能力的提升,以及对外提供服务可用性提升,有时候有必要针对Redis进行集群式搭建,比较常用的有Twemproxy分片存储以及官方提供的Cluster方式 ...