[TOC]
# Webpack 的概念
[Webpack 的概念](https://cyl.moe/post/webpack-concepts)
# webpack的chunks和bundle是什么意思?
> https://segmentfault.com/q/1010000012164988
1. chunks 就是代码块/模块的意思,有 name 的 chunk是在 entry 里配置了name 的,那些1,2,3,4啥的应该是用了 code splitting 配置生成的,数字是 chunk 的 id
2. 多个 chunk 合在一起就是 bundle,一个 bundle 可以理解为将多个 js 打包之后生成的一个大的 js 文件,而多个 bundle 里可能有公共的部分,或者一个 bundle 里的东西并不需要一次性加载,这个时候就需要按照路由,按需加载,拆分成不同的 chunk
3. 你的和官方的不一致,可能是因为你没有用到 code splitting
> 如果必须要给一个区分的话,通常我们在讨论时,bundle 指的是所有模块都打包进入的单个文件,而 chunk 指的是按照某种规则的模块集合,chunk 的体积大于单个模块,同时小于整个 bundle
# devServer.publicPath、output.publicPath
*`devServer.publicPath`* 的意义就是**决定外部能以怎样的路径通过 devServer来访问构建在内存中的文件**,这个字段未显式设定时,则会去沿用 `output.publicPath` 字段的显式值(如果有的话,否则就用自己的 `default` 值)。
*`output.publicPath`* 的意义是**用来为构建的文件生成满足特定需求的前缀,并将这个前缀提供给需要的 resolver、plugin 或者其他的配置字段**。
> [https://www.jianshu.com/p/7d43d45b3ebf](https://www.jianshu.com/p/7d43d45b3ebf)
# 在多个文件中import同一个文件,webpack会多次打包吗
react项目,单页面应用。为了便于管理,将不同栏目的jsx文件分成 `a/b/c` 三个文件,用import来引入到主入口。可是 `a/b/c` 文件,都引入了公用组件d。
已经使用了 `webpack.optimize.CommonsChunkPlugin`,
最终打包出来的代码里面,d重复引用吗?代码量已经减少了吗?
***
**答案**:公用组件 d 不会重复,webpack 在处理依赖关系的时候,会给模块分配个 id,同一模块只会写入打包文件一次 —— 这里针对的是单页应用。
另外,`webpack.optimize.CommonsChunkPlugin` 是用于提取公共模块到单独文件用的。
> [在多个文件中import同一个文件,webpack会多次打包吗](https://segmentfault.com/a/1190000008521430)
> [Webpack用import引入公用模块会重复打包吗](http://react-china.org/t/webpack-import/9050)
# 别名配置
根据 [sass-loader](https://github.com/webpack-contrib/sass-loader#resolving-import-at-rules) 处理 `import `的方式,如果要使用 Webpack 中定义的`alias`,就要在路径前面加一个`~`。
在引入文件的时候需要在前面加上`~`,因为`~/`解析到主目录,`~bootstrap/dist/css/bootstrap`就会根据 Webpack 中定义的`alias` 解析到 别名`bootstrap`目录下,没有就解析到 `node_modules/bootstrap`下。`css/less/sass`没有用于导入相关文件的特殊语法。写入`@import“file”`与`“import”./file`就是相同的。
> [stylus 为啥要加入 ~ @import '~common/stylus/mixin'](
https://blog.csdn.net/kiven_wolf/article/details/78320104
)
> [webpack中的css引入文件需要用~@的形式,为什么?](https://juejin.im/post/5bf532a1518825741f626355)
> [vue项目中 路径使用的@和~的区别](https://blog.csdn.net/caseywei/article/details/90697164)
# vue webpack 的配置
```
function resolve (dir) {
return path.join(__dirname, dir)
}
resolve: {
// 自动补全的扩展名
extensions: ['.js', '.vue', '.json', '.scss'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'@components': resolve('src/components'),
'@myComponents': resolve('src/myComponents'),
'@sass': resolve('src/sass'),
'@assets': resolve('src/assets')
}
}
```
# 忽略动态的 require
## 错误描述
在 webpack 中有两种常见的动态的 require:
1. 部分动态,例如以一段路径开头进行加载
2. 完全动态,例如在运行时(如环境变量或`cwd`指定)决定加载路径
webpack 将编译`require`,和 如下 import 动态导入模块相同,不能做到完全的动态加载路由:
```js
temp.component = () => import(`@/views/${menu.menuVueComponent}`) // 正确
temp.component = () => import(`${menu.menuVueComponent}`) // 不能加载
temp.component = () => import(menu.menuVueComponent) // 不能加载
```
## 解决方案
[生成一个不会被 webpack 解析的`require`函数](https://webpack.docschina.org/api/module-variables/#non_webpack_require-webpack-specific)
```js
const requireFunc = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require
```
> [Webpack打包时出现require报错问题](https://www.cnblogs.com/leona-d/p/12312754.html)
> [如何在 webpack 和 Rollup 中忽略动态的 require](https://zhuanlan.zhihu.com/p/52990313)
# VSCode 等编辑器感知`@`
项目目录添加`jsonconfig.json`文件,内容如下,重启 VScode。
```
{
"compilerOptions": {
"target": "es2016",
"sourceMap": true,
"baseUrl": ".",
"jsx": "react",
"moduleResolution": "node",
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["./src"],
"exclude": ["node_modules", "build"]
}
```
> [vscode中的 jsconfig.json](https://segmentfault.com/a/1190000018013282)
- 讲解 Markdown
- 示例
- SVN
- Git笔记
- github 相关
- DESIGNER'S GUIDE TO DPI
- JS 模块化
- CommonJS、AMD、CMD、UMD、ES6
- AMD
- RequrieJS
- r.js
- 模块化打包
- 学习Chrome DevTools
- chrome://inspect
- Chrome DevTools 之 Elements
- Chrome DevTools 之 Console
- Chrome DevTools 之 Sources
- Chrome DevTools 之 Network
- Chrome DevTools 之 Memory
- Chrome DevTools 之 Performance
- Chrome DevTools 之 Resources
- Chrome DevTools 之 Security
- Chrome DevTools 之 Audits
- 技巧
- Node.js
- 基础知识
- package.json 详解
- corepack
- npm
- yarn
- pnpm
- yalc
- 库处理
- Babel
- 相关库
- 转译基础
- 插件
- AST
- Rollup
- 基础
- 插件
- Webpack
- 详解配置
- 实现 loader
- webpack 进阶
- plugin 用法
- 辅助工具
- 解答疑惑
- 开发工具集合
- 花样百出的打包工具
- 纷杂的构建系统
- monorepo
- 前端工作流
- 爬虫
- 测试篇
- 综合
- Jest
- playwright
- Puppeteer
- cypress
- webdriverIO
- TestCafe
- 其他
- 工程开发
- gulp篇
- Building With Gulp
- Sass篇
- PostCSS篇
- combo服务
- 编码规范检查
- 前端优化
- 优化策略
- 高性能HTML5
- 浏览器端性能
- 前后端分离篇
- 分离部署
- API 文档框架
- 项目开发环境
- 基于 JWT 的 Token 认证
- 扯皮时间
- 持续集成及后续服务
- 静态服务器搭建
- mock与调试
- browserslist
- Project Starter
- Docker
- 文档网站生成
- ddd