最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript中使用import 和require打包后实现原理分析

来源:懂视网 责编:小采 时间:2020-11-27 22:17:53
文档

JavaScript中使用import 和require打包后实现原理分析

JavaScript中使用import 和require打包后实现原理分析:前言: 之前使用ES6写代码,webpack打包后上线,一点问题没有,也看过打包后的代码,长的很乱,也没敢看看咋回事,加载后就是能运行! 今天通过个例子理解一下打包前,和打包后的代码! 1.创建文件夹,并在里面创建两个文件夹,app文件夹和public文件夹,app文
推荐度:
导读JavaScript中使用import 和require打包后实现原理分析:前言: 之前使用ES6写代码,webpack打包后上线,一点问题没有,也看过打包后的代码,长的很乱,也没敢看看咋回事,加载后就是能运行! 今天通过个例子理解一下打包前,和打包后的代码! 1.创建文件夹,并在里面创建两个文件夹,app文件夹和public文件夹,app文

前言:

之前使用ES6写代码,webpack打包后上线,一点问题没有,也看过打包后的代码,长的很乱,也没敢看看咋回事,加载后就是能运行!

今天通过个例子理解一下打包前,和打包后的代码!

1.创建文件夹,并在里面创建两个文件夹,app文件夹和public文件夹,app文件夹用来存放原始数据和我们将写的JavaScript模块,public文件夹用来存放之后供浏览器读取的文件(包括使用webpack打包生成的js文件以及一个 index.html 文件)。接下来我们再创建三个文件:

  • index.html --放在public文件夹中;
  • Greeter.js -- 放在app文件夹中;
  • main.js -- 放在app文件夹中;
  • 此时项目结构如下图所示


    项目结构

    我们在 index.html 文件中写入最基础的html代码,它在这里目的在于引入打包后的js文件(这里我们先把之后打包后的js文件命名为 bundle.js ,之后我们还会详细讲述)。

    <!-- index.html -->
    <!DOCTYPE html>
    <html lang="en">
     <head>
     <meta charset="utf-8">
     <title>sample Project</title>
     </head>
     <body>
     <div id='root'>
     </div>
     <script src="bundle.js"></script>
     </body>
    </html>

    我们在 Greeter.js 中定义一个返回包含问候信息的 html 元素的函数,并依据CommonJS规范导出这个函数为一个模块:

    // Greeter.js
    exports.greet= function() {
     var greet = document.createElement('div');
     greet.textContent = "Hi there and greetings!";
     return greet;
    };
    exports.USER_INFO = "userInfo";

    main.js 文件中我们写入下述代码,用以把 Greeter模块 返回的节点插入页面。

    //main.js 
     let {greeter,USER_INFO} =require('./Greeter.js');
    console.log(USER_INFO);
    document.querySelector("#root").appendChild(greeter());

    使用webpack打包后:

    (function(modules){ var installedModules = {}; function __webpack_require__(moduleId) {
     if (installedModules[moduleId]) {
     return installedModules[moduleId].exports;
     }
     var module = installedModules[moduleId] = {
     i: moduleId,
     l: false,
     exports: {}
     };
     modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     module.l = true;
     return module.exports;
     }
     __webpack_require__.m = modules;
     __webpack_require__.c = installedModules;
     __webpack_require__.d = function(exports, name, getter) {
     if (!__webpack_require__.o(exports, name)) {
     Object.defineProperty(exports, name, {
     configurable: false,
     enumerable: true,
     get: getter
     });
     }
     };
     __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;
     };
     __webpack_require__.o = function(object, property) {
     return Object.prototype.hasOwnProperty.call(object, property);
     };
     __webpack_require__.p = "";
     return __webpack_require__(__webpack_require__.s = 0);
    })
    (
    [
    (function(module, exports, __webpack_require__) {
     //main.js
     let {
     greeter,
     USER_INFO
     } = __webpack_require__(1);
     console.log(USER_INFO);
     document.querySelector("#root").appendChild(greeter());
    }),
    (function(module, exports) {
     // Greeter.js
     exports.greet = function() {
     var greet = document.createElement('div');
     greet.textContent = "Hi there and greetings!";
     return greet;
     };
     exports.USER_INFO = "userInfo";
    })
    ]);

    首先最为层是包裹着立即执行函数(加粗的内容),参数是一个数组,数组中每一项是对应的模块,每个模块包裹在 (function(module, exports, __webpack_require__) {//模块内容 });

    立即执行函数运行执行  return __webpack_require__(__webpack_require__.s = 0);

    也就是执行传入数组中的第一个模块main.js

    将运行后的每个模块挂载到installedModules = {}上,当下个需要这个模块直接返回当前模块,不在运行代码块了!

    接下来将require改为import看看打包后的如何实现

    我们将 Greeter.js的信息改为如下 :

    // Greeter.js
    export default function() {
     var greet = document.createElement('div');
     greet.textContent = "Hi there and greetings!";
     return greet;
    };
    export const USER_INFO = "userInfo";
    main.js 文件中的代码,修改后
    //main.js 
    import greet,{USER_INFO} from './Greeter.js';
    console.log(USER_INFO);
    document.querySelector("#root").appendChild(greet());

    然后我们再次打包:

    (function(modules) {
     var installedModules = {};
     function __webpack_require__(moduleId) {
     if (installedModules[moduleId]) {
     return installedModules[moduleId].exports;
     }
     var module = installedModules[moduleId] = {
     i: moduleId,
     l: false,
     exports: {}
     };
     modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
     module.l = true;
     return module.exports;
     }
     __webpack_require__.m = modules;
     __webpack_require__.c = installedModules;
     __webpack_require__.d = function(exports, name, getter) {
     if (!__webpack_require__.o(exports, name)) {
     Object.defineProperty(exports, name, {
     configurable: false,
     enumerable: true,
     get: getter
     });
     }
     };
     __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;
     };
     __webpack_require__.o = function(object, property) {
     return Object.prototype.hasOwnProperty.call(object, property);
     };
     __webpack_require__.p = "";
     return __webpack_require__(__webpack_require__.s = 0);
    })([(function(module, __webpack_exports__, __webpack_require__) {
     "use strict";
     Object.defineProperty(__webpack_exports__, "__esModule", {
     value: true
     });
     var __WEBPACK_IMPORTED_MODULE_0__Greeter_js__ = __webpack_require__(1);
     //main.js
     console.log(__WEBPACK_IMPORTED_MODULE_0__Greeter_js__["a"]);
     document.querySelector("#root").appendChild(Object(__WEBPACK_IMPORTED_MODULE_0__Greeter_js__["b"])());
    }),
    (function(module, __webpack_exports__, __webpack_require__) {
     "use strict";
     __webpack_exports__["b"] = (function() {
     var greet = document.createElement('div');
     greet.textContent = "Hi there and greetings!";
     return greet;
     });;
     const USER_INFO = "userInfo";
     __webpack_exports__["a"] = USER_INFO;
    })]);

    总结

    以上所述是小编给大家介绍的JavaScript中使用import 和require打包后实现原理分析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    JavaScript中使用import 和require打包后实现原理分析

    JavaScript中使用import 和require打包后实现原理分析:前言: 之前使用ES6写代码,webpack打包后上线,一点问题没有,也看过打包后的代码,长的很乱,也没敢看看咋回事,加载后就是能运行! 今天通过个例子理解一下打包前,和打包后的代码! 1.创建文件夹,并在里面创建两个文件夹,app文件夹和public文件夹,app文
    推荐度:
    标签: 使用 原理 js
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top