2.webpack笔记2-webpack 基本操作

"Hello World, Hello Blog"

Posted by wudimingwo on December 15, 2018

image.png image.png image.png

webpack4 的使用 文件夹名称不要用中文, 不要有 webpack 关键字.

全局安装

1
$ npm install webpack webpack-cli -g

初始化?

1
$ npm init

局部安装(为了应付不同版本?)

1
$ npm install webpack webpack-cli --save-dev

packjson 给npm 看的. .

1
$ npm install

可以把 packjson里的依赖包全都下载.

默认入口 是 ./src/index.js 创建好之后

1
$ webpack

生成默认出口 ./dist/main.js

image.png 设置成 开发环境

1
2
$ webpack --mode=development

配置基本的webpack.config.js 给webpack 看的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// node 自带路径模块.
var path = require("path");
// 模块化导出格式
module.exports = {
  // 配置入口文件
  entry: "./src/index.js",
  // 配置出口文件
  output: {
    // 出口文件名
    filename: "main1.js",
    path: path.resolve(__dirname, "dist") //__dirname 指的是根目录.dist 设置出口文件夹.
  },
  // 配置 环境, 设置为开发环境
  // 导出的文件不是压缩的
  mode: "development"
  // 设置为生产环境,导出的文件是压缩的.
  //mode : "production"

}

开启监听

1
$ webpack --watch

下载服务器插件

1
2
$ npm install webpack-dev-server -D
-D 表示 --save-dev

配置相关的webpack.config.js

1
2
3
4
5
6
7
8
   // 开启服务器时,默认打开dist文件下的index.html
   // 自动刷新页面
   devServer : {
     contentBase : "dist",
     // 更改 端口
     port : 9879
   }

运行 webpack-dev-server

1
$ webpack-dev-server

也可以用hot 只更新变化的部分.

1
$ webpack-dev-server --hot

webpack.config.js css,html,img 等文件的解析

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// node 自带路径模块.
var path = require("path");
// 模块化导出格式
module.exports = {
  // 配置入口文件
  entry: "./src/index.js",
  // 配置出口文件
  output: {
    // 出口文件名
    filename: "main1.js",
    path: path.resolve(__dirname, "dist") //__dirname 指的是根目录.dist 设置出口文件夹.
  },
  // 配置 环境变量, 设置为开发环境
  // 导出的文件不是压缩的
  mode: "development",
  // 设置为生产环境,导出的文件是压缩的.
  //mode : "production"

   // 开启服务器时,默认打开dist文件下的index.html
   // 自动刷新页面
   devServer : {
     contentBase : "dist",
     // 更改 端口
     port : 9879
   },
   
   // 应用loader
   
   module : {
     rules : [
        // css loader
        {
          // 正则匹配需要转换的文件类型
          test : /\.css$/,
          // 使用的加载器, 顺序是从右向左,css-loader 用来解析 css style-loader 用来注入style标签?
          use :['style-loader','css-loader']
        },
        {
          test : /\.html$/,
          use : [
            {// 单独抽离的文件,进行处理生成文件
              loader : 'file-loader',
              options : {
                name : "index.html"
              }
            },
            {// 单独抽离html文件
              loader : 'extract-loader'
            },
            {//找到 html文件
              loader : 'html-loader'
            }
          ]
        },
        // es6 js loader
//      {
//        test : /\.js$/,
//        use : ["babel-loader"]
//      },
        // 图片 loader 字体loader
        {
          test : /\.(jpg|png)$/,
          use : [
            {
              loader : "url-loader",
              options : {
                //小于该大小时,生成url码,大于时,生成独立文件.
                limit : 8912,
                // 独立文件的文件夹,以及名称和格式.
                name : "/img/[name].[ext]"
              }
            }
          ]
        }
     ]
   }

}

当多个入口文件时

1
2
3
4
5
6
7
8
9
10
 
  entry: {
    main : "./src/index.js"
  },
  
  output: {
    // 出口文件名 名字会变成main
    filename: "[name].js",
    path: path.resolve(__dirname, "dist") //__dirname 
  },

不用loader 用 插件 解析 html文件

1
npm install html-webpack-plugin -D

webpack.config.js里添加

1
2
3
4
5
6
7
8
9
10
11
在开头添加
var HtmlWebpackPlugin = require('html-webpack-plugin');
...
  plugins: [
    new HtmlWebpackPlugin({
      // 设置title
      title : "title",
      // 用哪个index文件为模板,生成的index.html会自动引入main.js
      template : "./src/index.html"
    })
  ]

