详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)

最近在项目中使用了一下webpack,所以这里打算对目前了解的使用方法做一个小小的总结

为什么是webpack

1.webpack一下自己就🔥了,这绝对是一个重要的原因。

2.然后我之前项目中都是通过requireJS,通过AMD来做到模块化开发。webpak不仅支持打包,而且支持AMD 和 CommonJS方式来做模块化开发,所以打算尝试一下webpack来实现模块化。

3.我的需求简单,适合新上手webpack,只需要生成上线目录,实现模块化,压缩代码等等

webpack实战

webpack.config.js 一般写法

开头声明对路径相关的变量,以及引入依赖,包括webpack(非必须),以及需要的插件
 然后,entry 声明入口相关的如文件名,路径等,output 声明生成文件相关的路径和文件名,module 中是针对不同文件进行处理的 loader 声明,plugins 声明了插件的具体使用。

压缩代码

这里使用webpack的内置的插件,我们写在webpack.config.js 中的plugins 部分

new webpack.optimize.UglifyJsPlugin({
  compress: {
    warnings: false
  }
})

提取公共类库

这部分我没有用到,但也是基于webpack 内置的插件,目的是将用到的jquery 等第三方库整合到一个文件,否则都合并到一个文件,会造成这个文件特别大

首先在entry 声明第三方库

entry: {
  app: path.resolve(APP_PATH, 'index.js'),
  //添加要打包在vendeors里面的库
  vendors: ['jquery', 'moment']
},
plugins: {
   //把入口文件里面的数组打包成vendors.js
  new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js'),
}

css 单独打包

有的时候需要将css 单独打包,作为CDN,或者我这里的情况是是,页面引入了很多的css js 文件,而我的js 在最后加载!所以如果是js 中引入的css ,那么会导致页面在开始的时候没有样式,知道解析到我的js !所以这里将css 单独打包,单独在页面引入!

首先需要安装插件

npm install extract-text-webpack-plugin –save-dev

然后在webpack.config.js 中声明插件

// 引入css 单独打包插件
var ExtractTextPlugin = require("extract-text-webpack-plugin");
// 设置生成css 的路径和文件名,会自动将对应entry入口js文件中引入的CSS抽出成单独的文件
var packCSS = new ExtractTextPlugin('./css/[name].min.css'); 

在plugins 中引入并使用

 plugins: [
  packCSS
 ]

我们需要首先在js 中引用相应的css文件

 require('./css/plan.css');

然后这个插件会自动将js中的css文件提取出来,生成单独的文件

样式的处理

安装 css-loader style-loader

 npm install css-loader style-loader --save-dev

css-loader会遍历css文件,找到所有的url(...)并且处理。style-loader会把所有的样式插入到你页面的一个style

 module: {
   loaders: [
    {
     test: /\.css$/,
     loaders: ['style', 'css'],
     include: APP_PATH
    }
   ]
 }

图片的处理

安装 url-loader

npm install url-loader --save-dev

webpack.config.js

{
  test: /\.(png|jpg)$/,
  loader: 'url?limit=8192&name=images/[hash:8].[name].[ext]'

}

limit 设置一个阈值,小于这个值得图片就会自动启用 base64 编码的图片,大于这个值的图片会打包到name 这参数对应的路径,图片名称就会包括8位md5编码 name 对应文件本来名称,ext 对应扩展名

我在图片这里遇到的问题和 css 类似,都是原本我是在 js 中引入 css img 等静态资源。但是
 因为我的页面引入了很多的 css, js 文件,而我的js文件放到最后加载,所以会导致我的js引用的css img 在最后才加载。这会导致页面开始的时候会出现没有样式,而图片刚开始会显示失败的问题。

我本来也希望将 img 单独打包,但是搜索也实践了,没有找到可靠地实现方式,于是我把图片放到了其他公共资源目录(~~~~(>_<)~~~~,只好暂时出此下策了)

一个页面一个js 文件

我做的项目是多个页面的,所以需要生成每个页面对应的不同 js。这里的处理方法就是我们每个 js 都作为一个不同的入口文件现在 enrty 中。这样设置好 output 中的公共路径,就能得到不同的 js 文件。

  entry: {
    creative: './src/static/js/apps/idea.js',
    plan: './src/static/js/apps/plan.js',
  },
  output: {
    path: 'dist/',
    filename: 'js/[name].min.js'
  }

更新

代码切分以及异步加载

今天遇到的问题是,我做的一个页面是要分为四个步骤,每个步骤在进入下一步的时候需要对下一步的内容进行接口请求,页面渲染和事件绑定等操作。

之前的做法

拆分了各个步骤对应模块之后,我通过commonJS的方式在入口文件开头引入了各个模块

这时候是这样的

  var stepOne = require('./mods/stepone.js');
  var steptwo = require('./mods/steptwo.js');
  ...

  // 使用的时候
  stepone.checkOne();

这种做法,因为commonJS 的同步加载机制,会导致入口文件打包之后非常臃肿。在首屏,用到用不到处理代码的都会在一开始就加载,严重影响了首屏加载时间。

代码切分之后

我利用webpack的code splitting 特性,将各个步骤的代码进行拆分,实现按需加载。这里主要利用了 webpack 的 require.ensure 函数实现的。非常方便,只需要把异步加载的代码,放到 require.ensure 里面的回调函数就可以实现:

  require.ensure(['./mods/stepone.js'], function(){
    var stepone = require('./mods/stepone.js');
    stepone.checkone();
  }, 'stepone'); // 第三个参数设置打包名称

这样设置,webpack 就会单独生成拆分的文件,我们还需要设置拆分文件的名字和路径。这里我费了一番周折。

webpack 默认给拆分的文件用数字命名,如果我们自己不进行设置,会得到 1.min.js 这样类似的文件。我们可以在 webpack.config.js 中,通过 output.chunkFilename 来设置分块生成文件的名称,分块的路径可以通过 output.publicPath 设置。这里一定要设置 publicPath,不然得到的路径有可能不是我们上线打包的路径。具体我的设置如下:

  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'js/apps/[name].min.js',
    publicPath: '/dist/', // 设置require.ensure路径
    chunkFilename: 'js/apps/[name].min.js' // 设置require.ensure 文件名
  }

总结

