达观数据:基于webpack实现Web工程搭建

1.引言

随着互联网前端技术的发展,在前端工程愈发复杂多变的今天,模块化已经变成了前端从业者津津乐道的话题,各种模块化工具层出不穷。seajs, requirejs,bower,browserify 以及我们今天所要提到的一款前端模块化工具—webpack。达观数据的前端技术选型中也时常选用webpack作为模 块化管理工具。

图1 webpack

2.什么是webapck

Webpack从诞生到现在也有些年头了,现在已经更新到2.0版本了。它是一款优秀的模块加载器兼打包工具,其最大的特点是视一切资源为模块,可以把任何形式的资源都视作模块并引入到工程中,如commonJs模块,AMD模块,Sass, Less, Json, img,es6模块(2.0版本添加支持)等等。并且,你可以通过module, plugins等参数对依赖的模块进行整合打包,可以替代一部分gulp, grunt类似的打包功能。

图2 modules with dependencies

3.为什么要用webpack

webpack作为一款模块管理器有着自己独具的优势。

首先就是上一段提到的,webpack会把任何形式的资源都当做模块进行打包,传统的模块加载器仅仅针对js,webpack可以对任何形式的资源进行打包,使得项目管理起来更加的方便。

其次,webpack对AMD/CMD的模块加载模式都能兼顾,可以按个人的喜好选择模式进行模块依赖管理。

再者,webpack可以替代一部分gulp/grunt的工作。他的loader机制可以实现一部分压缩混淆的操作。

4.如何使用webpack

笔者准备的是一个单页demo,此处首先列一下目录结构,仅做参考。

├── dist #发布目录

├── package.json

├── src #工程源码

│ ├── assets #静态资源

│ ├── index.html

│ ├── index.js #入口文件

│ ├── js

│ ├── styles

│ └── utils #工具库

└── webpack.config.js #webpack配置文件

4.1安装

在项目的根目录下运行:

npm init

npm install -D webpack

创建webpack配置文件webpack.config.js

4.2配置

一个webpack配置主要包含entry, output, modules, plugins和resolve这几类字段。

entry定义了文件的入口配置,output对应的是项目的输出配置。(如图3所示)这里的filename使用了hash字段添加hash后缀,解决因缓存导致的页面内容不更新的问题。

本文所提供的例子是单页模式,所以并没有多个入口。如果有多个入口的需求,可以通过以下的形式(图4)生成。编译后,代码会在outputDir目录下生成多个文件的bundle.js。

图3 webpack entry/output配置

图4 webpack 多入口的entry/output配置

Loaders是webpack.config中的核心内容。它规定了每个模块使用哪种加载器来处理。具体配置如图5所示。可以观察到,loaders包含了很多个loader, 每个loader会使用test字段匹配文件名,如果符合其正则,那么可以通过loader字段对该文件进行加载。所有的加载器都需要使用npm进行安装。例如:如果我想使用css-loader,那么在根目录下运行npm install css-loader -D即可安装对应的loader,不用把loader通过require的方式引入,webpack自己可找到对应的加载器。然后在loader字段中写明loader: ‘css-loader’,这里的‘-loader’可以省略不写。文件也有可能会使用多个加载器,使用!进行分隔,多个loader加载的执行顺序是从右向左,在实际操作过程中需要注意这一细节。涉及到参数的字段使用?进行添加,使用’&’进行分隔多个参数。

图5 webpack loader配置

Loaders功能固然强大,但也有很多事情不能通过loaders实现。例如,webpack的loader默认会把所有的文件都打包到一个bundle中,而实际的项目中为了网站的性能,html、css、js等资源一般都是需要分开并有选择的进行异步加载的。这时候就需要plugins在上线过程中进行一些处理了。在此,介绍一些常用的plugins。

HtmlWebpackPlugin,用于创建服务wepack打包的bundle的HTML文件。该插件需要安装npm依赖html-webpack-plugin,并通过require引用进来。

ExtractTextPlugin,用来从bundle中剥离css的插件,一般在生成线上版本时加入到plugins中。需要通过npm 来安装extract-text-webpack-plugin依赖。

UglifyJsPlugin,用于压缩混淆打包生成的bundle文件。这个plugin是webpack内置的,将

webpack require进来后,通过webpack.optimize.UglifyJsPlugin进行调用。

OptimizeCssAssetsPlugin,用于压缩css文件。需要安装npm依赖optimize-css-assets-webpack-plugin。

Resolve是用来简化模块配置的一项,其中比较常用的字段有alias, extensions等。alias定义模块别名,避免出现依赖名称过长的引用。 extensions定义默认的扩展名,webpack默认忽略的扩展名是.js,也就是说在项目中你可以通过require(‘js/index’)即可获取到js目录下的index.js文件,而通过extensions,你可以设置更多可以识别的后缀。

图6 webpack resolve配置

4.3命令行设置

写好了webpack.config.js后,我们可以在根目录下运行webpack命令,即可实现webpack的工作流。这里顺便提一下webpack命令常用的一些参数。

-colors 输出带颜色的命令

-progress 输出打包显示

-watch 动态监测依赖文件变化并进行更新

-hot 热插拔

-p 对打包的文件进行压缩

在实际项目中,如果有gulp/grunt一类的工具,可以使用gulp/grunt的自身机制设置不同运行环境。如果没有此类工具,也可以选择将命令封装到npm scripts中。如图所示,按照这种方式进行设置,只需要运行npm run + 关键字,即可运行对应的命令,避免了在调试过程中频繁的输入大量的字符和参数。

5.webpack的图片加载

图片资源引用方式多变,在使用webpack的过程中,不同场景下的图片引用往往会困扰着初学者。这里简单介绍一些webpack的图片处理方式。

一般来说,webpack中的图片都可以通过url-loader来实现加载(图7)。这里主要针对js和css文件中依赖的图片资源。(施列宇 达观数据)

图7 通过url-loader实现webpack对图片的加载

url-loader也是一个很实用的loader,它可以对图片资源进行筛选,当图片很小时,url-loader可以选择将图片编译成base64格式放进bundle文件中;也可以实现给图片添加hash码等等。

如果图片是通过js代码进行加载,需要注意的是,图片资源必须要用require的方式进行引用,否则webpack不能识别相应的图片。

图8 使用require进行图片加载

如果图片是通过scss/css进行加载。首先,图片也必须通过入口文件将图片添加至依赖中。这样即使图片路径有发生变动,webpack也会在后续的处理中将css中对应的路径进行替换。

对于html中的图片处理方式,首先是webpack对于多html的支持并不好,进而导致相关页面中的图片路径问题很难解决。如果是使用webpack+react的多入口方式进行项目搭建,react的自身特性决定了它可以通过require的方式解决此类问题。但如果不是react页面我们应该如何处理呢?

笔者在这里向大家推荐一个插件html-withimg-loader。安装了html-withimg-loader后,在入口文件中require相应的html文件,webpack即可识别html中对应的img标签了。

图9 在入口文件中添加含img元素的html

如果图片希望在入口html中也想识别图片资源,可以使用HtmlWebpackPlugin插件中的template字段对其进行设置,在template中补充相应的loader,即可完成配置。

图10 使用html-withimg-loader插件对入口html添加图片依赖

6总结

webpack是一款十分优秀的模块管理器。它语法易懂,配置简单,可以实现高效快速的搭建前端工程。在实际项目中,webpack的运用已不鲜见。尤其是react框架一经推广后,react好搭档webpack的地位也日益提升。本文从多个角度对webpack进行了阐述,相信读者在阅读完后定能有所收获。

本文作者:施列宇

来源:51CTO

时间: 2024-10-24 03:46:34

达观数据:基于webpack实现Web工程搭建的相关文章

Spring Boot快速搭建Web工程

先想一下,正常我们想要创建一个web服务,首先需要下载tomcat,创建web工程,配置各种web.xml,引入spring的配置,各种配置文件一顿倒腾.....下载有了spring boot,你创建一个web工程只需要一个java类,甚至都不需要下载tomcat,直接右键执行就能启动一个web服务.听起来就让人感觉兴奋! 最近我也是工作有需要,需要新建一个微服务的模块.正好公司比较开放,支持搞搞新技术,于是就在同事的怂恿下采用Spring Boot创建了一个工程.使用后发现如果熟练掌握一些配置

