NODE03:使用WebPack实现Web资源打包

2019-10-24  本文已影响0人  杨强AT南京

  Node.js是ES标准语法的实现者,语法是标准的,但是因为基于Web开发发展的Javascript语言的用途却分成前后两端,这种分歧目前还是存在的;在前端开发中,解决这种分歧的就是Webpack框架了,有了Webpack就可以像开发C,Java,Python一样开发前端了。本主题就是梳理下Webpack的这种应用场景;
  1. 理解Webpack;
  2. webpack的使用模式;
  3. 从Webpack理解Web的设计模式;


理解Webpack

作用

安装

备注:如果用root账户进行npm install,应该使用npm install --unsafe-perm,因为npm安装为了安全缘故,会自动切换到nobody用户。

在浏览器中调用js

问题

  1. 模块与模块调用脚本
    • 混合了node的语法,又使用了浏览器document对象,这是一个矛盾,webpack可以翻译,使得node(ES6)的语法翻译成在浏览器可以支持的js语法。
    • 注意:不能调用服务器的模块,比如path,net等,这些没有办法翻译。
    // 文件名:p01_webpack_01module.js
    module.exports = {
        v_a: 88
    }

    // 文件名:p01_webpack_02nodejs.js
    var mod = require('./p01_webpack_01module.js');
    // 客户端(浏览器)输出
    document.write("模块调用结果:<b>" + mod.v_a + "</b>");

    // 下面是服务器(node执行环境)运行输出(浏览器也支持)
    console.log(mod.v_a);

  1. 浏览器html代码
   <!-- 文件名:p01_webpack_03brower.html-->
    <!DOCTYPE html>
    <html>
        <head>
            <title>
                Webpack后的js调用
            </title>
            <meta charset="utf-8">
            <link rel="shortcut icon" href="#" />
        </head>
        <body>
            <!--因为js脚本包含支持node的require语法,所以下面的直接调用是存在问题的-->
            <script src="./p01_webpack_02nodejs.js"></script>
        </body>
    </html>

webpack使用模式

使用webpack对使用node.js与ES6语法的脚本打包