webpack 使用起来感觉非常新颖,也容易入手!今天总结的多是入门的内容,后续还要继续使用~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解webpack分包及异步加载套路

    最近一个小项目是用webpack来进行构建的.其中用到了webpack分包异步加载的功能.今天抽时间看了下webpack打包后的文件,大致弄明白了webpack分包及异步加载的套路. 由于这个小项目是用自己写的一个路由,路由定义好了不同路径对应下的模板及逻辑代码: webpack配置文件: var path = require('path'), DashboardPlugin = require('webpack-dashboard/plugin'), HtmlWebpackPlugin = r

  • 详解webpack异步加载业务模块

    虽然把我们用到的JS文件全部打包一个可以节省请求数,但如果打包后的JS文件过大,那么也容易出现白屏现象,许多操作失灵.而且一些区域是点到才出现,那么相关的JS其实可以剥离出这个大JS文件外.这就涉及到异步加载了.异步加载是SPA的重要构建方式之一. 我们沿着上一篇的目录,这次学习webpack的require.ensure API.此文件也叫做ensure.html,涉及到avalon, jquery,还有两个业务代码ensure.js与ensure_a.js. 先看我们的页面: <!DOCTY

  • 详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)

    最近在项目中使用了一下webpack,所以这里打算对目前了解的使用方法做一个小小的总结 为什么是webpack 1.webpack一下自己就

  • 详解webpack 入门与解析

    每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如html5.cmd中切到当前文件夹. npm init -y 这个命令会创建一个默认的package.json.它包含了项目的一些配置参数,通过它可以进行初始安装.详细参数:https://docs.npmjs.com/files/package.json. 不要y参数的话,会在命令框中设置各项参数,但

  • 详解springBoot启动时找不到或无法加载主类解决办法

    1.jar包错误 第一步:首先鼠标键右击你的项目,点击run as-->maven clean 第二步:鼠标键右击你的项目,run as--->maven install:在eclipse控制台你可以看见报错的jar包: 第三步:去maven仓库删除对应的jar,右击你的项目,maven-->update project(重新下载jar包): 第四步:重复一,二步骤,找到你的启动类,run as java application;问题解决 2.jdk报错 打开你的项目结构,找到libra

  • 详解angular2采用自定义指令(Directive)方式加载jquery插件

    由于angular2兴起不久,相关插件还是很少,所以有时候不得不用一些jquery插件来完成项目, 那么如何把jquery插件放到angular2中呢?采用自定义指令! 在上下文之前要引入jquery,这点不再描述 首先创建一个指令,采用@input方式,来获取jquery插件所需要的参数. 在ngOnChanges时,也就是参数通过@input传入时,初始化jquery插件, 初始化jquery插件需要获取dom元素,所以我们引入ElementRef,用来获取dom元素 这里需要讲一下,jqu

  • 详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖

    最近在使用AngularJS,发现AngularJS菜鸟教程上的东西太过于基础,很多东西都没有提及,比如今天的一个关于前端的优化问题,懒加载.通过路由实现地址分发的时候,再通过懒加载模式加载你所需的文件,比如是相关的controller,就是js,这样有利于提高首次加载的负担. 下面就是一个懒加载的实现过程. 实现的过程主要是引用3个主要的JS文件: <script src="angular/1.4.8/angular/angular.min.js"></script

  • 详解Android 在 ViewPager 中使用 Fragment 的懒加载

    我们先看一下效果: 首先,我们要知道什么是懒加载: 懒加载,就是先初始化控件,在用户可见的时候再加载数据. 为什么要懒加载? 懒加载多被使用在新闻资讯类客户端中,试想那么多的分类如果一下子都加载出来,真的是极大地消耗了系统资源.可能有人会说 ViewPager 有 viewPager.setOffscreenPageLimit() 的方法,我们传个 0 进去不就好了吗?看过源码的应该知道,即便你传了 0 进去,系统也会默认为 1 的,也就是 ViewPager 依然会加载当前页面的前后各一个 F

  • 详解性能更优越的小程序图片懒加载方式

    意义 懒加载或者可以说是延迟加载,针对非首屏或者用户"看不到"的地方延迟加载,有利于页面首屏加载速度快.节约了流量,用户体验好 实现方式 传统H5的懒加载方式都是通过监听页面的scroll事件来实现的,结合viewport的高度来判断. 小程序也类似,通过监听页面onPageScroll事件获取当前滚动的数据,结合getSystemInfo获取设备信息来判断.由于scroll事件密集发生,计算量很大,经常会造成FPS降低.页面卡顿等问题. 这里说的是通过另外一种方式来实现 create

  • 详解使用JRebel插件实现SpringBoot应用代码热加载

    前言 在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,在我之前的文章里面给读者介绍了使用springboot-devtools实现热加载的方法.本文就给大家介绍另外一种方式:使用Jrebel插件完成修改代码及资源的自动更新功能. 但是对于这个功能很多人对功能的叫法有争议,笔者查询了维基百科.官方文档,没有得到合理的答案,也没有权威的定义,笔者知道的就有:热启动.热加载.

  • 详解webpack与SPA实践之开发环境搭建

    目前,公司前端项目开发技术栈基本改造为使用gulp进行自动化构建,webpack进行项目模块化依赖管理,Vue+ Vuex + Vue-Router作为项目组件化开发框架,为了更深入的理解.使用当前技术栈并与读者分享.交流,计划推出一系列相关学习与实践文章.本篇为开篇,主要讲述如何使用webpack搭建开发环境. 项目初始化 以你喜欢的任意方式,创建项目根目录,如: mkdir vue-hello 初始化包模块管理文件 进入项目根目录,初始化项目包模块管理文件package.json: npm

随机推荐