需要注意的是, 这种方式加载html, 不必在 入口函数中进行引入. 这种情况下,hmtl里引入的资源都没有进入 入口函数的 依赖关系里. 所以都不会被解析打包.

测试另一个插件,用来压缩js的插件

1
$ npm install uglifyjs-webpack-plugin -D

webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
文件头部
var uglify = require("uglifyjs-webpack-plugin");
...

  plugins: [
    new HtmlWebpackPlugin({
      // 设置title
      title : "title",
      template : "./src/index.html"
    }),

    new uglify()
  ]

css文件也可以抽离成独立文件,插件

1
2
$ npm install mini-css-extract-plugin -D

webpack.config.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
文件头部
var MiniCss = require("mini-css-extract-plugin");

css 相关loader中, 把style-loader 替换掉
      {
        test: /\.css$/,
        use: [MiniCss.loader, 'css-loader']
      },

插件调用
  plugins: [
    new HtmlWebpackPlugin({
      // 设置title
      title : "title",
      template : "./src/index.html"
    }),

    new uglify(),
    new MiniCss({
      // contenthash:8 根据内容生成八位数哈希值.
      filename : "[name]_[contenthash:8].css"
    })
  ]

image.png

我了个擦, webpack 最烦的地方是,报错之后,不知道问题出在哪里, 就这一个班小时的视频看了3,4个小时才看完,, 真的是,感觉如果不用于构建大项目, 这个东西还挺费时间的. 算了,还是再熟练熟练基本操作..

webpack.config.js

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// node 自带路径模块.
var path = require("path");
// 插件必须 在这里引入
var HtmlWebpackPlugin = require("html-webpack-plugin");

var uglify = require("uglifyjs-webpack-plugin");

var MiniCss = require("mini-css-extract-plugin");
// 模块化导出格式
module.exports = {
  // 配置入口文件
  entry: {
    main: "./src/index.js"
  },
  // 配置出口文件
  output: {
    // 出口文件名
    filename: "[name].js",
    path: path.resolve(__dirname, "dist") //__dirname 指的是根目录.dist 设置出口文件夹.
  },
  // 配置 环境变量, 设置为开发环境
  // 导出的文件不是压缩的
  mode: "development",
  // 设置为生产环境,导出的文件是压缩的.
  //mode : "production"

  // 开启服务器时,默认打开dist文件下的index.html
  // 自动刷新页面
  devServer: {
    contentBase: "dist",
    // 更改 端口
    port: 9879
  },

  // 应用loader

  module: {
    rules: [
      // css loader
      {
        // 正则匹配需要转换的文件类型
        test: /\.css$/,
        // 使用的加载器, 顺序是从右向左,css-loader 用来解析 css style-loader 用来注入style标签?
        use: [MiniCss.loader, 'css-loader']
      },
//            {
//              test : /\.html$/,
//              use : [
//                {// 单独抽离的文件,进行处理生成文件
//                  loader : 'file-loader',
//                  options : {
//                    name : "index.html"
//                  }
//                },
//                {// 单独抽离html文件
//                  loader : 'extract-loader'
//                },
//                {//找到 html文件
//                  loader : 'html-loader'
//                }
//              ]
//            },
//       es6 js loader
//            {
//              test : /\.js$/,
//              use : ["babel-loader"]
//            },
//       图片 loader 字体loader
      {
        test: /\.(jpg|png)$/,
        use: [{
          loader: "url-loader",
          options: {
            //小于该大小时,生成url码,大于时,生成独立文件.
            limit: 8912,
            // 独立文件的文件夹,以及名称和格式.
            name: "/img/[name].[ext]"
          }
        }]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      // 设置title
      title : "title",
      template : "./src/index.html"
    }),

    new uglify(),
    new MiniCss({
      // contenthash:8 根据内容生成八位数哈希值.
      filename : "[name]_[contenthash:8].css"
    })
  ]

}

重来一遍 重来一遍,

  1. 创建 文件夹 git bash here 局部安装 webpack webpack-cli 初始化 npm init 创建 webpack.config.js 配置入口,出口,环境变量 完,又出错. image.png

把mode 写成了 mood 试一下 js依赖. 试一下 –watch 下载 webpack-dev-server 测试启动一下 配置 webpack-dev-server 让网页自动刷新 试一下 webpack-dev-server –hot

测试 打包 css 创建,css文件, 下载 css-loader, style-loader main, 引入依赖

完,报错 image.png 应该是没有配置loader

配置loader

还是报同样的错 image.png

找到问题 引入css时写错 把 require(“demo.css”); 改成 require(“./demo.css”); 不能没有./,路径不能简化.

测试把html 打包 下载 file-loader, html-loader, extract-loader 创建 html文件 配置 html文件

出错, 页面没有正常渲染

没有在main.js 中引入 html文件 引入文件

又报错 image.png 又犯了同样的错误 引入文件时,路径填写不准确. 把 require(“index.html”); 改成 require(“./index.html”);

还是没有按照预期渲染, css似乎没起作用. 发现 之前引入的 math.js 也没有起作用.

哦,明白了, 我没有在 index.html当中引入 生成后的mani.js 尼玛..

测试 加载图片模块 粘贴两个图片到 ./ src/img文件夹里 下载 url-loader 配置 url-loader 让img 抽离成独立文件.

测试 加载 html web-pack-plugin 下载 web-pack-plugun 在 config.js中 引入 在plugins 中 new 需要把 html 相关loader 配置删除

报错 new HtmlWebpackPlugin(); 不能有冒号..低级错误 报错, image.png 需要把 在 main.js中 引入的html 给删掉.

配置,生成的html 和我自己写的一样, 有个预期的错误, 即,在html中img标签引入的图片找不到, 因为没有进入main.js的打包过程,就不会产出相关的文件.

测试 下载 uglifyjs-loader 压缩js代码 下载 uglifyjs-loader (这插件名字起的很逗啊, 不是丑的意思嘛?,压缩后确实难看了也对.) 报错 应该是名字输入错了 image.png 不是npm install uglifyjs-loader -D 而是 npm install uglifyjs-webpack-plugin -D 配置 uglify 先引入 后实例 发现一个问题, 我的js代码会执行两次, 原因是,我的src/index.html里引入了main.js 而 Htmlwebpackplugin 生成的 index.html 也会默认 引入main.js 引入两次,导致执行两次.

测试,把css 独立出来. 下载插件 npm install mini-css-extract-plugin -D 把依赖干掉? 头部引入 用minicss.loader 替换掉 style-loader 实例化 new Minicss() 设置 文件名.

报错, 引入插件时,名字写错了 不是 mini-css-webpack-plugin 而是mini-css-extract-plugin 出了问题, 没有生成独立的css文件,

原因是, 需要将 css文件 在main.js中引入. 这与html的插件不同,html的插件是,用插件就不要引入, 而css这个插件,需要引入,还需要更改 style-loader


在今天结束前开始来第三次. 我们稍微换一下思路. 我们把需要安装的loader 和 plugin 也就是这个 package.json 先保存下来. 用npm install 来试一下.

创建文件夹 git bash here npm init 在package.json里 添加要安装的项目.

1
2
3
4
5
6
7
8
9
10
11
12
  "devDependencies": {
    "css-loader": "^1.0.1",
    "extract-loader": "^3.0.0",
    "file-loader": "^2.0.0",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "mini-css-extract-plugin": "^0.4.5",
    "style-loader": "^0.23.1",
    "uglifyjs-webpack-plugin": "^2.0.1",
    "url-loader": "^1.1.2",
    "webpack-dev-server": "^3.1.10"
  },

npm install 不知道怎样才算是成功 image.png

创建 webpack.config.js 设置入口,出口,环境变量 创建入口文件,

咦? 我们发现package.json 里的依赖项当中, 是没有webpack webpack-cli 的 应该是不能通过 这种方式安装 安装 webpack webpack-cli -D

测试webpack

测试 js 文件依赖.

测试 webpack –watch

测试 webpack-dev-server 配置 webpack-dev-server 测试是否会自动刷新.

出错.

image.png 写成了 devServer : { contBase : “dist”, port : 9876 } 应该改成 devServer : { contentBase : “dist”, port : 9876 }

测试 webpack-dev-server –hot

测试依赖一个 css 配置 css-loader style-loader

测试依赖一个html 配置 html-loader extract-loader file-loader

测试 加入两个图片. 配置 url-loader

报错,似乎是语法错误 image.png 没放进对象的缘故.

测试,用htmlwebpackplugin 独立出 html文件. 报错,html 解析失败

image.png

路径问题 不应该是 template : “./index.html” 而是 template : “./src/index.html” 此处要填写的是 config.js 和 index.html 之间的相对路径. html中 img标签没有进入 打包之中, 所以会引入失败. 但这要怎么解决呢? 还是说用 file-loader 这种方式更方便?

测试,js 压缩代码插件 报错,应该是插件名称写错了. image.png

测试 mini-css-extract-plugin 独立css 文件

