# webpack-test
**Repository Path**: Spike_Tang/webpack-test
## Basic Information
- **Project Name**: webpack-test
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-04-21
- **Last Updated**: 2021-06-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## webpack是什么
webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具
1. 基于node.js环境的工具,可以自由使用node.js的API。
```
现在前端项目中都有的
├─ node_modules
└─ package.json
```
```javascript
// webpack.config.js
// 导入node.js path模块
const path = require('path');
module.exports = {
entry: {
index: './src/app.js'
},
output: {
// 使用node.js path模块的方法
path: path.resolve(__dirname, 'dist'),
filename: '[name].bundle.js',
},
};
```
```javascript
// webpack node启动的方式
const path = require('path');
const webpack = require('webpack')
webpack({
entry: {
index: './src/app.js'
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].bundle.js',
},
}, (err, stats) => {
// [Stats Object](#stats-object)
if (err || stats.hasErrors()) {
// [在这里处理错误](#error-handling)
}
// 处理完成
console.log(stats.toString({
chunks: false, // 使构建过程更静默无输出
colors: true // 在控制台展示颜色
}))
})
// webpack.config.js本质是通过node环境运行,返回一个配置对象。然后将这个对象给webpack去运行。
```
2. 解决前端模块化,合并多文件减少http请求次数。
```javascript
// 早期项目目录
├── style.css
├── module-a.js
├── module-b.js
└── index.html
// module-a.js
function foo () {
console.log('moduleA#foo')
}
// module-b.js
var data = 'something'
// html 文件
Stage 1
```
```javascript
// 打包前
├── app.js
├── module-a.js
└── module-b.js
// app.js
import './module-a';
import './module-b';
console.log(123)
// 打包后
├── index.bundle.js
└── index.html
// 输出符合规范的模块
// 解决模块依赖顺序问题
// 多模块文件合并
```
3. 提供本地servers
```javascript
// 早期web页面基本都是后端渲染
// 前端切图完成之后的 html 提供给后端,改造成jsp ejs 等模板。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basepath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
Insert title here
// 后来前后端分离,后端通过接口提供给前端后,前端自行渲染。
// 但是这个接口一般会受到跨域影响,所以需要本地启动一个servers来解决这个问题。
```
4. 提供其他功能和定制化的文件处理,如:代码热更新,代码压缩,混淆,图片合并。
```javascript
// 随着前端功能的丰富,代码量增多。每次请求文件增加,为了减少网络传输量和减少首屏渲染时间,就产生了代码压缩的需求。
// 同时前端中暴露的接口,前端拦截逻辑增加。为了增加前端安全性产生了代码混淆的需求。
// 以及之后便于增加开发效率的,热更新、发布时删除注释测试代码或者console、css自动补齐兼容性前缀、图片合并等,只要node能实现支持的都可以添加。
```
为什么选择 webpack
## 学习难点
1. 现在基于vue react angular框架都有自己二次封装的脚手架工具,需要调整的配置较少,使用场景很少。
2. webpack 以及相关loader、plugin、node.js,更新版本和日常使用的版本有差距。因为webpack配置固定之后很长时间不会更新,缺乏长时间的关注。
3. 日常踩坑可能涉及,plugin文档不清楚、node.js版本或者一些环境问题、webpack一些配置细节不清楚那里查。踩坑问题百度不到符合自己的答案。
## 推荐学习目标
尝试搭建一个自用的开发环境。
1. 根据自身需求融合多技术栈。例如 你平常项目使用的是typescript 的环境,现在突然需要你测试javascript的代码。你产出的NPM包,测试在commonjs amd cmd es6不同规范下的兼容。
2. 便于日常学习测试使用。例如平常你在学习或者开发中,需要测试一个API,一个模块想法,一个新的路由结构,这个时候就需要一个环境。在公司项目测可能会忘记删除,或者是项目较大项目启动和热更时间长。
3. 日常使用产生想法需求,实现后适应的用途增加产生新的需求。有助于webpack持续学习,和提供更多日常开发的便利功能。
## 基础概念
例子:example1 example2
1. #### 入口(entry)
是配置项目开始时的入口文件,webpack通过这个文件找到与他关联的其他模块。
2. #### 输出(output)
是配置文件打包后输出的位置,以及生成文件部分数据配置。例如:文件名称,文件使用的外链接host。
3. #### loader
给webpack拓展解析文件类型的组件。针对不同类型文件添加不同类型的loader。webpack默认是支持js和json的。
4. #### 插件(plugin)
给webpack拓展功能的组件。例如:自动生成html文件,代码压缩,代码分块,eslint检查。
5. #### 模式(mode)
不同模式设置的部分默认参数不同
## 常用功能配置
1. ### 开发环境
1. 本地服务,并且可以外部访问。
2. 模块热替换
例如:example 4
2. ### 代码分离
例如:example 5
3. ### 管理外部依赖
1. 项目中使用到第三方框架库,其实不用打包到业务代码中,第三方代码相对于业务代码基本是不会变化的,所以单独加载然后再利用浏览器缓存会较好。
## 核心目的
需要自己制定方案,配合方案改造代码结构,再利用node.js和webpack来实现
1. 制定适合多项目的代码打包分离方案配合浏览器缓存,实现以浏览器缓存维度的代码文件模块化。减少用户首屏时间。
1. 最大限度利用浏览器文件缓存机制,减少http加载文件。如果项目中所有代码都打包到一个js文件中,就意味着每次迭代版本之后的第一次浏览都会较慢,哪怕你之改动了一行代码也是文件的变化。
2. 文件缓存目标不要仅限于单一项目,是同一产品线的所有项目。
2. 提供完善功能,保证每个项目工程结构代码结构一致。减少重复劳动和非逻辑劳动。
1. 例如场景的H5活动项目,就是多个项目使用一个开发环境。
## 待详细补充的
1. webpack eslint配置使用
2. webpack babel配置使用