详解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 相关文章推荐
jQuery Tools tab(幻灯片)
Jul 14 Javascript
ECMAScript 创建自己的js类库
Nov 22 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
YUI模块开发原理详解
Nov 18 Javascript
Javascript中浮点数相乘的一个解决方法
Jun 03 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
js代码规范之Eslint安装与配置详解
Sep 08 Javascript
javascript中toFixed()四舍五入使用方法详解
Sep 28 Javascript
实用的Vue开发技巧
May 30 Javascript
javascript function(函数类型)使用与注意事项小结
Jun 10 Javascript
javascript刷新父页面方法汇总详解
Oct 10 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
python web框架学习笔记
2016/05/03 Python
OpenCV实现人脸识别
2017/04/07 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
深入理解Python中的*重复运算符
2017/10/28 Python
python中的decorator的作用详解
2018/07/26 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
应届毕业生自我鉴定范文
2013/12/27 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
电子商务专业自荐信
2014/06/02 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python