翻译后的js文件


    /******/ (function(modules) { // webpackBootstrap
    /******/    // The module cache
    /******/    var installedModules = {};
    /******/
    /******/    // The require function
    /******/    function __webpack_require__(moduleId) {
    /******/
    /******/        // Check if module is in cache
    /******/        if(installedModules[moduleId]) {
    /******/            return installedModules[moduleId].exports;
    /******/        }
    /******/        // Create a new module (and put it into the cache)
    /******/        var module = installedModules[moduleId] = {
    /******/            i: moduleId,
    /******/            l: false,
    /******/            exports: {}
    /******/        };
    /******/
    /******/        // Execute the module function
    /******/        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
    /******/
    /******/        // Flag the module as loaded
    /******/        module.l = true;
    /******/
    /******/        // Return the exports of the module
    /******/        return module.exports;
    /******/    }
    /******/
    /******/
    /******/    // expose the modules object (__webpack_modules__)
    /******/    __webpack_require__.m = modules;
    /******/
    /******/    // expose the module cache
    /******/    __webpack_require__.c = installedModules;
    /******/
    /******/    // define getter function for harmony exports
    /******/    __webpack_require__.d = function(exports, name, getter) {
    /******/        if(!__webpack_require__.o(exports, name)) {
    /******/            Object.defineProperty(exports, name, { enumerable: true, get: getter });
    /******/        }
    /******/    };
    /******/
    /******/    // define __esModule on exports
    /******/    __webpack_require__.r = function(exports) {
    /******/        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
    /******/            Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
    /******/        }
    /******/        Object.defineProperty(exports, '__esModule', { value: true });
    /******/    };
    /******/
    /******/    // create a fake namespace object
    /******/    // mode & 1: value is a module id, require it
    /******/    // mode & 2: merge all properties of value into the ns
    /******/    // mode & 4: return value when already ns object
    /******/    // mode & 8|1: behave like require
    /******/    __webpack_require__.t = function(value, mode) {
    /******/        if(mode & 1) value = __webpack_require__(value);
    /******/        if(mode & 8) return value;
    /******/        if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
    /******/        var ns = Object.create(null);
    /******/        __webpack_require__.r(ns);
    /******/        Object.defineProperty(ns, 'default', { enumerable: true, value: value });
    /******/        if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
    /******/        return ns;
    /******/    };
    /******/
    /******/    // getDefaultExport function for compatibility with non-harmony modules
    /******/    __webpack_require__.n = function(module) {
    /******/        var getter = module && module.__esModule ?
    /******/            function getDefault() { return module['default']; } :
    /******/            function getModuleExports() { return module; };
    /******/        __webpack_require__.d(getter, 'a', getter);
    /******/        return getter;
    /******/    };
    /******/
    /******/    // Object.prototype.hasOwnProperty.call
    /******/    __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
    /******/
    /******/    // __webpack_public_path__
    /******/    __webpack_require__.p = "";
    /******/
    /******/
    /******/    // Load entry module and return exports
    /******/    return __webpack_require__(__webpack_require__.s = "./p01_webpack_02nodejs.js");
    /******/ })
    /************************************************************************/
    /******/ ({

    /***/ "./p01_webpack_01module.js":
    /*!*********************************!*\
      !*** ./p01_webpack_01module.js ***!
      \*********************************/
    /*! no static exports found */
    /***/ (function(module, exports) {

    eval("module.exports = {\n    v_a: 88\n}\n\n//# sourceURL=webpack:///./p01_webpack_01module.js?");

    /***/ }),

    /***/ "./p01_webpack_02nodejs.js":
    /*!*********************************!*\
      !*** ./p01_webpack_02nodejs.js ***!
      \*********************************/
    /*! no static exports found */
    /***/ (function(module, exports, __webpack_require__) {

    eval("var mod = __webpack_require__(/*! ./p01_webpack_01module.js */ \"./p01_webpack_01module.js\");\n// 客户端(浏览器)输出\ndocument.write(\"模块调用结果:<b>\" + mod.v_a + \"</b>\");\n\n// 下面是服务器(node执行环境)运行输出(浏览器也支持)\nconsole.log(mod.v_a);\n\n\n//# sourceURL=webpack:///./p01_webpack_02nodejs.js?");

    /***/ })

    /******/ });

在HTML中调用


    <!DOCTYPE html>
    <html>
        <head>
            <title>
                Webpack后的js调用
            </title>
            <meta charset="utf-8">
            <link rel="shortcut icon" href="#" />
        </head>
        <body>
            <!--因为js脚本包含支持node的require语法,所以下面的直接调用是存在问题的-->
            <script src="./p02_webpack_01browserjs.js"></script>
        </body>
    </html>


从webpack衍生的设计模式

使用require加载样式表

安装css-loader与style-loader

使用css-loader与style-loader

样式表代码

    body{
        background-color: red;
    }
    div.mycss{
        width: 200px;
        height: 100px;
        background-color: yellow;
    }

引入样式表


    require('./p03_webpack_01css.css');
    // 客户端(浏览器)输出
    document.write("<div class='mycss'>样式编译</div>");

使用webpack打包指定样式器

使用打包后的js文件


    <!DOCTYPE html>
    <html>
        <head>
            <title>
                Webpack后的js调用
            </title>
            <meta charset="utf-8">
            <link rel="shortcut icon" href="#" />
        </head>
        <body>
            <!--因为js脚本包含支持node的require语法,所以下面的直接调用是存在问题的-->
            <script src="./p03_webpack_03browserjs.js"></script>
        </body>
    </html>


import的使用

import './p03_webpack_01css.css';
// 客户端(浏览器)输出
document.write("<div class='mycss'>样式编译</div>");

webpack的帮助


上一篇 下一篇

猜你喜欢

热点阅读