第三次基本操作完成.感觉确实好多了. 特别是,通过packjson.的方式批量下载 npm包 比一个一个下要节省相当多的时间. 但这种方式,应该注意要把不需要的都去掉.

现在感觉,只要能很好的看懂 package.json 和 webpack.config.js 的内容的话, 实际上配置的时候,只需要进行复制粘贴就可以了. webpack 个人觉得最明显 过瘾的地方是, 似乎,我拥有了全世界的包.哈哈哈,

现在弄两个额外的任务. 1.把今天的package.json 里的内容, 以及 webpack.config.js的内容, 制成 代码提示.这样比复制粘贴稍微方便一点.

  1. 我们试一下 scss loader的配置.

1.失败,似乎 hbuilder 对 代码提示的长度是有所限制的. 方法是把一个文件分割成好多个, 我分了5个都不行, 这就没意思了.

2.成功, 参照 webpack4.x 处理less、sass文件,分离编译后的css,自动添加css前缀,自动消除冗余css 第七节;

1
2
3
4
5
6
7
8
稍作改动,在loader里添加
{
        test : /\.s(c|a)ss$/,
        use : [MiniCss.loader,"css-loader","sass-loader"]
      },

在main.js中引入
require("./scss/demo1.scss");

花了将近一天的时间打了三次webpack , 希望是值得的.


报错 image.png 应该是入口写错了. main : “./src/mian.js” 改成 main : “./src/main.js”

测试 js文件依赖

疑问, 在package.json里 如果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  "devDependencies": {
    "webpack": "^4.26.1",
    "webpack-cli": "^3.1.2",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
}
写成

  "devDependencies": {
    "webpack",
    "webpack-cli",
    "babel-core",
    "babel-loader"
}
然后 npm install  他会帮我正常安装嘛?
  "devDependencies": {
    "webpack": "^3",
如果写成这样呢?
}

测试html 报错 image.png ,应该是options写错了

运行报错, 原因是, html当中引入的应该是生成后的 js, 而不是 src 里的js,

测试两个图片 测试 图片独立成文件. 报错 image.png 没有生成文件. 我勒个去, 因为我不小心把 src 里的 img给删掉了.

测试, 用 html-webpack-plugin 独立 html 文件. 报错 image.png 哦明白了,main.js中不能引入html

测试 js 代码压缩.

css 分包 测试 mini-css

测试 scss

报错,

1
2
3
4
5
    new MiniCssExtractPlugin({
      filename : "./css/[name]_[contenthash:8].css"
    })

放进 css文件夹里之后,

image.png

图片资源路径找不到了. 我们分析一下. 我在 scss 当中的 引入的图片路径是这样的.

1
url(../img/3test.jpg);

是基于src/scss文件的 图片的相对路径. 当然我设置的正好和 dist/scss当中的相对路径是一样的.

我们这样测试, 先把 miniCss 路径改回来.

1
2
3
 new MiniCssExtractPlugin({
      filename : "[name]_[contenthash:8].css"
    })

然后把文件放入,src/scss/scss 引入相对路径,看看会怎么样. 成功, 表明, 确实要填写src里的路径关系.

刚才发现,忘了在 main.js 中引入 scss文件, 把文件引入后,我们再重新测试上面的问题. 不是因为没有引入依赖,一样是这个问题. 测试,我们把引入放在 css文件上. 还是同样的报错. image.png

假设是这样的, 本来生成的文件的路径,都是相对 output 当中的path的,也就是 ./dist minicss 让生成的 css 文件都 相对 ./dist/css?

百度一下 mini-css-extract-plugin;

看文档推测, 不要在 插件filename上 设置要存放的文件夹, 而是放在loader里.

1
2
3
4
5
6
7
8
9
    rules: [{
        test: /\.css$/,
        use: [{
            loader: MiniCss.loader,
            publicPath: "./dist/css"
          },
          "css-loader"
        ],
      },

报错,一般是配置选项错了. image.png 还是不行,首先不会帮我创建 css 文件夹. 但有这个效果. image.png

也就是说, 这个文件到底在哪里创建由 mini 来决定, 但里面的资源文件相对于谁,可以用 publicPath 来决定?

测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            {
        test: /\.css$/,
        use: [{
            loader: MiniCss.loader,
            options : {
              publicPath: "./dist/"
            }
          },
          "css-loader"
        ],
      },

....

    new MiniCss({
      filename: "./css/[name]_[contenthash:8].css"
    })

文件确实是在指定的文件夹下产生了, 但还是报错 image.png 很浪费时间, 一个小时有了,, 百度吧,, 算了先保留