赞
踩
一、模块化系统
1、ECMAScript5没有模块化功能(ECMAScript6有了)
比如jquery和jquery插件,要分别引入jquery、jquery插件。
2、标准库较少
3、没有标准接口
4、缺乏管理系统
不同包要到不同的官网上找。
5、在Node中,一个js文件就是一个模块
二、NodeJS模块化语法—使用ES6语法
1、node中默认执行ES6语法,import导入、export导出模块会报错
- (node:22992) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
- (Use `node --trace-warnings ...` to show where the warning was created)
- D:\workspace-vscode\NodeJS\module03.js:3
- import * as m1 from "./module01.js";
- ^^^^^^
-
- SyntaxError: Cannot use import statement outside a module
- at wrapSafe (internal/modules/cjs/loader.js:988:16)
- at Module._compile (internal/modules/cjs/loader.js:1036:27)
- at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
- at Module.load (internal/modules/cjs/loader.js:937:32)
- at Function.Module._load (internal/modules/cjs/loader.js:778:12)
- at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
- at internal/main/run_main_module.js:17:47
2、解决办法
(1)执行:npm init -y
(2)在package.json中添加:"type": "module"
三、NodeJS模块化语法—使用CommonJS语法
1、引入函数require()
说明:
(1)在node中,可以通过require()函数来引入外部的模块。
(2)require()可以传递一个文件的路径为参数,node将自动根据路径来引入外部模块。
(3)使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块。
2、向外部暴露变量和方法exports
说明:
(1)在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问。
(2)每个模块对于其他模块都是封闭的,所以要把想暴露的东西暴露出去。
(3)只需要将需要暴露给外部的变量或方法设置为exports的属性即可。
(4)相当于exports对象是一个统一的出口。
3、例子
module01.js
- console.log("我是module01模块");
-
- var school = "xxx三中";
- exports.x = 10;
- var y = 20;
- exports.fn = function(){
-
- }
module03.js
- console.log("我是module03模块");
-
- var md = require("./module01.js");
- console.log(md);
输出:
- node .\module03.js
- 我是module03模块
- 我是module01模块
- { x: 10, fn: [Function (anonymous)] }
四、模块化详解
1、Node中虽然使用的是CommonJS规范(以前),但是其自身也对规范做了一些取舍。
2、在Node中引入模块,需要经历如下3个步骤
(1)路径分析
(2)文件定位
(3)编译执行
3、在Node中,模块分为三类
(1)一类是底层由C++编写的内建模块
(2)一类是Node提供的核心模块
(3)还有一类是用户编写的模块,称为文件模块
4、模块标识
我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块。
模块分成两大类:
核心模块(由node引擎提供的模块,核心模块的标识就是模块的名字)
文件模块(由用户自己创建的模块)
5、global对象
在node中有一个全局对象global,它的作用和网页中的window类似。
在全局中创建的变量都会作为global的属性保存。
在全局中创建的函数都会作为global的方法保存。
6、如何定义全局变量
变量名前不加var。
- a = 10;
- console.log(global.a);
7、arguments对象
arguments是伪数组对象。封装函数的实参。
如何证明每个js模块的代码都是运行在函数里的:
- a = 10;
- //console.log(global.a);
- console.log(arguments);
输出:
- [Arguments] {
- '0': {},
- '1': [Function: require] {
- resolve: [Function: resolve] { paths: [Function: paths] },
- main: Module {
- id: '.',
- path: 'D:\\workspace-vscode\\NodeJS',
- exports: {},
- parent: null,
- filename: 'D:\\workspace-vscode\\NodeJS\\module04.js',
- loaded: false,
- children: [],
- paths: [Array]
- },
- extensions: [Object: null prototype] {
- '.js': [Function (anonymous)],
- '.json': [Function (anonymous)],
- '.node': [Function (anonymous)]
- },
- cache: [Object: null prototype] {
- 'D:\\workspace-vscode\\NodeJS\\module04.js': [Module]
- }
- },
- '2': Module {
- id: '.',
- path: 'D:\\workspace-vscode\\NodeJS',
- exports: {},
- parent: null,
- filename: 'D:\\workspace-vscode\\NodeJS\\module04.js',
- loaded: false,
- children: [],
- paths: [
- 'D:\\workspace-vscode\\NodeJS\\node_modules',
- 'D:\\workspace-vscode\\node_modules',
- 'D:\\node_modules'
- ]
- },
- '3': 'D:\\workspace-vscode\\NodeJS\\module04.js',
- '4': 'D:\\workspace-vscode\\NodeJS'
- }
有5个参数。
8、arguments.callee属性
这个属性保存的是当前执行的函数对象。
打印当前函数对象:
- a = 10;
- //console.log(global.a);
- console.log(arguments.callee + "");
输出:
- function (exports, require, module, __filename, __dirname) {
- a = 10;
- //console.log(global.a);
- console.log(arguments.callee + "");
- }
从中可以看到exports和require是哪里来的了。
exports, require, module, __filename, __dirname这五个,就是上面打印arguments的实参。
9、五个实参说明
(1)exports:该对象用来将变量或函数暴露到外部
(2)require:函数,用来引入外部的模块
(3)module:代表的是当前模块本身。实际上我们用的exports就是module的属性
(4)__filename:当前模块的完整路径
(5)__dirname:当前模块所在的文件夹
五、exports和module.exports
1、exports暴露数据
- exports.name = "孙悟空";
- exports.age = 18;
- exports.sayName = function(){
- console.log("我是孙悟空");
- }
2、module.exports暴露数据
- module.exports = {
- name: "猪八戒",
- age: 28,
- sayName: function(){
- console.log("我是猪八戒");
- }
- }
module.exports后面可以跟一个对象。
无论是用exports,还是用module.exports,最终改的都是module.exports属性。
类似于:
- var obj = {};
- obj.a = {};
- var a = obj.a;
- //a 和 obj.a 指向的是同一个对象
- console.log(a === obj.a); //true
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。