详解webpack模块加载器兼打包工具


Posted in Javascript onSeptember 11, 2018

 什么是 webpack?

webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。

我们可以直接使用 require(XXX) 的形式来引入各模块,即使它们可能需要经过编译(比如JSX和sass),但我们无须在上面花费太多心思,因为 webpack 有着各种健全的加载器(loader)在默默处理这些事情,这块我们后续会提到。

你可以不打算将其用在你的项目上,但没有理由不去掌握它,因为以近期 Github 上各大主流的(React相关)项目来说,它们仓库上所展示的示例已经是基于 webpack 来开发的,比如 React-Boostrap 和 Redux。

webpack的官网是 http://webpack.github.io/ ,文档地址是 http://webpack.github.io/docs/ ,想对其进行更详细了解的可以点进去瞧一瞧。

1>基本介绍

在webpack中,一个css甚至一个字体都成为模块,彼此存在依赖关系,webpack就是处理模块间依赖关系的,并将它们进行打包。

各种文件格式通过特定的加载器loader编译后,最终统一生成为.js,.css,.png,.jpg等静态资源。

但是归根到底他就是有个.js的配置文件,一个构架好或者差都表现在这个配置文件中。

2>配置webpack

创建一个目录demo,npm初始化

npm init//完成后有package.json文件

本地局部安装webpack

npm install webpack --save-dev

接着安装webpack-dev-server,可以在开发环境提供很多服务,比如启动一个服务器,热更新,接口代理

npm install webpack-dev-server --save-dev

写配置文件

在package.json中scripts里添加一个快速启动webpack-dev-server服务的脚本"dev":"webpack-dev-server --open --config webpack.config.js"

运行npm run dev的时候就会执行"webpack-dev-server --open --config webpack.config.js

其中config指向的是webpack-dev-server指向的文件路径。Open在执行时自动会在浏览器打开页面,默认地址是127.0.0.1:8080,不过ip,端口号都可以配置

3>webpack的四个核心概念:

入口(entry)、输出(output)、加载器(loader)、插件(plugins)

1》entry 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始,可以是单入口也可以是多入口

2》output 用来配置编译后的文件存储位置和文件名,只能有一个出口

  • output中有path选项用来存放打包后文件的输出目录,必填
  • filename用于指定输出文件的名称
  • publicePath指定文件引用的目录

3》loader 对模块源代码进行转换(webpack 本身只能处理Js模块)。

module:{
  rules:[
  {
   test:/\.css$/,
  use:[
    'style-loader',
    'css-loader'
  ]
  }
 ]
 }

在module对象的rules属性中可以指定一系列的loader,每一个loader都必须包括test,use两个选项。

上面代码的意思是:webpack编译过程中遇到require()或import语句导入一个后缀为.css的文件时,它将先通过css-loader转换,再通过style-loader转换,然后打包。

  • test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。
  • use 属性,表示进行转换时,应该使用哪个 loader。可以是字符串或者数组,数组从后面开始编译。
const webpack = require('webpack'); //访问 webpack 运行时(runtime)
 const configuration = require('./webpack.config.js');
 let compiler = webpack(configuration);
 compiler.apply(new webpack.ProgressPlugin());
 compiler.run(function(err, stats) {
 // ...
 });

4》Plugins:可以用来解决loader无法实现的其他事。外置插件要先npm安装,然后导入插件用require()

extract-text-webpack-plugin插件可以把散落在各地的Css提取出来,并合成一个文件.

//导入插件
var ExtractTextPlugin=require('extract-text-webpack-plugin');
var config={
//...
 plugins:[
 //重命名提取后的css
 new ExtractTextPlugin('main.css')
 ]
};

webpack的优点如下:

1. webpack 遵循commonJS 的形式,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。

2. 能被模块化的不仅仅是 JS ,所有的静态资源,例如css,图片等都能模块化,即以require的方式引入。

3. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。

webpack与gulp的区别

gulp合并后仍然是你写的代码,只是局部变量名被替换,一些语法做了转换而已,整体内容并没有发生改变。

Webpack打包后的代码已经不只是你写的代码,其中夹杂很多webpack自身的模块处理代码。

他们的定位是不同的。对gulp来说,他旨在规范前端开发流程。webpack更是明显强调模块化开发,而那些文件压缩合并、预处理等功能,不过是他附带的功能。

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

Javascript 相关文章推荐
js下写一个事件队列操作函数
Jul 19 Javascript
javascript实现yield的方法
Nov 06 Javascript
javascript实现俄罗斯方块游戏的思路和方法
Apr 27 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
微信小程序 欢迎页面的制作(源码下载)
Jan 09 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
Apr 03 jQuery
基于ES6 Array.of的用法(实例讲解)
Sep 05 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
Jan 20 Javascript
详解用JS添加和删除class类名
Mar 25 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
Apr 30 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
Sep 05 Javascript
Node.js API详解之 os模块用法实例分析
May 06 Javascript
webpack css加载和图片加载的方法示例
Sep 11 #Javascript
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 #Javascript
webpack的CSS加载器的使用
Sep 11 #Javascript
JavaScript基础教程之如何实现一个简单的promise
Sep 11 #Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 #Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 #Javascript
Angular6 正则表达式允许输入部分中文字符
Sep 10 #Javascript
You might like
又一个php 分页类实现代码
2009/12/03 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
laravel请求参数校验方法
2019/10/10 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
python如何安装下载后的模块
2020/07/03 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
weblogic面试题
2016/03/07 面试题
请解释接口的显式实现有什么意义
2012/05/26 面试题
大学毕业的自我鉴定
2013/10/08 职场文书
质量工程师岗位职责
2013/11/16 职场文书
安全生产检查通报
2014/01/29 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
志愿者工作心得体会
2016/01/15 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android