作者:Jogis
原文链接:https://github.com/yesvods/Blog/issues/3
转载请注明原文链接以及作者信息

前一篇文章介绍了webpack以及安装方法,这次将会介绍webpack在单页面应用程序(Single Page Application)与多页面站点不同场合的用法。

输入与输出

跟其他模块加载器类似,webpack也是需要配置一个入口文件,比如是entry.js
有几种配置方式,下面来介绍一下直接把入口文件写在配置文件 webpack.config.js:

module.exports = {
entry: {
"entry":"./entry.js"
},
output: {
path: "build",
filename: "bundle.js"
}
}

通过命令行

> webpack

很便利地,webpack检测配置文件,读取模块入口与输出路径和文件名,将文件依赖整合成一个文件,输出到build/bundle.js

通过在HTML简单引入

<script src="./build/bundle.js"></script>

就可以在浏览器运行。

加载器

简单的SPA程序加载,包括:JS编译与加载、CSS编译与加载、图片加载与压缩、JS与CSS压缩。

Webpack提供了一套加载器机制,比如:css-loader、style-loader、url-loader等,用于将不同资源加载到js文件中,例如url-loader用于在js中加载png/jpg格式的图片文件,css/style loader 用于加载css文件,less-loader用于将less文件编译成css。

下面介绍一些常用的加载器(详细介绍在这里):

style+css+less加载Bootstrap less版本:

require('style!css!less!./bower_components/bootstrap/bootstrap.less');

style+css 加载一般样式文件:

require('style!css!./styles/main.css');

url 加载图片资源文件:

require('url!./images/logo.png');

json loader加载json格式文件:

require('json!./data.json');

js后缀的文件不需要使用加载器

require('./scripts/main.js');

coffee script加载

require('coffee!./scripts/main.coffee');

喜欢尝鲜的童鞋可以通过Babel loader体验ES6/7特性:

require('babel!./scripts/es6.js');

需要注意的是,避免用babel作为加载器加载所有node_module模块,会出现意外结果,而且大量加载情况下,加载时间很长。babel还可以用作reactjs jsx文件加载使用,详细请看。

配置加载器

刚刚介绍了行内加载资源的方式,如果有很多css或者图片资源需要加载,重复写加载器显得很笨拙,webpack提供另一种方式加载资源。
在配置文件添加配置:

module.exports = {
module: {
loaders: [
{test: /\.css$/, loader: "style!css"},
{test: /\.(png|jpg)$/, loader: "url-loader?limit=8192"}
]
}
}

其中test是正则表达式,对符合的文件名使用相应的加载器
/.css$/会匹配 xx.css文件,但是并不适用于xx.sass或者xx.css.zip文件
/.css/除了匹配xx.css也可以匹配xx.css.zip

加载器后可以加入?xx=yy传递参数,表示添加将xx设置为yy(跟http地址Query很像)

需要注意的是,使用加载器前需要使用

> npm i --save xxx-loader

安装相应加载器,并通过--save把依赖配置到package.json中,使用加载器并不需要使用require引入。

搜索路径变量

以上介绍的加载器,可以很方便使用webpack整合日常资源,如果认为webpack仅仅只能做这些,那就让您失望了。

可以看到,以上加载资源时候,都使用相对路径来描述路径,对于那些./app/src/scripts/main.js通过修改webpack配置文件,添加默认搜索路径后,显得更加优雅。

// webpack.config.js
var path = require("path")
module.exports = {
resolve: {
alias: {
js: path.join(__dirname, "./app/src/scripts")
}
}
}

更改配置文件后加载:

require("js/main.js");

默认搜索路径配置

对于bower_components死忠们,前端开发少不了几个bower插件,使用gulp可以通过gulp-wiredep来动态把bower.json dependencies加载到指定HTML文件。
在webpack也有非常便利的导入方法:
首先,加入配置

module.exports = {
resolve: {
alias: {
js: path.join(__dirname, "src/scripts"),
src: path.join(__dirname, "src/scripts"),
styles: path.join(__dirname, "src/styles"),
img: path.join(__dirname, "src/img")
},
root: [
path.join(__dirname, "bower_components")
]
},
plugins: [
new webpack.ResolverPlugin(
new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(".bower.json", ["main"])
)
]
}

resolve.root 表示添加默认搜索路径,使用如下语法:

require("jquery");

webpack会在bower_components/jquery目录下进行查找CommandJS模块node_module/index.js、index.js
但是,因为Bower不属于CommandJS规范范畴,使用的是bower.json main属性指定项目入口文件
说到这里,大家就知道plugins里面那串东东是干嘛的啦

之后,我们就可以很方便在任何js文件里面引用jquery:

var jQuery = $ = require("jquery");

需要注意的是,require的并非jquery.js,而是bower_components目录下的文件夹名

多页面开发

webpack 不仅仅适用于SPA开发,对于多页面站点,webpack支持得很好,通过更改配置文件为多入口:

module.exports = {
entry: {
"entry":"./src/scripts/entry.js",
"swiperEffect":"./src/scripts/swiperEffect.js"
},
output: {
path: "build"
filename: "[name].bundle.js"
}
}

output设置里面,[name]代表entry的每一个键值,因此运行webpack时候,会输出对应的两个文件:

build/entry.bundle.js
build/swiperEffect.bundle.js

然后就可以在index.html和about.html两个页面分别引用啦

文件分离

前端工程一项就是减少http请求,这表示需要把多个js合并成一个,但是,单个js文件过大会影响浏览器加载文件速度,由于现在浏览器并发http请求多达6个,可以利用这个特性,将可复用第三方资源库分离加载。

使用CommandJS规范的

//entry.js
require.ensure(["jquery", "imgScroll"], function(require){
var $ = require("jquery");
require("imgScroll");
$("#container").scroll({
XXX
})
})

通过require.ensure声明的文件,称作按需加载依赖,这些依赖会独立出来一个文件,待入口模块加载完,需要请求时候才会相继加载

再次编译webpack:

build/entry.bundle.js
build/swiperEffect.bundle.js
build/2.2.bundle.js

其中2.2.bundle.js就是jquery+imgScroll异步加载内容
一图胜千言:

可以看到2.2.bundle.js在entry.bundle.js加载完后进行异步加载。

webpack 实用命令

除了简单运行webpack,还可以添加几个参数,方便部署文件处理。

输出js文件,经过uglify进行压缩:

> webpack -p

自动监听变化,动态运行webpack编译:

> webpack --watch

通常Dev阶段,使用--watch配合live-server就可以自动化开发繁琐的窗口切换与回车。

以上仅仅介绍了webpack前端开发最基本的用法,更多参数以及功能使用,参考官网

前端webpack workflow(二)——Webpack基本使用的更多相关文章

  1. webpack教程(二)——webpack.config.js文件

    首先我们需要安装一个webpack插件html-webpack-plugin,该插件的作用是帮助我们生成创建html入口文件.执行如下命令 npm install html-webpack-plugi ...

  2. (webpack系列二)webpack打包优化探索

    虽然webpack的已经升级到了webpack4,而我们目前还在使用webpack3,但其中的优化点都大同小异,升级后同样适用. 性能优化初步原则 减小代码量 减小请求数 最大化利用浏览器缓存 这三条 ...

  3. 前端工程化(二)---webpack配置

    导航 前端工程化(一)---工程基础目录搭建 前端工程化(二)---webpack配置 前端工程化(三)---Vue的开发模式 前端工程化(四)---helloWord 继续上一遍的配置,本节主要记录 ...

  4. 前端笔记之ES678&Webpack&Babel(下)AMD|CMD规范&模块&webpack&Promise对象&Generator函数

    一.AMD和CMD规范(了解) 1.1传统的前端开发多个js文件的关系 yuan.js中定义了一个函数 function mianji(r){ return 3.14 * r * r } main.j ...

  5. 前端打包利器:webpack工具

    一.什么是WebPack,为什么要使用它? 1.为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端 ...

  6. 前端工具配置(webpack 4、vue-cli 3)

    随着前端项目复杂度的增加,其所依赖的资源也越来越多,从最初的HTML文件,CSS文件,JS文件发展到现在的各种预处理文件,模板文件等等.文件多了,项目大了,项目的维护就变得更加困难了,用户加载页面的速 ...

  7. 前端架构gulp与webpack(知识点整理)

    一 概念介绍 gulp 是 task runner,Webpack 是 module bundler.可以这么说, Webpack 和 gulp 本身都有 95% 的功能是不能被对方替代,或者直接说和 ...

  8. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  9. [FE] 有效开展一个前端项目2 (vuejs-templates/webpack)

      1.安装 nodejs.npm $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - $ sudo apt-get i ...

随机推荐

  1. WPF页面后台代码InitializeComponent()报错

    InitializeComponent(); 报错: 查看对应的前台xaml文件中,主标签中是否缺失引用: x:class="命名空间.类名"

  2. VirtualBox虚拟机--桥接模式

    问题概述:VirtualBox虚拟机设置桥接模式,与宿主机互相ping通. 注:如果按照以下方式设置了还是ping不通,查看虚拟机防火墙是否已关. 公司电脑拿去维修了,在自己家里电脑上部署项目开发环境 ...

  3. HarmonyOS UI组件在线预览,程序员直呼“不要太方便~”

    一.介绍 以往大家如果想查看组件的使用效果,需要打开DevEco Studio构建工程.现在为了便于大家高效开发,文档上线了JS UI组件在线预览功能,无需本地构建工程,在线即可修改组件样式等参数.一 ...

  4. H3C三层交换机之IRF虚拟化技术详解及配置

    一.IRF是什么? 目前,网络中主要存在两种结构的通信设备,固定盒式设备和模块框式分布式设备. 固定盒式设备成本低廉,但没有高可用性支持:模块框式分布式设备具有高可用性.高性能.高端口密度的优点,但投 ...

  5. 使用vscode Container开发调试envoy

    由于我最近在研究 envoy 这个项目,这是个cpp的项目,对于我这种cpp新人来说还是比较有压力的,感觉处处都是坑,开个引导文章记录一下. 如果要研究 envoy 项目源码,那肯定是需要代码跳转的, ...

  6. 前面顺序表的补充(复杂度,未实现的算法,空间扩展)(基于c语言)

    0.对于顺序表中的n个元素,如果在下标i的位置之前插入一个元素,则需要将后面n-i个元素向后移动一位:如果是删除下标为i处的元素,则是则需要将后面n-i-1个元素向前移动一位.如果说在i的位置插入和删 ...

  7. wms、wmts、wfs等地图服务区别

    OGC     OGC 全称是开放地理空间信息联盟(Open Geospatial Consortium),是一个非盈利的国际标准组织,它制定了数据和服务的一系列标准,GIS厂商按照这个标准进行开发可 ...

  8. python练习册 每天一个小程序 第0004题

    1 #-*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述:任一个英文的纯文本文件,统计其中的单词出现的个数. 5 参考学习链接: 6 re ht ...

  9. mock axios vue的数据传递关系

    最近有一个项目要快速出一个前端demo,选择了vue-element框架(虽然其实很想用react,但是为了求快) 本人的基础只有初级的html/css/js知识,和python后端的一些简单工作,和 ...

  10. Prometheus由于时间不同步导致数据不显示

    原文链接:Prometheus由于时间不同步导致数据不显示 问题 部署 prometheus 后,访问前端界面发现: 这是由于你windows机器与部署prometheus服务器的时间不同步导致的. ...