详解webpack模块化管理和打包工具


Posted in Javascript onApril 21, 2018

本篇文章主要介绍了详解webpack模块化管理和打包工具,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Webpack简介

webpack是当下最热门的前端资源模块化管理和打包工具。 它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际

需要的时候再异步加载。通过 loader  的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。

模块系统的演进<script>标签

<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="libraryA.js"></script>
<script src="module3.js"></script>

这是最原始的 JavaScript 文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在 window  对象中,

不同模块的接口调用都是一个作用域中,一些复杂的框架,会使用命名空间的概念来组织这些模块的接口,典型的例子如 YUI  库。

这种原始的加载方式暴露了一些显而易见的弊端:

  1. 全局作用域下容易造成变量冲突
  2. 文件只能按照   <script>  的书写顺序进行加载
  3. 开发人员必须主观解决模块和代码库的依赖关系
  4. 在大型项目中各种资源难以管理,长期积累的问题导致代码库混乱不堪

CommonJS规范

CommonJS 是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中。

CommonJS 规范是为了解决 JavaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须通过 module.exports  导出对外的变量 或接口,通过   require()  来导入其他模块的输出到当前模块作用域中。

一个直观的例子

// moduleA.js
module.exports = function( value ){
  return value * 2;
}
// moduleB.js
var multiplyBy2 = require('./moduleA');
var result = multiplyBy2(4);

AMD规范

AMD(异步模块定义)是为浏览器环境设计的,因为 CommonJS 模块系统是同步加载的,当前浏览器环境还没有准备好同步加载模块的条件。

模块通过 define  函数定义在闭包中,格式如下:

define(id?: String, dependencies?: String[], factory: Function|Object);

id  是模块的名字,它是可选的参数。

factory  是最后一个参数,它包裹了模块的具体实现,它是一个函数或者对象。如果是函数,那么它的返回值就是模块的输出接口或值。

一些用例

定义一个名为 myModule  的模块,它依赖   jQuery  模块:

define('myModule', ['jquery'], function($) {
  // $ 是 jquery 模块的输出
  $('body').text('hello world');
}); // 使用 require(['myModule'], function(myModule) {});

注意 :在 webpack 中,模块名只有局部作用域,在 Require.js 中模块名是全局作用域,可以在全局引用。

定义一个没有 id  值的匿名模块,通常作为应用的启动函数:

define(['jquery'], function($) {
  $('body').text('hello world');
});

AMD 也采用require()语句加载模块,但不同于CommonJS,他要求两个参数

第一个参数[module],是一个数组,里面的成员就是要加载的模块; 第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:

math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境

目前,主要有两个Javascript库实现了AMD规范: require.js 和 curl.js

 require(['math'], function (math) {

math.add(2, 3);

});

什么是 Webpack

Webpack 是一个模块打包器。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。

Webpack 的特点

  1. 代码拆分
  2. Loader
  3. 智能解析
  4. 插件系统
  5. 快速运行

webpack基本使用

创建项目根目录

初始化

npm init 或 npm init -y

全局安装

npm install webpack -g

局部安装,在项目目录下安装

npm install webpack --save-dev

--save: 将安装的包的信息保存在package中

--dev:开发版本,只是项目构建的时候使用,项目构建完成后并不依赖的文件

如果使用web开发工具,单独安装

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

基本使用

首先创建一个静态页面 index.html 和一个 JS 入口文件 entry.js:

<!-- index.html -->
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="bundle.js"></script>
</body>
</html>

创建entry.js

// entry.js : 在页面中打印出一句话
document.write('It works.')

然后编译 entry.js并打包到 bundle.js文件中

// 使用npm命令 
webpack entry.js bundle.js

使用模块

1.创建模块module.js,在内部导出内容

module.exports = 'It works from module.js'

2.在entry.js中使用自定义的模块

//entry.js
document.write('It works.')
document.write(require('./module.js')) // 添加模块

加载css模块