从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate_java

   本文会介绍从一个最基本的java工程,到Web工程,到集成Spring.SpringMVC.SpringDataJPA+Hibernate.     平时我们可能是通过一个模板搭建一个工程,或者是直接导入一个项目,而本文选择从最基本的java工程开始,目的是为了展示更多原理.     当然,我们还是从一个最基本的Maven工程开始,其实普通的非Maven工程,搭建过程几乎是一模一样的,只是Jar包需要我们手动的添加到工程中,而Maven工程就只是修改配置文件即可.   下面就正式开始. 1

Java 与 .NET 的基于 WS-Security的Web Services集成实现(上)

services|web Java 与 .NET 的基于 WS-Security的Web Services集成实现 rottenapple 本文适用读者: Web Services开发人员 应具备的知识: 使用过VS.NET2003 +WSE开发过Web Services,会使用Jbuilder9开发简单的java应用程序. 一:内容简介 WS-Security描述通过消息完整性,消息机密性和单独消息认证提供保护质量的SOAP消息传递增强.适用于下列场合: 1. 客户必须能够确定消息来自哪个人并

如何在Web工程中实现任务计划调度

好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过时钟报警.系统自动关机等趣味程序,可却很少有朋友在Web工程中实现过类似功能.今天有空把笔者先前曾在Tomcat上实现的类似功能,搬出来与大家共享. 早在几年前,我公司跟某市财政局合作项目开发,为加强财政局对所属单位财务状况的有效监管,开发.实施了财政局数据中心项目.此项目采用B/S加C/S混合结构模式.财政局Web服务器上架设数据同步接收装置,由市属单位每天下班前把财务信息通过HTTP协议上传至财政局中心服务器,与Web服务器上的接

在 Apache Tuscany 上开发基于 SCA 的 Web 2.0 应用

引言 如今在企业级应用中,Ajax.Widget.RSS/Atom 等 Web 2.0 技术正在得到越来越广泛的使用,这些技术不但产生了良好的用户体验,同时也来越来越多地影响着许多前端系统的编程模式和系统架构.许多传统的 Java EE 产品和框架也在越来越多地引入这些 Web 2.0 技术,如 Struts2 和 JSF 都有了越来越完善的 Ajax 扩展,Portal 产品中也基于 Dojo 等 javascript 框架引入部分刷新等机制,大幅提升了性能和用户体验.可以看出,Web 2.0

达观数据新用户推荐的三大利器

推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣,但对于新用户而言,没有任何的用户行为,如何进行最有效的推荐呢?这就衍生了用户冷启动问题.在当下,企业拉新成本越来越高,用户的选择面也越来越多,当新用户到达之后,如果不能很快的捕捉用户兴趣,推荐其所感兴趣的物品,很容易造成用户流失.所以能否解决好冷启动问题,是推荐系统非常重要的课题 达观数据研发的个性化推荐引擎目前服务了上百家企业,行业覆盖了新闻,视频,直播,文学,电商等领域,每天API调用量超过10亿,覆盖近亿网民.本文主要介绍下达观

贵阳打造创新型中心城市 大数据引领打造十大工程

<中共贵阳市委关于以大数据为引领加快打造创新型中心城市的意见>提出四大配套文件,其中<以大数据为引领打造创新型中心城市的十大重点工程>提出要打造数据资源汇聚工程,数据共享开放工程,数据铁笼工程,数据政务工程,数据民生工程,数据扶贫工程,数据产业集聚工程,大数据助推产业升级工程,数据金融工程,以及数据立法.安全与标准工程十大工程. 其中提出,贵阳市将建设"云上贵州·贵阳平台",搭建统一汇聚全市各部门政务数据和公共数据的贵阳市政务数据资源中心,同时大力引导和鼓励其他

基于OSGI的WEB项目如何加载制定文件夹jsp文件运行

问题描述 现在手上开发的一个项目是基于OSGI的web项目,运行期会把模块打成jar包放在一般web工程下面去运行,运行环境暂订tomcat. 现在出现的问题如下:项目中有一个模块会生成一些文件到指定文件夹中(运行期为文件服务器),生成的文件包括js,jsp,css文件,其中js会到模块中去做请求后台数据,并且生成的文件会用到模块中的js或css样式.请问如何才能将生成的文件加载到tomcat中运行. 解决方案 可以参考一下这个:http://www.enet.com.cn/article/20

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端