webpack4.0

webpack 是具有打包,转化以及优化的工具,而 webpack4.x 相比较 webpack3.x 有了较大的改变,故在此写下一篇文章用于记录与学习。

1. webpack安装

webpack 是基于 node 使用的所以请先安装 node(npm 也会随node一并下载下来),下载完毕之后使用下图指令

[图片上传中...(webpack.PNG-5cfd88-1543608997803-0)]

确认是否下载完成。

webpack 官网https://webpack.js.org

node 官网https://nodejs.org/zh-cn/

webpack 4.0 安装命令如下图(npm,cnpm都可以)

webpack.PNG

该方法为全局安装,用一下命令查看是否安装成功

success.PNG

若未成功请使用局部安装如下

再次使用上面的命令验证是否安装成功

2. 简单配置

在项目中先生成项目文件如下

npm init.PNG

再在项目中生成 webpack.config.js (webpack的配置文件),建立 src 文件夹(未打包之前的文件夹),dist 文件夹是打包之后生成的文件夹,node_modules 是存放各种插件即中间件,package.json 写清所下的依赖,基本目录如下

目录.PNG

下面是 webpack.config.js 中的基本配置,如下图

配置.PNG

webpack4.0,中的零配置时,默认入口文件为 src/index.js,默认出口文件为 dist/main.js

entry 入口文件

output 出口文件

loader 转化器

plugins 插件

devServer 开发服务器

mode 模式

webpack.config.js 文件配置好后,只需在 cmd 中输入 webpack 便可打包,默认打包的文件是压缩过后的,这便是 mode 模式

mode 分为两种模式,分别是 development(开发模式) 和 production(上线模式),可在 cmd 中如下所写(开发模式)

cmd.PNG

也可在 package.json 中事先配置好,如下

cmd-one.PNG

运行时 cmd 中输入如下

build.PNG

出口与入口的设置

1-1-3.PNG



1.entry 入口

      可以同时配置多个入口,路径使用相对路径

2.output 出口

      path 路径使用绝对路径,可以使用 resolve 或者 join 进行合成,__dirname 为当前文件夹的路径,

      filename 打包过后的 js 文件名

打包过后生成的文件夹如下

1-1-3.PNG



html-webpack-plugin

打包时的一些操作

1. 安装

npm install html-webpack-plugin -D

2.依赖 webpack 运行

      需要本地安装 webpack,因为 webpack4.0 中将一些功能放入了 webpack-cli 中,所以也需要本地安装 webpack-cli

      npm install webpack webpack-cli -D

3.配置

4.使用

      引入 new html({})

webpack.config.js 中配置如下

1-1-1.PNG

chunks 打包文件的名称,是一个数组,即可以同时将多个 js 文件打包在同一个 html 文件中

hash 是否对引入的静态资源进行编译进行,如下

1-1-2.PNG

title 一般用于网页的<title>标签中

filename 打包之后生成的 html 文件的名称

template 打包文件的 html 模板

更多配置请到 npm 官网查看



clean-webpack-plugin

清除之前生成的包

1.安装

      npm install clean-webpack-plugin -D

2.使用

      引入 new clean([])

1-1-4.PNG



webpack-dev-server

启用服务器

1. 安装

      npm install webpack-dev-plugin -D

2. 使用

      无需用变量引入

配置如下

1-1-5.PNG

open 是在 cmd 中运行打包之后页面立即打开

hot 是在文件保存即在页面更新

打包过后的项目目录如下

1-1-6.PNG



less/scss 等是浏览器不支持的,所以需要用 loaders(转化器,加载器) 进行转化



style-loader ,css-loader

1. 安装

      npm install style-loader css-loader -D

2. 使用

      在 webpack.config.js 中对 module 进行配置,不用用变量引入

1-1-7.PNG



mode production(上线环境即对打包文件进行压缩)

1. 在 webpack4.0 之后

      可以在 webpack.config.js 中设置,也可以在 package.json 中设置,或者在 cmd 中输入命令时加上

2. 在 webpack4.0 之前

      使用 uglify 插件

      1. 安装

      npm install uglifyjs-webpack-plugin -D

      2. 使用

1-1-8.PNG



url-loader,file-loader

1. 安装

      npm install url-loader file-loader -D

2. 使用

      无需在 webpack.config.js 中用变量引入,在 webpack.config.js 中的配置如下

1-1-9.PNG



less,less-loader

1. 安装

      npm install less less-loader -D

2. 使用,在 webpack.config.js 中的配置

      1. 在 module 中进行配置

1-1-10.PNG

      2. 在 js 文件中通过 import from 将 less 文件引入



node-sass,sass-loader

1. 安装

      npm install node-sass sass-loader -D

2. 使用,在 webpack.config.js 中的配置如下

      1. 在 module 中进行配置

1-1-11.PNG

      2. 在 js 文件中通过 import from 将 sass 文件引入



css,less,sass 文件的分离

extract-text-webpack-plugin

1. 安装

      npm install extract-text-webpack-plugin -D

2. 使用,在 webpack.config.js 中的配置如下

1-1-12.PNG

3. 问题

      1. 图片路径的问题

1-1-13.PNG

      2. extract-text-webpack-plugin 版本问题

1-1-14.PNG



postcss-loader,autoprefixer

处理 css 文件因为浏览器的不同而产生的前缀(webkit,moz,ms,o),自动添加前缀

1. 安装

      npm install postcss-loader autoprefixer -D

2. 使用

      1. 在项目目录中首先生成一个 postcss.config.js 配置文件,配置如下

1-1-15.PNG

      2. 在 webpack.config.js 文件中 module 下面的 rules 中的配置如下

1-1-16.PNG



purify-css,purifycss-webpack

消除冗余的 css 文件

1. 安装

      npm install purify-css purifycss-webpack -D

2. 使用,在 webpack.config.js 文件中 plugins 中配置如下

1-1-17.PNG

3. 需要引入 glob 扫描模块

      npm install glob -D



babel

babel 用来编译 js,jsx,ESnext(浏览器无法转化的 js 代码)

1. 安装(babel-loader,babel-core,babel-preset-env)

      npm install babel-loader babel-core babel-preset-env -D

2. 使用

      1. 在 webpack.config.js 中 modules 中的 rules 的配置如下

            第一种方式,这种方式需要配置 .babelrc 文件

            

新建 .babelrc 配置文件,配置如下


1-1-20.PNG

            第二种方式,这种方式不需要配置 .babelrc 文件

1-1-19.PNG



babel-preset-react,react,react-dom

将 jsx 语法转化为浏览器支持的语法

1. 安装

      npm install babel-preset-react react react-dom -D

2. 使用

      1. 因为之前配置 js 时已加上 jsx 所以 webpack.config.js 无需再配置

      2. 在 .babelrc 中加上 react 如下

1-1-21.PNG

      3. 在写了 jsx 的 js 文件中引入 react

            通过 import React from 'react' 引入



copy-webpack-plugin

静态资源输出,将 src 中的说明,图片等不需要打包的文件直接 copy 到 dist 文件夹中

1. 安装

      npm install copy-webpack-plugin -D

2. 使用,在 webpack.config.js 中配置如下

1-1-22.PNG



引入第三方库

1. 直接使用 npm 下载库(bootstrap,jquery等)

      不建议使用,因为会直接会将整个库引入打包文件中,不管是否使用了

2. ProvidePlugin

      使用到库时才会打包

            是 webpack 中的一个包,只要安装了 webpack 就可以使用

            在 webpack.config.js 文件中的 plugins 中的配置如下

1-1-23.PNG



optimzation

将库分开打包并以不同的 srcipt 标签写入 html 文件中

使用,是 webpack 中的一个包不需要 npm 安装,在 webpack.config.js 文件中的配置如下

1-1-24.PNG



下载的包都在 package.json 中有记录如下

1-1-25.PNG

项目文件夹中也会有 node_modules 本地安装的包都在改文件夹下



生成的被打包文件夹 src 目录如下

1-1-26.PNG



生成的配置文件目录如下

1-1-27.PNG



打包过后的 dist 文件夹目录如下

1-1-28.PNG



webpack.config.js 配置文件

const path = require("path");
const html = require("html-webpack-plugin");
const webpack = require("webpack");
const clean = require("clean-webpack-plugin");
const eXtract = require("extract-text-webpack-plugin");
const purify = require("purifycss-webpack")
const glob = require("glob");
const rules = require("./webpack.rules.js");
const jsonConfig = require("./webpack.config.json");
const copyWebpackPlugin = require("copy-webpack-plugin");

// 打印路径
console.log('***************', path.join(__dirname, 'src/index.html'));
console.log('---------------', path.resolve(__dirname, 'src/index.html'));
console.log(jsonConfig);

module.exports = {
  entry: {
    index: './src/index.js',
    jquery: 'jquery'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js'
  },
  devServer: {
    contentBase: path.resolve(__dirname, 'dist'),
    host: jsonConfig.host,
    port: jsonConfig.port,
    open: true,
    hot: true
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new html({
      title: '牧师',
      template: './src/index.html',
      hash: true
    }),
    // css 文件打包出去的文件路径,即将在 dist 文件夹下生成一个 css 文件夹,文件夹中存入 index.css 文件
    new eXtract('css/index.css'),
    new purify({
      // 扫描同步下的 html 文件,purifycss 会根据 html 文件中的 css 将冗余的 css 文件删除
      // sync 同步配置
      paths: glob.sync(path.join(__dirname, 'src/*.html'))
    }),
    // 静态资源输出
    new copyWebpackPlugin([{
      // 要 copy 的文件在哪里
      from: path.resolve(__dirname, 'src/asserts'),
      // copy 到哪里去
      to: './public'
    }]),
    new webpack.ProvidePlugin({
      // 文件中使用了 jquery 库时,会打包该库
      $: 'jquery'
    })
  ],
  // 将 module 中的配置放入 webpack.rules.js 文件中,引入 webpack.config.js 中,即写成模块
  // module: rules
  module: {
    rules: [
      {
        // 正则匹配
        test: /\.css$/,
        // use: [
        //   // 引入 style-loader 和 css-loader 中间件
        //   {loader: 'style-loader'},
        //   {loader: 'css-loader'}
        // ]
        //
        use: eXtract.extract({
          fallback: 'style-loader',
          use: ['css-loader', 'postcss-loader'],
          // 配置背景图的路径
          publicPath: '../'
        })
      },
      {
        test: /\.(js|jsx)$/,
        use: ['babel-loader'],
        // 不包含 node_modules 目录中的 js/jsx 文件
        exclude: /node_modules/
      },
      {
        test: /\.less$/,
        // // loader 加载从右到左,先经过 less-loader文件,再经过 css-loader 文件,最后经过 style-loader 文件
        // // 这种配置下 less 样式存在 html 页面中 style 标签中,dist 文件夹中的 html 也不会显示
        // use: ['style-loader', 'css-loader', 'less-loader']
        use: eXtract.extract({
          // 将 less 生成的 css 文件分离出来,加在 css 文件中
          fallback: 'style-loader',
          use: ['css-loader', 'less-loader']
        })
      },
      {
        test: /\.(sass|scss)$/,
        // use: ['style-loader', 'css-loader', 'sass-lo']
        use: eXtract.extract({
          fallback: 'style-loader',
          use: ['css-loader', 'sass-loader']
        })
      },
      {
        test: /\.(png|jpg|gif)$/,
        use: [{
          // 引入 url-loader 中间件
          loader: 'url-loader',
          // 当图片大于 50 字节即 50 兆,便会在前端页面显示相对路径,反之,则转换为 base64 的图片
          options: {
            // 50 字节
            limit: 50,
            // 图片打包出去的目录
            outputPath: 'img'
          }
        }]
      }
    ]
  },
  // 将不同的库分开打包,分别进入 html 文件中,vender 名字可变
  optimization: {
    splitChunks: {
      cacheGroups: {
        vender: {
          chunks: 'initial',
          // 对应 entry 中的名称
          name: 'jquery',
          enforce: true
        }
      }
    }
  }
};



该学习笔记对各包介绍并未完整,如果想对各个包了解更加全面请进入 npm 官网https://www.npmjs.com

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

推荐阅读更多精彩内容