1. Webpack 是什么

  2. Vue CLI Webpack 相关

Webpack

更多参考官方文档

Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

如图,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。

本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

如果你还不熟悉 webpack,请阅读核心概念和打包器对比

安装

前提,本地支持 node.js
安装最新版本 npm install --save-dev webpack
如果你使用 webpack 4+ 版本,你还需要安装 CLI。 npm install --save-dev webpack-cli

对于大多数项目,我们建议本地安装。这可以使我们在引入破坏式变更(breaking change)的依赖时,更容易分别升级项目。通常,webpack 通过运行一个或多个 npm scripts,会在本地 node_modules 目录中查找安装的 webpack:

"scripts": {    "start": "webpack --config webpack.config.js"}

当你在本地安装 webpack 后,你能够从 node_modules/.bin/webpack 访问它的 bin 版本。

全局安装(不推荐) npm install --global webpack:不推荐全局安装 webpack。这会将你项目中的 webpack 锁定到指定版本,并且在使用不同的 webpack 版本的项目中,可能会导致构建失败。

核心概念

webpack 是高度可配置的。四个核心概念:

入口(entry) 输出(output) loader 插件(plugins)

入口(entry)

入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

每个依赖项随即被处理,最后输出到称之为 bundles 的文件中,我们将在下一章节详细讨论这个过程。

可以通过在 webpack 配置中配置 entry 属性,来指定一个入口起点(或多个入口起点)。默认值为 ./src。

接下来我们看一个 entry 配置的最简单例子:

webpack.config.js

module.exports = {  entry: './path/to/my/entry/file.js'};

根据应用程序的特定需求,可以以多种方式配置 entry 属性。可以了解更多配置方式。

出口(output)

output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你可以通过在配置中指定一个 output 字段,来配置这些处理过程:

webpack.config.js

const path = require('path');

module.exports = {  entry: './path/to/my/entry/file.js',  output: {    path: path.resolve(__dirname, 'dist'),    filename: 'my-first-webpack.bundle.js'  }};

通过 output.filename 和 output.path 属性,来告诉 webpack bundle 的名称,以及我们想要 bundle 生成(emit)到哪里。可能你想要了解在代码最上面导入的 path 模块是什么,它是一个 Node.js 核心模块,用于操作文件路径。

生成(emitted 或 emit) 是“生产(produced)”或“释放(discharged)”的特殊术语

更多 output 可配置的特性
更多 output 概念

loader

loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。

loader 能够 import 导入任何类型的模块(例如 .css 文件),这是 webpack 特有的功能,其他打包程序或任务执行器的可能并不支持。我们认为这种语言扩展是有很必要的,因为这可以使开发人员创建出更准确的依赖关系图。

在更高层面,在 webpack 的配置中 loader 有两个目标:

  1. test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。

  2. use 属性,表示进行转换时,应该使用哪个 loader。

webpack.config.js

const path = require('path');

const config = {  output: {    filename: 'my-first-webpack.bundle.js'  },  module: {    rules: [      { test: /\.txt$/, use: 'raw-loader' }    ]  }};

module.exports = config;

以上配置中,对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use。这告诉 webpack 编译器(compiler) 如下信息:“嘿,webpack 编译器,当你碰到「在 require()/import 语句中被解析为 '.txt' 的路径」时,在你对它打包之前,先使用 raw-loader 转换一下。”

在 webpack 配置中定义 loader 时,要定义在 module.rules 中,而不是 rules。在定义错误时 webpack 会给出严重的警告。

插件(plugins)

loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建它的一个实例。

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装const webpack = require('webpack'); // 用于访问内置插件

const config = {  module: {    rules: [      { test: /\.txt$/, use: 'raw-loader' }    ]  },  plugins: [    new HtmlWebpackPlugin({template: './src/index.html'})  ]};

module.exports = config;

插件列表

模式

通过选择 development 或 production 之中的一个,来设置 mode 参数,你可以启用相应模式下的 webpack 内置的优化

module.exports = {  mode: 'production'};

Getting Started

从零开始一个基本的构建过程

Vue CLI Webpack 相关

简单的配置方式

webpack 配置最简单的方式就是在 vue.config.js 中的 configureWebpack 选项提供一个对象:

// vue.config.jsmodule.exports = {  configureWebpack: {    plugins: [      new MyAwesomeWebpackPlugin()    ]  }}

该对象将会被 webpack-merge 合并入最终的 webpack 配置。

有些 webpack 选项是基于 vue.config.js 中的值设置的,所以不能直接修改。例如,应该修改 vue.config.js 中的 outputDir 选项而不是 output.path;应该修改 vue.config.js 中的 publicPath 选项而不是 output.publicPath。因为 vue.config.js 中的值会被用在配置里的多个地方,以确保所有的部分都能正常工作在一起。:::

如果需要基于环境有条件地配置行为,或者想要直接修改配置,那就换成一个函数 (该函数会在环境变量被设置之后懒执行)。该方法的第一个参数会收到已经解析好的配置。在函数内,你可以直接修改配置,或者返回一个将会被合并的对象:

// vue.config.jsmodule.exports = {  configureWebpack: config => {    if (process.env.NODE_ENV === 'production') {      // 为生产环境修改配置...    } else {      // 为开发环境修改配置...    }  }}

链式操作 (高级) Chaining (Advanced)

Vue CLI 内部的 webpack 配置是通过 webpack-chain 维护的。这个库提供了一个 webpack 原始配置的上层抽象,使其可以定义具名的 loader 规则和具名插件,并有机会在后期进入这些规则并对它们的选项进行修改。

它允许更细粒度的控制其内部配置。常见修改 vue.config.js 中的 chainWebpack

修改 Loader 选项

// vue.config.jsmodule.exports = {  chainWebpack: config => {    config.module      .rule('vue')      .use('vue-loader')        .loader('vue-loader')        .tap(options => {          // 修改它的选项...          return options        })  }}

对于 CSS 相关 loader 来说,推荐使用 css.loaderOptions 而不是直接链式指定 loader。这是因为每种 CSS 文件类型都有多个规则,而 css.loaderOptions 可以确保你通过一个地方影响所有的规则。

添加一个新的 Loader

// vue.config.jsmodule.exports = {  chainWebpack: config => {    // GraphQL Loader    config.module      .rule('graphql')      .test(/\.graphql$/)      .use('graphql-tag/loader')        .loader('graphql-tag/loader')        .end()      // 你还可以再添加一个 loader      .use('other-loader')        .loader('other-loader')        .end()  }}

替换一个规则里的 Loader

如果你想要替换一个已有的基础 loader,例如为内联的 SVG 文件使用 vue-svg-loader 而不是加载这个文件:

// vue.config.jsmodule.exports = {  chainWebpack: config => {    const svgRule = config.module.rule('svg')

    // 清除已有的所有 loader。    // 如果你不这样做,接下来的 loader 会附加在该规则现有的 loader 之后。    svgRule.uses.clear()

    // 添加要替换的 loader    svgRule      .use('vue-svg-loader')        .loader('vue-svg-loader')  }}

修改插件选项

// vue.config.jsmodule.exports = {  chainWebpack: config => {    config      .plugin('html')      .tap(args => {        return [/* 传递给 html-webpack-plugin's 构造函数的新参数 */]      })  }}

你需要熟悉 webpack-chain 的 API 并阅读一些源码以便了解如何最大程度利用好这个选项,但是比起直接修改 webpack 配置,它的表达能力更强,也更为安全。

比方说你想要将 index.html 默认的路径从 /Users/username/proj/public/index.html 改为 /Users/username/proj/app/templates/index.html。通过参考 html-webpack-plugin 能看到一个可以传入的选项列表。可以在下列配置中传入一个新的模板路径来改变它:

// vue.config.jsmodule.exports = {  chainWebpack: config => {    config      .plugin('html')      .tap(args => {        args[0].template = '/Users/username/proj/app/templates/index.html'        return args      })  }}

可以通过接下来要讨论的工具 vue inspect 来确认变更。

审查项目的 webpack 配置

Inspecting the Project's Webpack Config

因为 @vue/cli-service 对 webpack 配置进行了抽象,所以理解配置中包含的东西会比较困难,尤其是当你打算自行对其调整的时候。

vue-cli-service 暴露了 inspect 命令用于审查解析好的 webpack 配置。那个全局的 vue 可执行程序同样提供了 inspect 命令,这个命令只是简单的把 vue-cli-service inspect 代理到了你的项目中。

该命令会将解析出来的 webpack 配置、包括链式访问规则和插件的提示打印到 stdout。

你可以将其输出重定向到一个文件以便进行查阅:

vue inspect > output.js

它输出的并不是一个有效的 webpack 配置文件,而是一个用于审查的被序列化的格式。

也可以通过指定一个路径来审查配置的一小部分:

# 只审查第一条规则vue inspect module.rules.0

或者指向一个规则或插件的名字:

vue inspect --rule vuevue inspect --plugin html

最后,你可以列出所有规则和插件的名字:

vue inspect --rulesvue inspect --plugins

以一个文件的方式使用解析好的配置

有些外部工具可能需要通过一个文件访问解析好的 webpack 配置,比如那些需要提供 webpack 配置路径的 IDE 或 CLI。在这种情况下你可以使用如下路径:

/node_modules/@vue/cli-service/webpack.config.js

该文件会动态解析并输出 vue-cli-service 命令中使用的相同的 webpack 配置,包括那些来自插件甚至是你自定义的配置。

vue rules 两个输入框不能相等_Vue 学习笔记(二十五):webpack 相关相关推荐

  1. java202302java学习笔记第十五天-罗马数字的两种写法2

  2. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十二(下单和微信支付)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十(下单) 0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单 ...

  3. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  4. vue webpack打包入口文件是哪个_Vue 学习笔记(二十五):webpack 相关

    Webpack 是什么 Vue CLI Webpack 相关 Webpack 更多参考官方文档 Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定 ...

  5. vue 循环勾选框_Vue学习笔记-遍历el-checkbox

    Vue学习笔记-遍历el-checkout v-model="checkAll" :label="list.eventtypeid"> 全选 :label ...

  6. Vue.js构建用户界面的渐进式框架(前端学习笔记1.0)

    文章目录 前言 一.Vue是什么? 二.前端核心分析 1.1.概述 1.2.前端三要素 1.3.结构层(HTML) 1.4.表现层(CSS) 1.5.行为层(JavaScript) 二.前端发展史 2 ...

  7. image是否有disabled属性_Vue学习笔记 模板语法、计算属性

    点击上方"蓝字"关注我们吧! vue学习笔记 官网:https://cn.vuejs.org/v2/guide/ 1.vue体验 demo示例: image.png 示例代码: & ...

  8. Vue.js 学习笔记 二,一些输出指令

    Vue的一些输出指令 {{字段}},v-text指令,v-html指令 <html> <head><meta name="viewport" cont ...

  9. 两组数据的偏差率_GWT测试报告 篇七十五:隐患难忽视,RIVAL 3 WIRELESS精准度LOD测试...

    GWT测试报告 篇七十五:隐患难忽视,RIVAL 3 WIRELESS精准度LOD测试 2020-12-07 18:35:00 4点赞 2收藏 5评论 你是AMD Yes党?还是intel和NVIDI ...

最新文章

  1. iOS性能之WebP
  2. 关于双机热备,你该知道那些问题?
  3. [编程笔记] UNICODE和UTF-8和ASCII互转
  4. mybatis:延迟加载时不要在get/set方法上面添加final关键字(原创)
  5. 线程同步 线程安全_同步装饰器来替换线程安全类
  6. [渝粤教育] 广东-国家-开放大学 21秋期末考试社会学概论10082k1
  7. Gym - 101755G Underpalindromity (树状数组)
  8. spark基础之基于yarn两种提交模式分析
  9. tp5使用layui表格_tp5+layui增、删、改、查。
  10. SQLserver添加主键
  11. 天啊!才几天没去看新闻,WinCE就有这么“爆炸”的新闻了?
  12. 运营级最新修复版苍穹影视(双端千月)
  13. 大数据基础和硬件介绍
  14. 单片机学习笔记(数码管)
  15. basler相机的类
  16. springboot整合mybatis,使用逆向工程和使用通用mapper的方式
  17. H5 VIDEO标签视频黑屏的原因及解决方法
  18. java流星雨代码_流星雨代码
  19. Python中英文翻译工具
  20. Linux 用着太爽啦!!!

热门文章

  1. 王校长撩妹不成反被锤爆?再有钱的舔狗也只是舔狗【Python爬虫实战:微博评论采取】
  2. 管理赚得多还是程序员多_程序员如何为自己开辟出更多的收入渠道
  3. jpa 人大金仓数据库方言_生态丨参展CITE2020 人大金仓全栈数据库管理系统强势来袭!...
  4. 关于ReactNative0.56版本Flatlist列表内容跳动的问题
  5. 【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码...
  6. python 学习资料
  7. 跟我一起学extjs5(22--模块Form的自己定义的设计)
  8. 装个discuz论坛
  9. linux系统之编译内核实现iptables应用层过滤
  10. iphone NSTimer