每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档。 webpack是基于node的。先安装最新的node

1.初始化

安装node后,新建一个目录,比如html5。cmd中切到当前文件夹。
  1. npm init -y

这个命令会创建一个默认的package.json。它包含了项目的一些配置参数,通过它可以进行初始安装。详细参数:https://docs.npmjs.com/files/package.json

不要y参数的话,会在命令框中设置各项参数,但觉得没啥必要。

2.安装webpack

  1. npm install webpack --save-dev
将webpack安装到当前目录。虽然npm install webpack -g 可以讲webpack安装到全局,但是容易出现一些模块找不到的错误,所以最好还是安装到当前目录下。

3.目录结构

webpack是一款模块加载各种资源并打包的工具。所以先建一个如下的目录结构:
 
app包含的开发中的js文件,一个组件,一个入口。build中就是用来存放打包之后的文件的。webpack.config.js 顾名思义用来配置webpack的。package.json就不用说了。
component.js
  1. export default function () {
  2. var element = document.createElement('h1');
  3. element.innerHTML = 'Hello world';
  4. return element;
  5. }

component.js 是输出一个内容为h1元素。export default 是ES6语法,表示指定默认输出。import的时候不用带大括号。

index.js
  1. import component from './component';
  2. document.body.appendChild(component());

index.js 的作用就是引用Component模块,并在页面上输出一个h1元素。但完成这个还需要一个插件,因为目前我们还没有index.html文件。

  1. npm install html-webpack-plugin --save-dev
html-webpack-plugin的用来生成html,将其也安装到开发目录下面。

4.设置 webpack 配置文件

我们需要通过webpack.config.js文件告诉webpack如何开始。配置文件至少需要一个入口和一个输出。多个页面就需要多个入口。node的path模块
  1. const path = require('path');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin');
  3.  
  4. const PATHS = {
  5. app: path.join(__dirname, 'app'),
  6. build: path.join(__dirname, 'build'),
  7. };
  8.  
  9. module.exports = {
  10. entry: {
  11. app: PATHS.app,
  12. },
  13. output: {
  14. path: PATHS.build,
  15. filename: '[name].js',
  16. },
  17. plugins: [
  18. new HtmlWebpackPlugin({
  19. title: 'Webpack demo',
  20. }),
  21. ],
  22. };

第一次看到这个配置文件是有点懵,主要是exports,分三个部分,一个入口,一个输出,一个插件。入口指向了app文件夹。默认会把包含"index.js"的文件作为入口。输出指定了build地址和一个文件名;[name]这儿表示占位符,可以看成webpack提供的一个变量。这个具体后面再看。而HtmlWebpackPlugin会生成一个默认的html文件。

5.打包

有了以上准备,直接输入 webpack 就能运行了。

这个输出包含了Hash(每次打包值都不同),Version,Time(耗时)。以及输出的文件信息。 这时打开build文件夹,发现多了一个app.js和index.html文件,双击index.html:

  
也可以修改下package.json
  1. {
  2. "name": "Html5",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "index.js",
  6. "scripts": {
  7. "build": "webpack"
  8. },
  9. "keywords": [],
  10. "author": "",
  11.  
  12. "license": "ISC",
  13. "devDependencies": {
  14. "html-webpack-plugin": "^2.28.0",
  15. "webpack": "^2.2.1"
  16. }
  17. }

指定build。在cmd中执行npm run build 得到同样的结果

 出现helloword。再看下文件内容
index.html:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Webpack demo</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript" src="app.js"></script></body>
  9. </html>

默认引用了app.js。

6、解析

app.js

  1. /******/ (function(modules) { // webpackBootstrap
  2. /******/ // The module cache
  3. /******/ var installedModules = {};
  4.  
  5. /******/ // The require function
  6. /******/ function __webpack_require__(moduleId) {
  7.  
  8. /******/ // Check if module is in cache
  9. /******/ if(installedModules[moduleId])
  10. /******/ return installedModules[moduleId].exports;
  11.  
  12. /******/ // Create a new module (and put it into the cache)
  13. /******/ var module = installedModules[moduleId] = {
  14. /******/ i: moduleId,
  15. /******/ l: false,
  16. /******/ exports: {}
  17. /******/ };
  18.  
  19. /******/ // Execute the module function
  20. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  21.  
  22. /******/ // Flag the module as loaded
  23. /******/ module.l = true;
  24.  
  25. /******/ // Return the exports of the module
  26. /******/ return module.exports;
  27. /******/ }
  28.  
  29. /******/ // expose the modules object (__webpack_modules__)
  30. /******/ __webpack_require__.m = modules;
  31.  
  32. /******/ // expose the module cache
  33. /******/ __webpack_require__.c = installedModules;
  34.  
  35. /******/ // identity function for calling harmony imports with the correct context
  36. /******/ __webpack_require__.i = function(value) { return value; };
  37.  
  38. /******/ // define getter function for harmony exports
  39. /******/ __webpack_require__.d = function(exports, name, getter) {
  40. /******/ if(!__webpack_require__.o(exports, name)) {
  41. /******/ Object.defineProperty(exports, name, {
  42. /******/ configurable: false,
  43. /******/ enumerable: true,
  44. /******/ get: getter
  45. /******/ });
  46. /******/ }
  47. /******/ };
  48.  
  49. /******/ // getDefaultExport function for compatibility with non-harmony modules
  50. /******/ __webpack_require__.n = function(module) {
  51. /******/ var getter = module && module.__esModule ?
  52. /******/ function getDefault() { return module['default']; } :
  53. /******/ function getModuleExports() { return module; };
  54. /******/ __webpack_require__.d(getter, 'a', getter);
  55. /******/ return getter;
  56. /******/ };
  57.  
  58. /******/ // Object.prototype.hasOwnProperty.call
  59. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  60.  
  61. /******/ // __webpack_public_path__
  62. /******/ __webpack_require__.p = "";
  63.  
  64. /******/ // Load entry module and return exports
  65. /******/ return __webpack_require__(__webpack_require__.s = 1);
  66. /******/ })
  67. /************************************************************************/
  68. /******/ ([
  69. /* 0 */
  70. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  71.  
  72. "use strict";
  73. /* harmony default export */ __webpack_exports__["a"] = function () {
  74. var element = document.createElement('h1');
  75. element.innerHTML = 'Hello world';
  76. return element;
  77. };
  78.  
  79. /***/ }),
  80. /* 1 */
  81. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  82.  
  83. "use strict";
  84. Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
  85. /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(0);
  86.  
  87. document.body.appendChild(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__component__["a" /* default */])());
  88.  
  89. /***/ })
  90. /******/ ]);

而app.js内容比较多了。整体是一个匿名函数。

  1. (function(module) {
  2. })([(function (){}), function() {}])

app文件夹中的两个js文件成了这儿的两个模块。函数最开始是从__webpack_require__开始

  1. return __webpack_require__(__webpack_require__.s = 1);

这里指定从模块1执行(赋值语句的返回值为其值)。而模块1的调用是通过__webpack_require__的这句执行的。

  1. modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

通过call调用模块的主要作用是为了把参数传过去。

  1. (function(module, __webpack_exports__, __webpack_require__) {
  2.  
  3. "use strict";
  4. Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
  5. /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(0);
  6.  
  7. document.body.appendChild(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__component__["a" /* default */])());
  8.  
  9. /***/ })

__webpack_require__ 每加载一个模块都会先去模块缓存中找,没有就新建一个module对象:

  1. var module = installedModules[moduleId] = {
  2. i: moduleId,
  3. l: false,
  4. exports: {}
  5. };

模块1中加载了模块0,

  1. var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(0);
  1. __WEBPACK_IMPORTED_MODULE_0__component__ 返回的是这个模块0exports部分。而之前Component.js的默认方法定义成了
  1. __webpack_exports__["a"] = function () {
  2. var element = document.createElement('h1');
  3. element.innerHTML = 'Hello world';
  4. return element;
  5. }

所以再模块1的定义通过"a“来获取这个方法:

  1. document.body.appendChild(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__component__["a" /* default */])());

这样就完整了,但这里使用了__webpack_require__.i 将原值返回。

  1. /******/ // identity function for calling harmony imports with the correct context
  2. /******/ __webpack_require__.i = function(value) { return value; };

不太明白这个i函数有什么作用。这个注释也不太明白,路过的大神希望可以指点下。

小结:

webpack通过一个立即执行的匿名函数将各个开发模块作为参数初始化,每个js文件(module)对应一个编号,每个js中export的方法或者对象有各自指定的关键字。通过这种方式将所有的模块和接口方法管理起来。然后先加载最后的一个模块(应该是引用别的模块的模块),这样进而去触发别的模块的加载,使整个js运行起来。到这基本了解了webpack的功能和部分原理,但略显复杂,且没有感受到有多大的好处。继续探索。

demo:http://files.cnblogs.com/files/stoneniqiu/webpack-ch1.zip 建议用最新的node安装,不然build后的结果可能出错。

参考:

https://survivejs.com/webpack/developing/getting-started/

https://webpack.js.org/

【webpack】-- 入门与解析的更多相关文章

  1. webpack入门与解析(一)

    每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如ht ...

  2. webpack入门(1)

    webpack入门(1) 源码戳这里 ps:每个案例对应相应的demo,例如"案例1"对应"demo1" 一.webpack基本功能及简单案例 安装webpac ...

  3. 【webpack2】-- 入门与解析

    每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如ht ...

  4. webpack入门教程之Hello webpack(一)

    webpack入门教程系列为官网Tutorials的个人译文,旨在给予想要学习webpack的小伙伴一个另外的途径.如有不当之处,请大家指出. 看完入门教程系列后,你将会学习到如下内容: 1.如何安装 ...

  5. webpack入门——webpack的安装与使用

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

  6. 一小时包教会 —— webpack 入门指南

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

  7. Webpack 入门指南 - 3. Hello, Angular2!

    Webpack 入门指南 - 1.安装 Webpack 入门指南 - 2.模块 这一次,我们使用 Webpack 来打包 Angular 2 的应用. 与官方的 Hello, Angular 2 项目 ...

  8. Webpack 入门指南 - 2.模块

    这一次我们谈谈模块问题. 通常我们希望这个项目可以分为多个独立的模块,比如,上一次提高的 hello 函数,如果我们定义为一个模块,其它模块引用之后,直接调用就好了.在前端怎么使用模块呢?这可说来话长 ...

  9. Webpack 入门指南 - 1.安装

    Webpack 是目前流行的打包工具,如何安装它呢? 1. 安装 Node Js 首先,Webpack 是基于 NodeJs 的工具,你必须首先安装 NodeJs. NodeJs 仅仅只需要在你的系统 ...

  10. webpack入门和实战(一):webpack配置及技巧

    一.全面理解webpack 1.什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都 ...

随机推荐

  1. 传递参数:java代码中形参的改变有没有影响实参?

    实参:可以是常量.变量.表达式.函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参. 因此应预先用赋值,输入等办法使实参获得确定值. 形参:全称为“形 ...

  2. linux-kernel-4.4 移植 (3) 网卡移植

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  3. jQuery on() 方法 为选定已存在元素和未来元素绑定标准事件和自定义事件

    很有必要说说jQuery的on方法,这个方法存在大乾坤大奥秘,主要注意两点: 1.为已存在元素和未来元素(动态添加元素)绑定处理函数. 2.自定义一个非标准的事件并绑定处理函数. 定义和用法 on() ...

  4. Jenkins+Gradle+Sonar进行Java项目代码分析

    Jenkins+Maven+Sonar与Jenkins+Gradle+Sonar配置方法很相似,区别就是Java项目所用的编译工具不同,一个是maven,一个是gradle 使用maven编译工具的可 ...

  5. 进军的socket

    在学socket有时候我们会遇到这种问题: 解决方法一: 在服务端中加入:severTCP.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ...

  6. 20175325 《JAVA程序设计》实验一 《JAVA开发环境的熟悉》实验报告

    20175325 <JAVA程序设计>实验一 <JAVA开发环境的熟悉>实验报告 一.实验内容及步骤 (一).实验一: 实验要求: 0 参考实验要求 1 建立"自己学 ...

  7. 使用Typescript实现依赖注入(DI)

    前言DI总是和ico相辅相成的,如果想对DI有更多的了解,可以移步我的另一篇文章 依赖注入(DI)和控制反转(IOC),再次我就不多做赘述了. 前几天看见一道面试题,今天借这个话题想跟大家分享一下: ...

  8. Chapter_3_JAVA作业

    第三章 一 .课前预习 1.1 简述概念,什么是类?什么是对象? 类:在Java中是一种重要的复合数据类型,是组成类的基本要素.(把众多的事物规划,划分成一类是人类在认识个观世界时采用的思维方法). ...

  9. java webservice生成客户端代码并调用

    wsimport简介 在JDK的bin文件夹中,有一个wsimport.exe工具,可依据wsdl文件生成相应的类文件,将生存在本地这些类文件拷贝到需要使用的项目中,就可以像调用本地的类一样调用web ...

  10. MySQL 聚合函数 控制流程函数

    常用的聚合函数 1. AVG() 求平均值 mysql> AVG([DISTINCT] expr) -- 返回 expr 的平均值 mysql> select AVG(age) from ...