从零开始用webpack搭建一个开发环境

Webpack从零开始配置一个开放环境

首先准备: 安装好nodejs( 意味着可以使用npm )

开始配置之旅

  1. 全局安装 webpack_cli 以确保可以使用webpack指令(在项目中也要安装)

    npm install webpack_cli -g (在项目中安装:npm install webpack_cli –save-dev)

  2. 新建一个文件夹,命名为use (路径最好不要有中文,会出什么bug我也不知道)

  3. 在use文件夹下打开命令行(在文件夹下按住shift键然后右击,选择在命令行打开)

    在命令行输入下面命令:npm init ; 然后一直默认就行了。

    完成以后会看到文件夹下多了一个package.json文件(这个文件可以存放我们安装的模块)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    {
    "name": "y",
    "version": "1.0.0",
    "description": "",
    "main": "webpack.config.js",
    "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server"
    },
    "author": "",
    "license": "ISC",
    "devDependencies": {
    "babel-loader": "^7.1.4",
    "css-loader": "^0.28.10",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "html-webpack-plugin": "^3.0.6",
    "less": "^3.0.1",
    "less-loader": "^4.1.0",
    "style-loader": "^0.20.3",
    "vue": "^2.5.13",
    "webpack-dev-server": "^3.1.1"
    },
    "dependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
    }
    }

  4. 开始下载模块,我们先来下载webpack,和webpack_cli 模块

    npm install webpack webpack_cli –save-dev

    ( –save 是下载到当前的目录,而后面的-dev是将模块同步到package.json文件里面 )

    命令完成以后可以看到use文件夹下多了一个node_modules的文件夹,里面就是存放我们要使用的模块

  5. 在use文件夹下新建一个文件webpack.config.js,这个文件就是webpack的配置文件。

  6. 现在我们先来写下我们的开发目录吧

    ​ use—–> //项目目录

    ​ ->dist //文件打包后的目录

    ​ ->node_modules //存放要使用的插件的目录

    ​ src ——-> //我们的开发目录

    ​ ->css //存放css

    ​ ->img //存放图片的目录

    ​ ->js //存放js的目录

    ​ ->views //存放html的目录

    ​ —index.html //入口html

    ​ —index.js //入口js

    ​ —package.json

    ​ —webpack.config.js //webpack的配置文件

  7. 开始配置webpack.config.js

    (主要是src下的入口文件index.js通过webpack打包到dist文件夹下)

    // 引入模块
    var path = require(‘path’);
    const webpack = require(“webpack”);

    module.exports = {

1
2
3
4
5
6
7
8
9
10
11
// 页面入口文件,(html页面引入的唯一js文件)
entry: "./src/index.js",
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(__dirname+"/dist"),
// 输出文件的名称
filename: "index.js",
// 公共资源路径
publicPath: ""
},

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
index.html:

```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>
</head>
<body>
<div class="a">webpack配置</div>
<script src="../dist/index.js"></script>
</body>
</html>

index.js

1
console.log("成功");

  1. package.json的配置中script里面按上面的展示的写

    直接在命令行输入: npm run dev

    运行完成以后,你会发现dist文件夹下多了一个index.html文件

  2. 上面的简单配置已经没有问题了,下面我们就来配置更多的模块。

    1. babel-loader : 这个包允许使用bable和webpack进行转换的js文件

      安装babel-loader 到项目: npm install babel-loader –save-dev

      在js文件夹下新建conmon.js文件:

      1
      2
      3
      4
      5
      6
      function showName(name) {
      console.log(name);
      }
      module.exports = {
      showName : showName
      }

      然后在index.js里面引入这个文件

      1
      2
      3
      4
      // 引入js文件
      const conmon = require("./js/conmon.js");

      conmon.showName("完成了关联");

      webpack.config.js配置:

      1
      2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//  引入模块
var path = require('path');
const webpack = require("webpack");

module.exports = {
// 页面入口文件,(html页面引入的唯一js文件)
entry: "./src/index.js",
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(__dirname+"/dist"),
// 输出文件的名称
filename: "index.js",
// 公共资源路径
publicPath: ""
},
module: {
rules: [
{
test: /.js$/, // 要查找的以.js结尾的文件
exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹
use:['babel-loader'] // 使用的模块
},
]
},
}

打包以后,你会发现,conmon.js和index.js合并到了dist下的index下。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

1. style-loader  :  通过注入一个<style>标签将css添加到DOM中。

一般是配合css-loader来使用的



2. css-loader  :  css-loader会像import/require()一样解释@import和url()并解析他们

下载到项目:

num  install  style-loader  css-loader  --save-dev

在css文件夹下新建css文件index.css:

```css
.a {
width: 200px;
height: 200px;
background-color: #00ffff;
color: #ffffff;
font-size: 36px;
text-align: center;
}

在index.js引入:
1
2
3
4
5
6
7
// 引入js文件
const conmon = require("./js/conmon.js");
// 引入css文件
require("./css/index.css");

console.log("1234");
conmon.showName("完成了关联");
1
 
1
2


webpack.config.js配置:

1
2


1
```

// 引入模块
var path = require(‘path’);
const webpack = require(“webpack”);

module.exports = {
// 页面入口文件,(html页面引入的唯一js文件)
entry: “./src/index.js”,
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(__dirname+”/dist”),
// 输出文件的名称
filename: “index.js”,
// 公共资源路径
publicPath: “”
},
module: {
rules: [
{
test: /.js$/, // 要查找的以.js结尾的文件
exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹
use:[‘babel-loader’] // 使用的模块
},
// 将引入的css样式写入到标签的style属性中
{
test: /.css$/,
use: [‘style-loader’,’css-loader’]
},

  ]
},
1
2


}

1
2
3
4

在index.html使用下样式,则会看到标签样式加上去了。


  1. extract-text-webpack-plugin 插件:4)在打包过程中,把一类文本单独抽离出来

    (在上面的打包css的时候,css是直接写入到标签的style属性里面,这明显是有点菜的做法,那么我们可以通过这个插件把require的css文件单独抽出来,外部引入)

    安装: npm install extract-text-webpack-plugin@next –save-dev

    这里 extract-text-webpack-plugin 必须安装最新版本。

    Webpack 4.0 必须对应是 extract-text-webpack-plugin 4.0.0

    1
    2


1
2
3
4
5
//  引入模块
var path = require('path');
const webpack = require("webpack");
const ExtractTextPlugin = require("extract-text-webpack-plugin"); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css
const ExtractCSS = new ExtractTextPlugin("css/style_1.css");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
module.exports = {
// 页面入口文件,(html页面引入的唯一js文件)
entry: "./src/index.js",
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(__dirname+"/dist"),
// 输出文件的名称
filename: "index.js",
// 公共资源路径
publicPath: ""
},
module: {
rules: [
{
test: /.js$/, // 要查找的以.js结尾的文件
exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹
use:['babel-loader'] // 使用的模块
},
// 将引入的css样式写入到标签的style属性中
// {
// test: /.css$/,
// use: ['style-loader','css-loader']
// },
// 用插件是的css单独抽离,外部引入
{
test: /.css$/,
use: ExtractCSS.extract({
fallback: "style-loader", // 加载程序; css被提取时,加载的插件
use: [ // 装入器; css提取出来以后,加载为css
{
loader: "css-loader",
options: {
minimize : true // 是否压缩
}
}
]
})
},
]
},
// 插件
plugins: [
ExtractCSS, // 输出css
],
}

这样会生成一个css文件;但是,生成的文件不会动态自己添加到html代码中去,如果想要动态添加到代码,则需要下面的这个插件;


1
2
3
4

1. html-webpack-plugin : 插件简化了HTML文件的创建,以服务于您的bundle

安装:   npm i html-webpack-plugin --save-dev

const HtmlPlugin = require(“html-webpack-plugin”); // 用于动态生成html,可以动态添加js和css的外部引入

1
2

```js

1
2
3
4
5
6
7
//  引入模块
var path = require('path');
const webpack = require("webpack");
const ExtractTextPlugin = require("extract-text-webpack-plugin"); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css
const ExtractCSS = new ExtractTextPlugin("css/style_1.css");

const HtmlPlugin = require("html-webpack-plugin"); // 用于动态生成html,可以动态添加js和css的外部引入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
module.exports = {
// 页面入口文件,(html页面引入的唯一js文件)
entry: "./src/index.js",
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(__dirname+"/dist"),
// 输出文件的名称
filename: "index.js",
// 公共资源路径
publicPath: ""
},
module: {
rules: [
{
test: /.js$/, // 要查找的以.js结尾的文件
exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹
use:['babel-loader'] // 使用的模块
},
// 将引入的css样式写入到标签的style属性中
// {
// test: /.css$/,
// use: ['style-loader','css-loader']
// },
// 用插件是的css单独抽离,外部引入
{
test: /.css$/,
use: ExtractCSS.extract({
fallback: "style-loader", // 加载程序; css被提取时,加载的插件
use: [ // 装入器; css提取出来以后,加载为css
{
loader: "css-loader",
options: {
minimize : true // 是否压缩
}
}
]
})
},
]
},
// 插件
plugins: [
ExtractCSS, // 输出css
new HtmlPlugin({ // 输出html
template: "src/index.html" // 以src下的index.html为模板打包
})
]
}

上面的配置,不需要自己在html中引入css和js,他会自动在打包的时候,给html添加js和css并且编译到dist里面。


1
2
3
4
5
6
7
8

1. less-loader : less文件编译

npm install less-loader --save-dev



