Skip to content

Commit

Permalink
add: webpack4系列教程
Browse files Browse the repository at this point in the history
  • Loading branch information
dongyuanxin committed Jun 17, 2019
1 parent 156b0cf commit 87e2870
Show file tree
Hide file tree
Showing 25 changed files with 3,157 additions and 25 deletions.
23 changes: 22 additions & 1 deletion .vuepress/config/sidebar.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,31 @@ const weekly = [
'2018/01-心谭-第一期',
]

const webpack4 = [
'零:前言',
'一:打包JS',
'二:编译ES6',
'三:多页面解决方案--提取公共代码',
'四:单页面解决方案--代码分割和懒加载',
'五:处理CSS',
'六:处理SCSS',
'七:SCSS提取和懒加载',
'八:JS-Tree-Shaking',
'九:CSS-Tree-Shaking',
'十:图片处理汇总',
'十一:字体文件处理',
'十二:处理第三方JavaScript库',
'十三:自动生成HTML文件',
'十四:Clean-Plugin-and-Watch-Mode',
'十五:开发模式与webpack-dev-server',
'十六:开发模式和生产模式·实战',
]

module.exports = {
'/Git实战手册/': git,
'/云开发技术/': cloud,
'/前端知识体系/': frontend,
'/设计模式手册/': design,
'/每周分享/': weekly
'/每周分享/': weekly,
'/webpack4系列教程/': webpack4
}
1 change: 1 addition & 0 deletions .vuepress/config/themeConf.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ module.exports = {
{ text: 'JavaScript', link: '/passages/2019-03-26-javascript-first/' },
{ text: 'ES6', link: '/passages/2019-04-09-es6/' },
{ text: '浏览器与安全', link: '/passages/2019-05-15-browser/' },
{ text: 'Webpack4教程', link: '/passages/2018-07-29-webpack-demos-introduction/' },
{ text: 'CSS', link: '/passages/2019-03-20-css3-flex/' },
]
},
Expand Down
12 changes: 6 additions & 6 deletions Git实战手册/stash解惑与妙用.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ permalink: "2018-09-07-git-stash"

收到报告,下意识就是开一个 debug 分支来处理 bug。但是,现在的文档没完成,自然无法提交,又不能把没提交的东西带入到新创建的 debug 分支(_执意如此,我也没办法 : \)_)。目前,status 如下:

![](/images/Git/stash解惑与妙用/1.png)
![](https://static.godbmw.com/images/Git/stash解惑与妙用/1.png)

为了达到目的,分为以下几步:

1. 隐藏修改:`git stash` : ![](/images/Git/stash解惑与妙用/2.png)
2. 创建新分支:`git branch debug` : ![](/images/Git/stash解惑与妙用/3.png)
3.`debug`分支上修复 bug, 并且将修改添加到 log 中 : ![](/images/Git/stash解惑与妙用/4.png)
4. 回到`master`分支, 合并`debug`分支的修改, 并且删除 `debug` 分支 : ![](/images/Git/stash解惑与妙用/5.png)
5. 重新显示隐藏的`stash`,并且将其从`stash list`列表中删除 : ![](/images/Git/stash解惑与妙用/6.png)
1. 隐藏修改:`git stash` : ![](https://static.godbmw.com/images/Git/stash解惑与妙用/2.png)
2. 创建新分支:`git branch debug` : ![](https://static.godbmw.com/images/Git/stash解惑与妙用/3.png)
3.`debug`分支上修复 bug, 并且将修改添加到 log 中 : ![](https://static.godbmw.com/images/Git/stash解惑与妙用/4.png)
4. 回到`master`分支, 合并`debug`分支的修改, 并且删除 `debug` 分支 : ![](https://static.godbmw.com/images/Git/stash解惑与妙用/5.png)
5. 重新显示隐藏的`stash`,并且将其从`stash list`列表中删除 : ![](https://static.godbmw.com/images/Git/stash解惑与妙用/6.png)
6. **然后就可以愉快地继续做自己的事情啦!**

感谢[chucklu](https://www.cnblogs.com/chucklu/)的提醒:上面第五步的两条命令,可以用`git stash pop`命令代替。
Expand Down
6 changes: 3 additions & 3 deletions Git实战手册/批量修改log中的提交信息.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ permalink: "2018-06-19-batch-edit-log"

看一张灾难现场图:

![1](/images/Git/Git修改log中的提交信息/1.png)
![](https://static.godbmw.com/images/Git/Git修改log中的提交信息/1.png)

仔细查找了相关资料,发现了是因为之前的提交记录中`Author`字段的信息是 163 等国内邮箱的。如下:

![2](/images/Git/Git修改log中的提交信息/2.png)
![](https://static.godbmw.com/images/Git/Git修改log中的提交信息/2.png)

所以,解决方法就是:**更改`log`中的提交信息**

Expand Down Expand Up @@ -57,7 +57,7 @@ fi

**将脚本移入要修改的`git`仓库,并执行脚本**。修改后的 log 信息如下。

![3](/images/Git/Git修改log中的提交信息/3.png)
![](https://static.godbmw.com/images/Git/Git修改log中的提交信息/3.png)

**通过`git push --force`强行推送修改后的 log 信息。**

Expand Down
6 changes: 3 additions & 3 deletions Git实战手册/标签应用和版本管理.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ permalink: "2018-09-06-git-tag-and-version"

首先我在 github 上建立了一个仓库。如你所见,这是一个全新仓库:[>>> Star now](https://github.com/dongyuanxin/git-demos)

![](/images/Git/标签应用和版本管理/1.png)
![](https://static.godbmw.com/images/Git/标签应用和版本管理/1.png)

执行`git clone [email protected]:dongyuanxin/git-demos.git`, 将代码库 clone 到本地后。

Expand Down Expand Up @@ -57,10 +57,10 @@ Now, 为代码库在本地打上标签:`git tag v1.0.0 -m 'v1.0.0正式版本'
我们首先将`v1.0.0`版本推送到 Github:`git push origin v1.0.0`

然后,打开仓库,我们会发现`releases`标签已经变成了 1。
![](/images/Git/标签应用和版本管理/2.png)
![](https://static.godbmw.com/images/Git/标签应用和版本管理/2.png)

点进去,会发现我们可以直接下载`v1.0.0`版本。所以,标签是版本的快照。
![](/images/Git/标签应用和版本管理/3.png)
![](https://static.godbmw.com/images/Git/标签应用和版本管理/3.png)

值得一提的是:**标签会随着`git clone`仓库时候,自动拉取到本地**。不信的话可以 clone 一下这个代码仓库,查看是不是已经有了`v1.0.0`这个标签。

Expand Down
65 changes: 65 additions & 0 deletions webpack4系列教程/一:打包JS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
title: "一:打包JS"
date: 2018-07-30
permalink: "2018-07-30-webpack-pack-js"
---

> webpack 本身就是为了打包`js`所设计,作为第一节,介绍**怎么打包`js`**
### 1. 检验`webpack`规范支持

`webpack`支持`es6`, `CommonJS`, `AMD`

创建`vendor`文件夹,其中`minus.js``multi.js``sum.js`分别用 CommonJS、AMD 和 ES6 规范编写。

[>>> vendor 文件夹 代码地址](https://github.com/dongyuanxin/webpack-demos/tree/master/demo01/vendor)

在入口文件`app.js`中,我们分别用 3 中规范,引用`vendor`文件夹中的 js 文件。

```javascript
// ES6
import sum from "./vendor/sum";
console.log("sum(1, 2) = ", sum(1, 2));

// CommonJs
var minus = require("./vendor/minus");
console.log("minus(1, 2) = ", minus(1, 2));

// AMD
require(["./vendor/multi"], function(multi) {
console.log("multi(1, 2) = ", multi(1, 2));
});
```

### 2. 编写配置文件

`webpack.config.js`是 webpack 默认的配置文件名,[>>> webpack.config.js 代码地址](https://github.com/dongyuanxin/webpack-demos/blob/master/demo01/webpack.config.js),其中配置如下:

```javascript
const path = require("path");

module.exports = {
entry: {
app: "./app.js"
},
output: {
publicPath: __dirname + "/dist/", // js引用路径或者CDN地址
path: path.resolve(__dirname, "dist"), // 打包文件的输出目录
filename: "bundle.js"
}
};
```

注意`output.publicPath`参数,代表:**`js`文件内部引用其他文件的路径**

### 3. 收尾

打包后的`js`文件会按照我们的配置放在`dist`目录下,这时,**需要创建一个`html`文件,引用打包好的`js`文件**

然后在 Chrome 打开(**这节课只是打包`js`,不包括编译`es6`**),就可以看到我们代码的运行结果了。

### 4. 更多

本节的代码地址:[>>> 点我进入](https://github.com/dongyuanxin/webpack-demos/tree/master/demo01)

项目的代码仓库:[>>> 点我进入](https://github.com/dongyuanxin/webpack-demos)
182 changes: 182 additions & 0 deletions webpack4系列教程/七:SCSS提取和懒加载.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
---
title: "七:SCSS提取和懒加载"
date: 2018-08-28
permalink: "2018-08-28-webpack-scss-lazy"
---

本节课讲解在`webpack v4`中的 SCSS 提取和懒加载。值得一提的是,`v4``v3`在 Scss 的懒加载上的处理方法有着巨大差别:

- 入口文件需要引用相关 LOADER 的 css 文件
- 配置需要安装针对`v4`版本的`extract-text-webpack-plugin`

<!-- more -->

> 本节课讲解在`webpack v4`中的 SCSS 提取和懒加载。值得一提的是,`v4``v3`在 Scss 的懒加载上的处理方法有着巨大差别。
[>>> 本节课源码](https://github.com/dongyuanxin/webpack-demos/tree/master/demo07)

[>>> 所有课程源码](https://github.com/dongyuanxin/webpack-demos)

### 1. 准备工作

关于 SCSS 处理的基础,请参考[webpack4 系列教程(六): 处理 SCSS](https://godbmw.com/passage/37)

本节课主要涉及 SCSS 在懒加载下提取的相关配置和插件使用。

下图展示了这次的目录代码结构:

![](https://static.godbmw.com/images/webpack/webpack4系列教程/11.png)

为了实现 SCSS 懒加载,我们使用了`extract-text-webpack-plugin`插件。

需要注意,**在安装插件的时候,应该安装针对`v4`版本的`extract-text-webpack-plugin`**。npm 运行如下命令:`npm install --save-dev extract-text-webpack-plugin@next`

其余配置,与第六课相似。`package.json`配置如下:

```json
{
"devDependencies": {
"css-loader": "^1.0.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"node-sass": "^4.9.2",
"sass-loader": "^7.0.3",
"style-loader": "^0.21.0",
"webpack": "^4.16.0"
}
}
```

关于我们的 scss 文件下的样式文件,`base.scss`:

```scss
// 网站默认背景色:red
$bgColor: red !default;
*,
body {
margin: 0;
padding: 0;
}
html {
background-color: $bgColor;
}
```

`common.scss`:

```scss
// 覆盖原来颜色:green
html {
background-color: green !important;
}
```

### 2. 使用`ExtractTextPlugin`

使用`extract-text-webpack-plugin`,需要在`webpack.config.js``plugins`选项和`rules``scss`的相关选项进行配置。

`webpack.config.js`:

```javascript
const path = require("path");
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: __dirname + "/dist/",
path: path.resolve(__dirname, "dist"),
filename: "[name].bundle.js",
chunkFilename: "[name].chunk.js"
},
module: {
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
// 注意 1
fallback: {
loader: "style-loader"
},
use: [
{
loader: "css-loader",
options: {
minimize: true
}
},
{
loader: "sass-loader"
}
]
})
}
]
},
plugins: [
new ExtractTextPlugin({
filename: "[name].min.css",
allChunks: false // 注意 2
})
]
};
```

在配置中,**注意 1**中的`callback`配置项,针对 不提取为单独`css`文件的`scss`样式 应该使用的 LOADER。即使用`style-loader`将 scss 处理成 css 嵌入网页代码。

**注意 2**中的`allChunks`必须指明为`false`。否则会包括异步加载的 CSS!

### 3. `SCSS`引用和懒加载

在项目入口文件`app.js`中,针对 scss 懒加载,需要引入以下配置代码:

```javascript
import "style-loader/lib/addStyles";
import "css-loader/lib/css-base";
```

剩下我们先设置背景色为红色,在用户点击鼠标后,懒加载`common.scss`,使背景色变为绿色。剩余代码如下:

```javascript
import "./scss/base.scss";

var loaded = false;
window.addEventListener("click", function() {
if (!loaded) {
import(/* webpackChunkName: 'style'*/ "./scss/common.scss").then(_ => {
// chunk-name : style
console.log("Change bg-color of html");
loaded = true;
});
}
});
```

### 4. 打包和引入

根据我们在`app.js`中的`webpackChunkName`的配置,可以猜测,打包结果中有:`style.chunk.js` 文件。

命令行执行`webpack`打包后,`/dist/`目录中的打包结果如下:

![](https://static.godbmw.com/images/webpack/webpack4系列教程/12.png)

最后,我们需要在 html 代码中引入打包结果中的、**非懒加载**的样式(`/dist/app.min.css`)和 js 文件(`/dist/app.bundle.js`)。

```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link rel="stylesheet" href="./dist/app.min.css" />
</head>
<body>
<script src="./dist/app.bundle.js"></script>
</body>
</html>
```

__
Loading

0 comments on commit 87e2870

Please sign in to comment.