了解webpack-4.0版本(一)

介绍

近期发布了 webpack 4.0.0 的 beta 版本,如果想了解和之前版本的区别,不妨先自己搭建一个webpack的简单应用体验一下。

1.简单案例

安装 npm i webpack --webpack-cli -D

1.1 为了使用命令行进行打包,需要在package.json中配置

image

1.2 webpack.config.js配置

image
let path = require('path');
module.exports = {
    entry: './src/index.js',//入口配置
    output:{
      path:path.join(__dirname,'dist'),//只能写绝对路径,输出文件夹
      filename:'bundle.js'//输出文件名
    },  
    module:{
       
    },
    plugins:[

    ]
}

执行 npx webpack 或者 npm run build压缩 src文件夹下的index.js

1.3 对打包后的js解读

  • 在bundle.js中,生成一个字执行函数,把要打包的js定义为实参,传入到自执行函数当中。
  • 首先会先构建模块的缓存,目的是为了提高模块的加载速度,下次直接从缓存中取

1.4 使用http服务自动访问项目

  • 在dist文件夹下创建index.html文件 引入bundle.js
  • 在src目录下创建index.css 并在index.js中引入index.css
require('./index.css');
  • 执行npm install style-loader css-loader并在webpack-config.js 中配置loader
      rules:[
        {
          test:/\.css$/,
          loader:["style-loader","css-loader"]
        }
      ]
   },
  • 执行 npm install webpack-dev-server -D
  • 在package.json中 配置 "dev": "webpack-dev-server --open --mode development",在配置--open 后,最后执行npm run dev会自动启动服务打开预览。
  • 在webpack.config.js配置静态文件服务器,可以预览打包后的项目
 devServer:{
       contentBase:'./dist',//静态文件跟目录
       host:'localhost',//配置主机
       port:8080,//主机名
       compress:true//服务器返回给浏览器是否使用gzip压缩
    }
  • npm run dev成功启动项目

webpack-dev-server是一个小型的Node.jsExpress服务器,它使用webpack-dev-middleware来服务于webpack的包,我们可以看到产出的文件(bundle.js),但是webpack-dev-server打包的文件会放到内存中,不可见。

1.5 使用动态模板产出项目

  • npm i html-webpack-plugin -D 根据模板生成一个html文件
  • 配置webpack-config.js
 output:{
      path:path.join(__dirname,'dist'),//只能写绝对路径
      filename: '[name].[hash].js'//打包后的文件名
    },  

输出文件名,改为变量加上哈希值,避免页面引入js有缓存的情况

const HtmlWebpackPlugin = require('html-webpack-plugin');
  plugins:[
      new HtmlWebpackPlugin({
          template: './src/index.html',
          filename: 'index.html',
          title: 'hello world!'
      }),
    ],

src下创建index.html 模板文件,并且配置参数。

<!DOCTYPE html>
<html lang="en">E:\韩佳骏\FF\test\webpack\dist\index.html
<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><%=htmlWebpackPlugin.options.title%></title>
</head>
<body>
<div id="app"></div>
</body>
</html>
  • npm run build dist目录下会自动生成打包后的文件,插入js和传入的title属性

1.6 多入口配置

首先为了每次build后dist下的目录重新打包,方便查看,我们使用

npm i clean-webpack-plugin -D

引入webpack.config.js中

const CleanWebpackPlugin = require('clean-webpack-plugin');
 plugins: [
    new CleanWebpackPlugin([path.join(__dirname, 'dist')]),
   ...
  ],

如果我们多个页面,并且每个页面引入的模块不相同,该如何配置?

 entry: {
     index:'./src/index.js',
     base:'./src/base.js'
  },

entry 中配置的key相当于每一个代码块chunk,配置多个页面时,每个页面配置需要的模块

 plugins: [
    new CleanWebpackPlugin([path.join(__dirname, 'dist')]),
    new HtmlWebpackPlugin({
      template: './src/index.html',//指定产的HTML模板
      filename: 'index.html',
      title: 'hello index!',
      chunks:['index']
    }),
    new HtmlWebpackPlugin({
      template: './src/index.html',//指定产的HTML模板
      filename: 'base.html',
      title: 'hello base!',
      chunks: ['base']
    }),
  ],

假如我们需要引入一个公共模块common.js,比如是jquery,我们还要其他模块内部引用jquery,这时 $这个变量被封装在模块内部,其他模块无法拿到jquery对象$,这时需要在plugin中使用一个模块

 plugins: [
      //用来自动向模块内部注入变量
      new webpack.ProvidePlugin({
          $: 'jquery'
       }),...

假如我们想把$变成全局变量,那么要引入expose-loader, 它会先加载此模块,然后得到模块的导出对象,并且挂载到window

写法:
expose-loader?全局变量名:模块名
let $ = require('expose-loader?$!jquery');

或者

 rules: [
       {
        test: require.resolve('jquery'),
        use: {
          loader: 'expose-loader',
           options: '$'
         }
       },

1.7 多个页面配置

let pages = ['index', 'base'];
pages = pages.map(page => new HtmlWebpackPlugin({
  template: './src/index.html',//指定产的HTML模板
  filename: `${page}.html`,//产出的HTML文件名
  title: `${page}`,
  chunks: [`${page}`],//在产出的HTML文件里引入哪些代码块
  hash: true,// 会在引入的js里加入查询字符串避免缓存,
  minify: {
    removeAttributeQuotes: true
  }
}))
//....
 plugins:[
 //....
 
 ...pages
 ]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,018评论 0 21
  • 无意中看到zhangwnag大佬分享的webpack教程感觉受益匪浅,特此分享以备自己日后查看,也希望更多的人看到...
    小小字符阅读 8,121评论 7 35
  • GitChat技术杂谈 前言 本文较长,为了节省你的阅读时间,在文前列写作思路如下: 什么是 webpack,它要...
    萧玄辞阅读 12,649评论 7 110
  • webpack 介绍 webpack 是什么 为什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert阅读 6,416评论 2 71
  • 问题描述 笔者在公司项目中,需要解析一个200K左右的XML文件(有3000个XML结点),发现解析会导致整个Ap...
    mapleYe阅读 437评论 0 1