```js

1
2
3
4
5
6
7
8
//  引入模块
var path = require('path');
const webpack = require("webpack");
const ExtractTextPlugin = require("extract-text-webpack-plugin"); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css
const ExtractCSS = new ExtractTextPlugin("css/style_1.css");
const ExtractLESS = new ExtractTextPlugin("css/style_2.css");

const HtmlPlugin = require("html-webpack-plugin"); // 用于动态生成html,可以动态添加js和css的外部引入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
module.exports = {
// 页面入口文件,(html页面引入的唯一js文件)
entry: "./src/index.js",
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(__dirname+"/dist"),
// 输出文件的名称
filename: "index.js",
// 公共资源路径
publicPath: ""
},
module: {
rules: [
{
test: /.js$/, // 要查找的以.js结尾的文件
exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹
use:['babel-loader'] // 使用的模块
},
// 将引入的css样式写入到标签的style属性中
// {
// test: /.css$/,
// use: ['style-loader','css-loader']
// },
// 用插件是的css单独抽离,外部引入
{
test: /.css$/,
use: ExtractCSS.extract({
fallback: "style-loader", // 加载程序; css被提取时,加载的插件
use: [ // 装入器; css提取出来以后,加载为css
{
loader: "css-loader",
options: {
minimize : true // 是否压缩
}
}
]
})
},
// 使用less文件编译成css
{
test: /.less$/,
use: ExtractLESS.extract({
fallback: "style-loader",
use: [
{loader: "css-loader",options:{minimize: true}},
{loader:"less-loader"}
]
})
}
]
},
// 插件
plugins: [
ExtractCSS, // 输出css
ExtractLESS, // 输出less转化为css
new HtmlPlugin({ // 输出html
template: "src/index.html" // 以src下的index.html为模板打包
})
],
}

配置好后,只要在index.js里面引入less文件即可

1
2
3
4
5
6
7
8
9
// 引入js文件
const conmon = require("./js/conmon.js");
// 引入css文件
require("./css/index.css");
// 引入less文件
require("./css/style.less");

console.log("1234");
conmon.showName("完成了关联");

然后运行打包,就会发现less文件就被编译成了style_2.css;


1
2
3
4
5
6
7
8
9
10

1. webpack-dev-server :使用带有动态重新加载的开发服务器的webpack。这应该只用于开发。

安装: npm i webpack-dev-server --save-dev

插件的介绍里面没有标明什么用法,所以去看了下webpack的文档,里面有个属性 devServer即是在安装 webpack-dev-server插件以后配置的。

配置如下:


// 引入模块
var path = require(‘path’);
const webpack = require(“webpack”);
const ExtractTextPlugin = require(“extract-text-webpack-plugin”); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css
const ExtractCSS = new ExtractTextPlugin(“css/style_1.css”);
const ExtractLESS = new ExtractTextPlugin(“css/style_2.css”);

const HtmlPlugin = require(“html-webpack-plugin”); // 用于动态生成html,可以动态添加js和css的外部引入
module.exports = {
// 页面入口文件,(html页面引入的唯一js文件)
entry: “./src/index.js”,
// 对应输出项的配置
output: {
// 入口文件要输出的最终位置 (要放绝对路径)
path: path.normalize(dirname+”/dist”),
// 输出文件的名称
filename: “index.js”,
// 公共资源路径
publicPath: “”
},
module: {
rules: [
{
test: /.js$/, // 要查找的以.js结尾的文件
exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹
use:[‘babel-loader’] // 使用的模块
},
// 将引入的css样式写入到标签的style属性中
// {
// test: /.css$/,
// use: [‘style-loader’,’css-loader’]
// },
// 用插件是的css单独抽离,外部引入
{
test: /.css$/,
use: ExtractCSS.extract({
fallback: “style-loader”, // 加载程序; css被提取时,加载的插件
use: [ // 装入器; css提取出来以后,加载为css
{
loader: “css-loader”,
options: {
minimize : true // 是否压缩
}
}
]
})
},
// 使用less文件编译成css
{
test: /.less$/,
use: ExtractLESS.extract({
fallback: “style-loader”,
use: [
{loader: “css-loader”,options:{minimize: true}},
{loader:”less-loader”}
]
})
}
]
},
// 插件
plugins: [
ExtractCSS, // 输出css
ExtractLESS, // 输出less转化为css
new HtmlPlugin({ // 输出html
template: “src/index.html” // 以src下的index.html为模板打包
})
],
// 开启服务
devServer : {
contentBase: path.join(
dirname+”/dist”), // 告诉服务器从哪里提供内容
open: true, // 服务器是否自动打开浏览器
openPage: ‘index.html’, //打开浏览器是指定打开的文件
port: 8080, // 设置端口号
proxy: { // 设置代理服务器
“/api”: {
target: “http://localhost:3000“, // 当在页面中输入 /api的时候,相当于 http://localhost:3000
pathRewrite: { // 改写路径
“^/api”: “”
}
}
},
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Package.json配置:

看script属性下的dev属性:webpack-dev-server

```json
{
"name": "y",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server"
},
"author": "",
"license": "ISC",
"devDependencies": {
"babel-loader": "^7.1.4",
"css-loader": "^0.28.10",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"html-webpack-plugin": "^3.0.6",
"less": "^3.0.1",
"less-loader": "^4.1.0",
"style-loader": "^0.20.3",
"vue": "^2.5.13",
"webpack-dev-server": "^3.1.1"
},
"dependencies": {
"webpack": "^4.1.1",
"webpack-cli": "^2.0.11"
}
}

​ 然后配置好后,运行: npm run dev

则会自动开启服务器,当我们每次修改代码保存以后,会自动打包文件,并在我们的浏览器实时更新。

这样我们就把一个简单的开发环境搭建好了