1.安装css-loader

npm install css-loader style-loader --save-dev

2.创建css文件

//style.css
body { background: yellow; }

3.修改 entry.js:

require("!style-loader!css-loader!./style.css") // 载入 style.css
document.write('It works.')
document.write(require('./module.js'))

创建配置文件webpack.config.js

1.创建文件

var webpack = require('webpack')

module.exports = {
 entry: './entry.js',
 output: {
  path: __dirname,
  filename: 'bundle.js'
 },
 module: {
  loaders: [
    //同时简化 entry.js 中的 style.css 加载方式:require('./style.css')
   {test: /\.css$/, loader: 'style-loader!css-loader'}
  ]
 }
}

2.修改 entry.js 中的 style.css 加载方式:require('./style.css')

3.运行webpack

在命令行页面直接输入webpack

插件使用

1.插件安装

//添加注释的插件
npm install --save-devbannerplugin

2.配置文件的书写

var webpack = require('webpack')

module.exports = {
  entry: './entry.js',
  output: {
    path: __dirname,
    filename: 'bundle.js'
  },
  module: {
    loaders: [
      //同时简化 entry.js 中的 style.css 加载方式:require('./style.css')
      {
        test: /\.css$/,
        loader: 'style-loader!css-loader'
      }
    ],
    plugins: [
      //添加注释的插件
      new webpack.BannerPlugin('This file is created by zhaoda')
    ]
  }
}

3.运行webpack

// 可以在bundle.js的头部看到注释信息
/*! This file is created by zhaoda */

开发环境

webpack

--progress : 显示编译的进度

--colors : 带颜色显示,美化输出

--watch : 开启监视器,不用每次变化后都手动编译

12.4.7.1. webpack-dev-server

开启服务,以监听模式自动运行

1.安装包

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

2.启动服务

实时监控页面并自动刷新

webpack-dev-server --progress --colors

自动编译

1.安装插件

npm install --save-dev html-webpack-plugin

2.在配置文件中导入包

var htmlWebpackPlugin = require('html-webpack-plugin')

3.在配置文件中使用插件

plugins: [
    //添加注释的插件
    new webpack.BannerPlugin('This file is created by zhaoda'),
    //自动编译
    new htmlWebpackPlugin({
      title: "index",
      filename: 'index.html', //在内存中生成的网页的名称
      template: './index.html' //生成网页名称的依据
    })
  ]

4.运行项目

webpack--save-dev

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

Javascript 相关文章推荐
Javascript 阻止javascript事件冒泡,获取控件ID值
Jun 27 Javascript
javascript for循环设法提高性能
Feb 24 Javascript
学习JavaScript设计模式(链式调用)
Nov 26 Javascript
js检测iframe是否加载完成的方法
Nov 26 Javascript
JS中setTimeout的巧妙用法前端函数节流
Mar 24 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 Javascript
vue slot 在子组件中显示父组件传递的模板
Mar 02 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
TypeScript类型声明书写详解
Aug 28 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
Aug 20 Javascript
Node.Js生成比特币地址代码解析
Apr 21 #Javascript
vue.js与element-ui实现菜单树形结构的解决方法
Apr 21 #Javascript
JS装饰器函数用法总结
Apr 21 #Javascript
vue 之 .sync 修饰符示例详解
Apr 21 #Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 #Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
Apr 20 #Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 #jQuery
You might like
PHP 加密解密内部算法
2010/04/22 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
document.all与WEB标准
2020/05/13 Javascript
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
Python守护进程实现过程详解
2020/02/10 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
职业生涯规划怎么写
2013/12/29 职场文书
户外活动策划方案
2014/03/12 职场文书
设备售后服务承诺书
2014/05/30 职场文书
商务经理岗位职责
2014/07/30 职场文书
银行贷款委托书范本
2014/10/11 职场文书
银行培训心得体会范文
2016/01/09 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python
Redis三种集群模式详解
2021/10/05 Redis
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB