详解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 编写规范
Mar 03 Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
JavaScript基本语法讲解
Jun 03 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
Sep 02 Javascript
javascript日期格式化方法汇总
Oct 04 Javascript
Highcharts学习之坐标轴
Aug 02 Javascript
String字符串截取的四种方式总结
Nov 28 Javascript
详解使用webpack构建多页面应用
Dec 21 Javascript
JS中offset和匀速动画详解
Feb 06 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
jQuery实现仿京东防抖动菜单效果示例
Jul 06 jQuery
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
Sep 12 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数组及条件,循环语句学习
2012/11/11 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
python字典基本操作实例分析
2015/07/11 Python
python比较两个列表大小的方法
2015/07/11 Python
python中map()函数的使用方法示例
2017/09/29 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
自我鉴定注意事项
2014/01/19 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
公司委托书范本5篇
2014/09/20 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers