正文之前,由于这是一个系列的文章,可能第一次看到的看官老爷们会觉得突兀,如果你是webpack新手,我建议你先从前几篇文章看起,如果你对webpack有一些了解,也希望可以在github上下载代码,对照着看会更有效果

  在当代的前端开发中,很少会用原生JS来开发页面,最基本的都会使用jQuery来节省我们开发的时间和效率,而angular,vue,react的出现更是为前端开发者带来了福音。那么这篇文章就说说如何用webpack来打包引入第三方框架(类库)。如果单纯的引入jQuery或者其他第三方类库,在打包的时候webpack会把它一起打包进我们的main.js,也就说,如果我们引入两三个框架,两三个UI库,那么我们的集成包会很大,页面的加载时间也会很长,这是我们不愿见到的结果。所以在学会引入的同时,还要知道如何把第三方类库从我们的业务逻辑包中抽离出来。

  那么我们先来安装一下jQuery,因为在生产环境我们仍旧是需要jQuery作为依赖的,所以我们需要用npm install jquery --save来安装它。安装完成之后,我们在main.js中增加两行代码:

  1. //引入jQuery
  2. import $ from 'jquery';
  3. //编写jQuery代码
  4. $('#jqueryDiv').html('Hello Zaking,jQuery is useful');

  我们还需要在index.html中增加一个div容器:

  1. <!-- jQuery代码容器 -->
  2. <div id="jqueryDiv"></div>

  然后,我们npm run dev看一下,会发现页面中已经有jQuery代码所生成的文字,说明我们引入jQuery成功了。你可以在每一个需要jQuery的页面这样引入。但是这样会很麻烦,我们如果通过这样的方式引入了jQuery,但是整个项目中却并没有写一行jQuery代码,那么webpack也是会把它打包进去的。而且每一个需要jQuery的页面都需要引入的话好麻烦,那么我们可以使用ProvidePlugin来实现一次引入全局使用,而且通过插件的方式来引入第三方类库,如果你不使用它的话,webpack就不会打包它,还不错吧。由于ProvidePlugin是webpack自带的插件,我们不需要引入他,但是需要引入一下webpack:

  1. //引入webpack
  2. const webpack = require('webpack');

 我们还需要在入口文件引入jQuery,还记得前面模块化的时候把入口文件单独拆分成了一个entry.js,所以我们在其中增加一点代码,现在看起来应该是这样的:

  1. entry.path={
  2. main:'./src/main.js',
  3. jquery:'jquery'
  4. }

 然后我们在plugins项下配置一下这个插件,就像这样:

  1. //创建一个webpack下的ProvidePlugin插件的实例,使全局都可以使用jQuery
  2. new webpack.ProvidePlugin({
  3. $:"jquery"
  4. })

  这样就可以了,但是别忘了把main.js中通过import引入的jQuery代码删除,然后再npm run dev试一下。会发现也同样出现了jQuery生成的文字。

  那么下面我们就学习一下,如何抽离第三方类库,使其存储在一个单独的文件夹下,在webpack3时代,通常是使用CommonsChunkPlugin,CommonsChunkPlugin也是webpack自带的插件。官方文档是这样解释他的:CommonsChunkPlugin 插件,是一个可选的用于建立一个独立文件(又称作 chunk)的功能,这个文件包括多个入口chunk 的公共模块。通过将公共模块拆出来,最终合成的文件能够在最开始的时候加载一次,便存到缓存中供后续使用。这个带来速度上的提升,因为浏览器会迅速将公共的代码从缓存中取出来,而不是每次访问一个新页面时,再去加载一个更大的文件。

  简单来说,就是将公共模块拆分出来以便使浏览器加载速度更快。但是在webpack4时代,已经取消了这个插件取而代之的是splitChunks 和runtimeChunk ,那么我们就来看一下,在webpack4的环境下,如何抽离多个第三方类库。

  我们先来安装一下vue,跟jQuery的安装方式一样,就不多说了,同样的我们也需要在入口文件处引入vue:

  1. entry.path={
  2. main:'./src/main.js',
  3. //引入jQuery和vue
  4. jquery:'jquery',
  5. vue:"vue"
  6. }

  然后再ProvidePlugin中加入vue这个选项:

  1. new webpack.ProvidePlugin({
  2. $:"jquery",
  3. vue:"vue"
  4. })

  然后我们在plugins中增加一个配置:

  1. new webpack.optimize.SplitChunksPlugin({
  2. chunks: "all",
  3. minSize: 20000,
  4. minChunks: 1,
  5. maxAsyncRequests: 5,
  6. maxInitialRequests: 3,
  7. name: true
  8. })

  然后我们npm run build一下,会发现在dist的根目录下已经生成了vue.js和jQuery.js。说明我们打包成功了。那么我们想要测试一下,vue究竟能用了么?

  我们在main.js中引入vue,并且加上vue官网例子中最简单的一个:

  1. import Vue from 'vue'
  2. //vue代码
  3. var app = new Vue({
  4. el: '#vueApp',
  5. data: {
  6. message: 'Hello Vue!'
  7. }
  8. })

  然后,我们在index.html创建一个div容器:

  1. <!-- vue容器 -->
  2. <div id="vueApp">
  3. {{message}}
  4. </div>

  然后我们试一下npm run dev,页面打开之后我们发现没有hello vue,f12看下控制台,发现报错了。不出意外的话,你的报错信息是这样的:

  什么意思呢,官方解释是:运行时构建不包含模板编译器,因此不支持 template 选项,只能用 render 选项,但即使使用运行时构建,在单文件组件中也依然可以写模板,因为单文件组件的模板会在构建时预编译为 render 函数。就是说,如果我们想使用template,我们不能直接在客户端使用npm install之后的vue

  那么我们需要新增一点配置:

  1. resolve: {
  2. alias: {
  3. 'vue$': 'vue/dist/vue.esm.js'
  4. }
  5. }
  6. //resolve是在最外层的,与plugins等同级

  这样就可以了,然后运行一下,会发现Hello Vue已经出现在我们的页面之中了。这两天一直加班,所以更新的有点慢,这个系列的文章还有最后一篇,尽量在这两天就可以完成。

