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

image.png

image.png

image.png

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

全局安装

$ npm install webpack webpack-cli -g

初始化?

$ npm init

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

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

packjson
给npm 看的.


.
$ npm install

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

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

$ webpack

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

image.png

设置成 开发环境

$ webpack --mode=development

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

// 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"

}

开启监听

$ webpack --watch

下载服务器插件

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

配置相关的webpack.config.js


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

运行 webpack-dev-server

$ webpack-dev-server

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

$ webpack-dev-server --hot

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

// 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]"
              }
            }
          ]
        }
     ]
   }

}

当多个入口文件时

 
  entry: {
    main : "./src/index.js"
  },
  
  output: {
    // 出口文件名 名字会变成main
    filename: "[name].js",
    path: path.resolve(__dirname, "dist") //__dirname 
  },

不用loader 用 插件 解析 html文件

npm install html-webpack-plugin -D

webpack.config.js里添加

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

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

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

$ npm install uglifyjs-webpack-plugin -D

webpack.config.js

文件头部
var uglify = require("uglifyjs-webpack-plugin");
...

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

    new uglify()
  ]

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

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

webpack.config.js

文件头部
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

// 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里
添加要安装的项目.

  "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 第七节;

稍作改动,在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里
如果

  "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

报错,

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

放进 css文件夹里之后,
image.png

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

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

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

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

 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里.

    rules: [{
        test: /\.css$/,
        use: [{
            loader: MiniCss.loader,
            publicPath: "./dist/css"
          },
          "css-loader"
        ],
      },

报错,一般是配置选项错了.


image.png

还是不行,首先不会帮我创建 css 文件夹.
但有这个效果.


image.png

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

测试一下

            {
        test: /\.css$/,
        use: [{
            loader: MiniCss.loader,
            options : {
              publicPath: "./dist/"
            }
          },
          "css-loader"
        ],
      },

....

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

文件确实是在指定的文件夹下产生了,
但还是报错


image.png

很浪费时间, 一个小时有了,,
百度吧,,
算了先保留

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容