前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • JavaScript Part 1

    • Ajax总结篇
    • Canvas 绘制八大行星
    • DOM编程之API学习总结篇
    • JavaScript事件机制
    • JavaScript代码片段100个
    • JavaScript作用域分析总结
    • JavaScript原型链回顾
    • JavaScript及jQuery中的各种宽高属性图解
    • JavaScript工程项目的一系列最佳实践
    • JavaScript常用API合集
    • JavaScript数组、字符串、对象常用方法
    • JavaScript数组方法总结篇
    • JavaScript深浅拷贝
    • JavaScript运动框架之速度时间版本
    • JavaScript运行机制Event Loop
    • JavaScript防抖节流原理
    • Javascript中的复制粘贴功能
    • Javascript数组详解
    • OOP之原型与原型链
    • Object.defineProperty详解
    • V8源码浅析JS数组常见方法
    • await 在 forEach 中不生效解决方案
    • iframe+表单跨域提交POST请求
    • javascript笔记总结篇
    • 业务中处理数据结构常用的JS方法
    • 作用域
    • 你真的掌握变量和类型了吗
    • 前后端分离之数据Mock
    • 原型与原型链
    • 原生JS补给(上)
    • 如何写出一个惊艳面试官的深拷贝
    • 带你填一些JS容易出错的坑
    • 彻底弄懂 JavaScript 执行机制
    • 执行上下文 执行栈
    • 正则回顾总结
    • 正则基础知识
    • 正则完整篇
    • 正则表达式
    • 浅析Promise原理
    • 浅谈JavaScript中的异步处理
    • 深拷贝 vs 浅拷贝
    • 聊一聊typeof instanceof 实现原理.
    • 聊一聊闭包
    • 高阶函数map reduce filter
  • JavaScript Part 2

  • CSS

  • HTML

  • Jquery

  • ES6

  • 小程序

  • Vue

  • React

  • 深入React

  • React Native

  • NodeJS

  • Angular

  • TypeScript

  • Webpack

  • 浏览器

  • 移动端

  • 前端工程化

  • Electron

  • HTTP

  • Nginx

  • Linux

  • 数据结构与算法

  • LeetCode算法题

  • 综合

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

配置篇|博客系列

# mode

类型: String

默认值: "none"

功能: 设置用到的模式

其它模式:

  • development 开发模式(本地开发)
  • production 生成模式(发布到线上环境)

在webpack4中, 如果将mode设置成production就会启用webpack内部的uglifyjs插件, 进入压缩输出.此时的bundle是经过了tree shaking和代码压缩的.

# 输出(output)

# publicPath

类型: String | Function

默认值: 空字符串""

功能: 指定输出目录对应的公开URL, 影响的主要是外部资源的引用和webpack-dev-server的publicPath

官网地址: output.publicPath

案例一🌰:

例如我们使用webpack打包生成的dist文件目录为:

/dist
	|- bundle.js
	|- index.html
	|- icon.png
@前端进阶之旅: 代码已经复制到剪贴板

默认对于资源的引用, 比如icon.png的引用是这样的:

.box {
	background: url('icon.png') 
}
@前端进阶之旅: 代码已经复制到剪贴板

如果设置了output.publicPath之后:

webpack.config.js

...
module.exports = {
	output: {
		...
		publicPath: '/assets/'
	}
}
@前端进阶之旅: 代码已经复制到剪贴板

浏览器就会在资源文件的引用加上一个前缀, 变成:

.box {
	background: url('/assets/icon.png') 
}
@前端进阶之旅: 代码已经复制到剪贴板

此时, 图片就会加载失败, 因为dist文件夹下并没有assets这个文件夹.

案例二🌰:

影响了webpack-dev-server或者webpack-dev-middleware中的publicPath

如果了解过webpack-dev-server的小伙应该都知道, webpack-dev-server的内部就是使用了webpack-dev-middleware.

而我们在配置webpack-dev-middleware的时候, 是有一个可选项参数的.

比如本地编写的一个server.js:

// server.js
const express = require('express')
const webpack = require('webpack')
const webpackDevMiddleware = require('webpack-dev-middleware')

const app = express()
const config = require('./webpack.config')
const compiler = webpack(config)
// 把webpack 处理后的文件传递给一个服务器
app.use(webpackDevMiddleware(compiler 
+	,{
+		publicPath: config.output.publicPath
+	}
))

app.listen(3000, function() {
    console.log('Example app listening on port 3000!\n');
})
@前端进阶之旅: 代码已经复制到剪贴板

如果指定了output.publicPath, 那就必须也指定一下这里的publicPath与output的一致, 不然,重新执行npm run server, 打开localhost:3000 会发现页面显示的是:

Cannot GET /
@前端进阶之旅: 代码已经复制到剪贴板

你需要打开localhost:3000/assets/才能看到正确的页面.

# library

类型: String | Object

默认值: none

作用: 如果你的webpack是用来配置一个library的话, 就需要用到这个属性. 它一般用来指定你编写的library向外暴露的名称.

其实它值的作用取决于output.libraryTarget选项的值.

一般你可以这样配置它:

output: {
	library: "MyLirary"
}
@前端进阶之旅: 代码已经复制到剪贴板

如果生成的输出文件,是在 HTML 页面中作为一个 script 标签引入,则变量 MyLibrary 将与入口文件的返回值绑定。

# libraryTarget

类型: String

默认值: "var"

作用: 如果你的webpack是用来配置一个library的话, 就需要用到这个属性. 它需要配合output.library属性来用, 配置如何暴露library.

主要有以下几个值:

  • 变量:作为一个全局变量,通过 script 标签来访问(libraryTarget:'var')。
  • this:通过 this 对象访问(libraryTarget:'this')。
  • window:通过 window 对象访问,在浏览器中(libraryTarget:'window')。
  • UMD:在 AMD 或 CommonJS 的 require 之后可访问, 也就是以上几种环境都可以访问(libraryTarget:'umd')

# devtool

类型: String | false

默认值: none

作用:选择一种 source map 格式来增强调试过程。不同的值会明显影响到构建(build)和重新构建(rebuild)的速度。

常用的选项:

  • inline-source-map 开发环境一般设置为这个, 可以使得报的错具体到报错的文件代码里
  • source-map 生产环境可以设置成这个, 整个 source map 作为一个单独的文件生成。它为 bundle 添加了一个引用注释,以便开发工具知道在哪里可以找到它。

# 命令行CLI

这一小节用于介绍一些webpack常用的命令行语句.

命令行CLI也就是在package.json中编写脚本语句时的语句.

例如🌰:

package.json:

{
	"scripts": {
		"build": "webpack --config webpack.config.js"
	}
}
@前端进阶之旅: 代码已经复制到剪贴板

我在这里配置了一个脚本命令"build" , 如果你执行npm run build的话就相当于执行后面那段webpack构建语句.

# –config

用于告诉webpack基于哪个配置文件进行构建.

默认为根目录下的wepack.config.js或者webpackfile.js.

也就是说如果你的根目录下有一个文件为webpack.config.js, 则在终端执行:

webpack --config webpack.config.js
@前端进阶之旅: 代码已经复制到剪贴板

与执行

webpack
@前端进阶之旅: 代码已经复制到剪贴板

效果是一样的.

# –config-register

简写为-r.

类型: 数组

作用: 在 webpack 配置文件加载前先预加载一个或多个模块

# <entry> 和 <output>

<entry>: 一个文件名或一组被命名的文件名,作为构建项目的入口起点。它将映射到配置选项 entry.

<output>: 要保存的 bundled 文件的路径和文件名。它将映射到配置选项 output.path 和 output.filename。

示例一🌰:

webpack src/index.js dist/bundle.js
@前端进阶之旅: 代码已经复制到剪贴板

打包源码,入口为 index.js,并且输出文件的路径为 dist,文件名为 bundle.js

示例二🌰:

webpack index=./src/index.js entry2=./src/index2.js dist/bundle.js
@前端进阶之旅: 代码已经复制到剪贴板

以多个入口的打包方式

# –env

作用: 当配置文件是一个函数时,会将环境变量传给这个函数

也就是可以通过 --env 向配置文件中传递环境变量, 可以用于在同一个配置文件中, 根据命令行传递进来的环境变量做对应处理.

例如🌰:

webpack --env.custom=local
@前端进阶之旅: 代码已经复制到剪贴板

上述命令, 向环境变量中添加自定义属性custom.

在webpack.config.js中获取它:

module.exports = env => {
	console.log(env.custom) // local
}
@前端进阶之旅: 代码已经复制到剪贴板

注意⚠️: 此方法并不能改变process.env中的NODE_ENV

# –mode

类型: String

默认值: “production”

作用: 指定打包生成之后的代码中, 用到的模式.

可选值:

  • production 生成环境(发布到线上的环境)
  • development 开发环境(本地开发的环境)

