Node.js里的模块和包的概念应该怎么理解

JavaScript013

Node.js里的模块和包的概念应该怎么理解,第1张

1、什么是模块呢?我们可以简单的把它看成一个实现单独功能的文件。比如在前端JS中的jQuery.js,在node.js里,我们把它就看成一个模块的概念就行。 在前端的JS在使用它之前,是用 先要引入此文件。在node.js里,则需要require来引入.

我们新建一个require文件,来引入一下原来写好的sum.js require("./sum")我们发现sum.js文件就自动的运行了。 如果我们想把sum.js里的值获得到、或运行sum.js里定义的一个方法怎么办呢?

大家要注意,定义在模块里的方法,一定要用exports来暴露给调用它的文件,否则无法调用。在前端JS里,被引入的文件里定义的全局变量,在当前文件里是可以使用的,但node.js里不可以。这一点不同于前端的JS

每一个模块都相当于一个私有的作用域。这个模块里定义的变量,调用它的文件是访问不到了,除非用exports来暴露出来.

2、模块的需要返反的值,通过赋给exports的某个属性

3、包的概念:包含一个或多模块的(也就是JS文件的)文件夹(我们先简单的理为包就是一个实现完整功能的目录,其实它的意义远不止这些,先这样上手)

4、什么叫依赖?1、通俗的说就是包里各个文件之前的关系等。比如说谁是主文件(入口文件)2、包与包之间的引用关系。

在node.js里,是有模块和包这两个概念的,一个单独功能的文件,就是一个模块,可能一个复杂的功能,由多个模块组成,我们则把这多个模块,其实也就是文件,组织在一个文件夹里,然后用一个叫package.json的文本文件,来规定这些JS文件之间的关系(这个关系在node.js里叫依赖,就是包里的文件的组织关,一个包里,就是一个文件夹里,最其码要有一个主文件,可能这个主文件还要导入其它的JS文件才能运行,那package.json里,要把这个关系描述清楚)

5、包是模块化JS必须的。

我们可以在node.js项目中直使用别人写好的功能,就是使用别人写的包。也可以自己写一个包,发布到互联网上供大家使用。

从版本

8.5.0

开始,Node.js

开始支持原生

ES

模块,可以通过命令行选项打开该功能。新功能很大程度上得归功于

Bradley

Farias。

1.演示

这个示例的代码目录结构如下:

esm-demo/

lib.mjs

main.mjs

lib.mjs:

export

function

add(x,

y)

{

return

x

+

y

}

main.mjs:

import

{add}

from

'./lib.mjs'

console.log('Result:

'+add(2,

3))

运行演示:

$

node

--experimental-modules

main.mjs

Result:

5

2.清单:需要注意的事情

ES

模块:

·不能动态导入模块。但是

动态import()

的相关工作正在进行中,应该很快就能提供支持。

·没有元变量,如

__dirname

__filename。但是,有一个的类似功能的提案:“import.meta”。看起来可能是这样:

console.log(import.meta.url)

·现在所有模块标识符都是

URL(这部分在

Node.js

是新增的):

·文件

-

带文件扩展名的相对路径:

../util/tools.mjs

·库

-

没有文件扩展名,也没有路径

lodash

·如何更好地使

npm

库在浏览器中也可用(不使用

bundler)仍有待观察。一种可能性是引入

RequireJS

风格的配置数据,将路径映射到实际路径。目前,在浏览器中使用

bare

path

的模块标识符是非法的。

CJS

模块的互操作性

你可以导入

CJS

模块,但它们总是只有默认的导出

-

module.exports

的值。让

CJS

模块支持命名导出已经在做了,但可能需要一段时间。如果你能帮忙,可以来做。

import

fs1

from

'fs'

console.log(Object.keys(fs1).length)

//

86

import

*

as

fs2

from

'fs'

console.log(Object.keys(fs2))

//

['default']

·

不能在

ES

模块中使用

require()。主要原因是:

· 路径解析工作稍有不同:ESM

不支持

NODE_PATH

require.extensions。而且,它的标识符始终是

URL

也会导致一些细微差异。

·

ES

模块始终以异步方式加载,这确保了与

Web

的最大兼容性。这种加载风格并不能通过

require()

混合使用同步加载

CJS

模块。

·

禁止同步模块加载也可以为

Top-level

await

导入

ES

模块保留后路(一个当前正在考虑的功能)。

3.早期版本的

Node.js

上的

ES

模块

如果要在

8.5.0

之前的

Node.js

版本上使用

ES

模块,请参阅

John-David

Dalton

@std/esm。

提示:如果不启用任何可解锁的额外功能,将在

Node.js

保持

100%

兼容原生

ES

模块.

FAQ

什么时候可以不带命令行选项使用ES

模块?

目前的计划是在

Node.js

10

LTS

中默认可使用

ES

模块。

进一步阅读

有关

Node.js

和浏览器中

ES

模块的更多信息:

·

“Making

transpiled

ES

modules

more

spec-compliant”

[using

ES

modules

natively

vs.

transpiling

them

via

Babel]

·

“Module

specifiers:

what's

new

with

ES

modules?”

[Why

.mjs?

How

are

module

specifiers

resolved?

Etc.]

·

“Modules”

[in-depth

chapter

on

ES

modules

in

“Exploring

ES6”]

即将到来的

ECMAScript

提案:

·

博客:

“ES

proposal:

import()

dynamically

importing

ES

modules”

·

提案:

“import.meta”

总结

以上就是小编给大家带来的在

Node.js

中使用原生

ES

模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。