美文网首页
【webpack学习笔记—1】3点弄懂CommonJS模块打包标

【webpack学习笔记—1】3点弄懂CommonJS模块打包标

作者: sam的奋斗日记 | 来源:发表于2020-11-04 19:54 被阅读0次

前言

前端本没有模块化,但是随着前端工程的发展,各个文件间的关系越来越多,为了能彼此方便地引用,慢慢地便有了模块化,这里的一个文件可以理解为一个模块。
打包就是为了让前端工程化,分离代码间的作用域。导出就是将本模块对外暴露,导入就是引入其他模块来使用其方法等。
CommonJS把每个文件当做一个独立的模块(所以这里模块和文件的概念共通),个人认为说到底就是在维护模块中的module的属性,其中有2个关键属性:第一个是exports(默认值是空的),第二个是loaded(默认值是false)。

下面通过3点来介绍如何通过这两个属性实现导入导出的控制。

补充知识点:module长啥样?
执行如下命令

node ./test.js

获得如下输出:

Module {
  id: '.',
  exports: {},  // 未导出属性,所以为空
  parent: null,  // 如果是其他模块引用当前模块,那么引用当前模块的模块名会成为这里的parent,但是这里是直接打印当前模块module的,所以为null
  filename: 'D:\\project\\study-webpack\\src\\test.js',
  loaded: false, // 还没有被使用require调用,为false
  children: [], // 道理同parent,有引用其他模块时这里会显示
  paths:
   [ 'D:\\project\\study-webpack\\src\\node_modules',
     'D:\\project\\study-webpack\\node_modules',
     'D:\\project\\node_modules',
     'D:\\node_modules' ]
 }

1. CommonJS的导出

有2种写法均可以实现对模块属性的导出,以下两种均可,但是不能混用!

// 第一种写法
exports.name = 'sam';
// 第二种写法
module.exports = {
    name : 'sam'
}

补充知识点:为什么不能将2种方式混用 ?
同一文件下混用会将这两个exports分别指向两个不同的对象,我们来测试下:

// 创建一个test.js文件,使用nonde环境执行它,node ./test.js
console.log(module.exports) // {}
console.log(exports) // {}
// 将两种导出进行混用
exports.name = 'sam';
module.exports = {
    sex : 'man'
}
console.log(module.exports) // { sex : 'man' }
console.log(exports) // { name : 'sam' }
console.log(module.exports === exports) // false

很明显生成不同的2个对象,而且无论哪个导出在前,而最终都是以modlue.exports为准。

2. CommonJS的导入

导入很简单,使用require实现,而且可以通过构造表达式来导入(这将与下一篇文章中的ES6 Module导入区别,那个只能提前声明好)

// ./person.js
console.log('this is sam!')
exports.name = 'sam';

// ./info.js
let path = './person' + '.js';
let person = require(path);
console.log(person.name); 
console.log('====================='); 
let person2 = require('./person.js');

获得如下输出

this is sam!
sam
=====================
sam

补充知识点:为什么‘this is sam!’只输出一次?
因为第一次require时,loaded值为false,所以执行文件中的代码,第二次require时,loaded为true,表示已经加载过了,所以不再执行代码。
所以有时候我们第一次使用模块,且只需要模块中代码执行的结果,而不需要调用其他属性时,可以像这样操作:

require('./test.js')

3. 小结

  1. CommonJS有2种导入方式,module.exportsexports.xxx,且二者不能同时混用
  2. 第一次require导入模块时,会执行模块中的代码

内容均为我个人阅读《Webpack实战:入门、进阶与调优》后的回忆总结,这是一本很不错的书,想深入了解webpack的同学可以去看看这本书

相关文章

  • 【webpack学习笔记—1】3点弄懂CommonJS模块打包标

    前言 前端本没有模块化,但是随着前端工程的发展,各个文件间的关系越来越多,为了能彼此方便地引用,慢慢地便有了模块化...

  • js require和import

    Browsersify、Webpack 一开始的目的就是打包 CommonJS 模块。 CommonJS 作为 N...

  • 【webpack学习笔记—3】ES6 Module和Common

    1. 前言 在开始阅读本文前,建议先阅读下面的两篇文章: 【webpack学习笔记—1】3点弄懂CommonJS模...

  • webpack学习

    webpack是什么 是一个模块打包器 模块化历史 CommonJS//moduleA.jsexports.a =...

  • webpack实用性基础教程

    webpack 模块打包了解npm&&commonJS&&ES6&&React webpack本身是一个独立的东西...

  • js webpack的loader和plugin

    常见的webpack代码 webpack的打包原理 识别入口文件 通过逐层识别模块依赖(Commonjs、amd或...

  • webpack中loader和plugin的区别

    一、webpack的常见配置 二、webpack的打包原理 识别入口文件 通过逐层识别模块依赖(Commonjs、...

  • webpack

    webpack是一个模板打包器webpack 能识别es6模块、 CommonJS、CMD、AMD均能识别webp...

  • webpack学习笔记(1)

    webpack学习笔记(1) webpack概念-代码打包工具,给定一个入口文件,找到这个文件所依赖的模块和这个依...

  • webpack入门学习笔记

    webpack学习笔记 什么是Webpack? WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构...

网友评论

      本文标题:【webpack学习笔记—1】3点弄懂CommonJS模块打包标

      本文链接:https://www.haomeiwen.com/subject/kafnvktx.html