用法:

webpack --mode production
@前端进阶之旅: 代码已经复制到剪贴板

# –devtool

类型: String

默认值: none

作用: 为打包好的资源定义 [source map 的类型], 等同于配置中的devtool选项.

用法:

webpack --devtool inline-source-map
@前端进阶之旅: 代码已经复制到剪贴板

# –debug

类型: Boolean

默认值: false

作用: 把 loader 设置为 debug 模式

# –progress

类型: Boolean

默认值: false

作用: 打印出编译进度的百分比值

# –display-error-details

类型: Boolean

默认值: false

作用: 展示错误细节

# –output-pathinfo

类型: Boolean

默认值: false

作用: 加入一些依赖的注解信息

# –watch

类型: Boolean

默认值: false

简写: -w

作用: 观察文件系统的变化

观察者模式, 只需要在package.json里配置一个脚本命令:

"scripts": {
	"watch": "webpack --watch"
}
@前端进阶之旅: 代码已经复制到剪贴板

使用npm run watch命令之后, 会看到编译过程, 但是不会退出命令行, 而是实时监控文件.

比如你在重新修改了本地的代码并保存后, 它会重新进行编译, 不需要我们手动再执行编译指令, 缺点是你需要手动刷新页面才能看到更改效果.

# –optimize-minimize

作用: 压缩混淆 javascript,并且把 loader 设置为 minimizing

使用插件: UglifyJsPlugin & LoaderOptionsPlugin

# –define

作用: 定义 bundle 中的任意自由变量

用法:

webpack --define process.env.NODE_ENV='development'
@前端进阶之旅: 代码已经复制到剪贴板

# –hot

作用: 开启模块热替换

用法:

webpack --hot=true
@前端进阶之旅: 代码已经复制到剪贴板

# –target

作用: 目标的执行环境

用法:

webpack --target='node'
@前端进阶之旅: 代码已经复制到剪贴板

# -d

为以下命令的简写:

--debug --devtool cheap-module-eval-source-map --output-pathinfo
@前端进阶之旅: 代码已经复制到剪贴板
  • 开启loader的debug模式
  • 将devtool设置成cheap-module-eval-source-map
  • 加入一些依赖的注解信息

# -p

为以下命令的简写:

← 自定义plugin篇全面分析前端的网络请求方式 →

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • JavaScript Part 1

    • Ajax总结篇
    • Canvas 绘制八大行星
    • DOM编程之API学习总结篇
    • JavaScript事件机制
    • JavaScript代码片段100个
    • JavaScript作用域分析总结
    • JavaScript原型链回顾
    • JavaScript及jQuery中的各种宽高属性图解
    • JavaScript工程项目的一系列最佳实践
    • JavaScript常用API合集
    • JavaScript数组、字符串、对象常用方法
    • JavaScript数组方法总结篇
    • JavaScript深浅拷贝
    • JavaScript运动框架之速度时间版本
    • JavaScript运行机制Event Loop
    • JavaScript防抖节流原理
    • Javascript中的复制粘贴功能
    • Javascript数组详解
    • OOP之原型与原型链
    • Object.defineProperty详解
    • V8源码浅析JS数组常见方法
    • await 在 forEach 中不生效解决方案
    • iframe+表单跨域提交POST请求
    • javascript笔记总结篇
    • 业务中处理数据结构常用的JS方法
    • 作用域
    • 你真的掌握变量和类型了吗
    • 前后端分离之数据Mock
    • 原型与原型链
    • 原生JS补给(上)
    • 如何写出一个惊艳面试官的深拷贝
    • 带你填一些JS容易出错的坑
    • 彻底弄懂 JavaScript 执行机制
    • 执行上下文 执行栈
    • 正则回顾总结
    • 正则基础知识
    • 正则完整篇
    • 正则表达式
    • 浅析Promise原理
    • 浅谈JavaScript中的异步处理
    • 深拷贝 vs 浅拷贝
    • 聊一聊typeof instanceof 实现原理.
    • 聊一聊闭包
    • 高阶函数map reduce filter
  • JavaScript Part 2

  • CSS

  • HTML

  • Jquery

  • ES6

  • 小程序

  • Vue

  • React

  • 深入React

  • React Native

  • NodeJS

  • Angular

  • TypeScript

  • Webpack

  • 浏览器

  • 移动端

  • 前端工程化

  • Electron

  • HTTP

  • Nginx

  • Linux

  • 数据结构与算法

  • LeetCode算法题

  • 综合