走进webpack(2)--第三方框架(类库)的引入及抽离的更多相关文章

  1. xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误

    xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误 一:场景 xcode 同时引入了 libA.a, libB.a 两个静态类库,如果 这两个静态类库之中 ...

  2. 第三方框架ViewPagerIndicator引入到Android Studio的方法总结

    原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6286619.html 第三方框架ViewPagerIndicator实现的效果比较好,但当我们从G ...

  3. Angular4.0引入第三方框架,eg: bootstrap、jquery

    最近学习angular4.0,在练习是需要使用jquery和bootstrap.但是查阅了,大多数都是angular2的方法,或者是angular4.0的方法但是不准确.花了一些时间终于捣腾出来了,把 ...

  4. 小程序第三方框架对比 ( wepy / mpvue / taro )

      众所周知如今市面上端的形态多种多样,手机Web.ReactNative.微信小程序, 支付宝小程序, 快应用等,每一端都是巨大的流量入口,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端 ...

  5. 二:新浪微博:第三方框架管理工具CocoaPods的安装和使用

    一:CocoaPods的安装 我们可以用淘宝的Ruby镜像来访问cocoapods.按照下面的顺序在终端中敲入依次敲入 $ gem sources --remove https://rubygems. ...

  6. iOS-常用的第三方框架的介绍

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

  7. 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】

    JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...

  8. 使用CocoaPods管理第三方开源类库

    iOS开发中经常会用到许多第三方开源类库,比如AFNetworking.FMDB.JSONKit等等,使用CocoaPods这个工具就能很方便得对工程中用到的类库进行管理,包括自动下载配置以及更新. ...

  9. GitHub 里面有大量优秀的第三方框架

    写iOS 程序的时候往往需要很多第三方框架的支持,可以大大减少工作量,讲重点放在软件本身的逻辑实现上. GitHub 里面有大量优秀的第三方框架,而且 License 对商业很友好.一下摘录一下几乎每 ...

随机推荐

  1. Linux下LCD 10分钟自动关屏的问题总结

    Linux下的LCD驱动默认10分钟后会自动关闭屏幕,我们可以修改一下代码让其不自动关屏 在有一个 drivers/char/vt.c 文件其中有一个变量(blankinterval)可以设置它来修改 ...

  2. Java和Flex整合报错(四)

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  3. 芝麻HTTP:批量部署Splash负载集群

    安装Ansible: 看官方文档去:http://www.ansible.com.cn/index.html 好像这个主控端不支持Windows? 大家虚拟机装个Ubuntu吧. 闲话少扯直接上干货: ...

  4. hdu5820 Lights

    主席树 但是能够想到题解的做法很难 #include <stdio.h> #include <string.h> #include <vector> #includ ...

  5. 爬虫工具fiddle在firefox浏览器中的使用

    1.fiddle工作原理 浏览器与服务器之间通过建立TCP连接以HTTP协议进行通信,默认通过自己发送HTTP(或HTTPS)请求到服务器. 使用Fiddler之后,浏览器像目标服务器发送的请求都会经 ...

  6. 【BZOJ3172】单词(AC自动机)

    [BZOJ3172]单词(AC自动机) 题面 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...

  7. jQuery 事件代理时的this

    在jQuery使用on方法进行事件代理的时候,this是有多种变化的.下面开始对其进行研究 HTML的代码: <ul id="selected-plays" class=&q ...

  8. C++学习-3

    引用与函数指针: 函数指针就是把函数名挖掉变成*p 函数指针的类型就是把p去掉 函数指针的引用(引用就是在类型和名字的中间加&) 函数指针加一个()就成调用函数了-----------p() ...

  9. 自动化之路 Graphite监控上手指南

    自动化运维怎能少了监控,推荐Graphite监控,下面是配置地址 http://www.infoq.com/cn/articles/graphite-intro/ Graphite官网 http:// ...

  10. OSI七层模型对应的协议

    osi七层模型对应的协议 author:headsen chen    2017-10-21  11:44:47 个人原创,转载请注明作者,出处.否则依法追究法律责任 1,物理层:带信号的,同轴电缆, ...