本文目录一览:
node 环境下一个文件如何同时支持 import 和 require
JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS。
CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。
如何让require 和 import在同一文件中使用
如果这时还要使用 CommonJS 模块,那么需要将 CommonJS 脚本的后缀名都改成.cjs。则.js脚本会被解释成 CommonJS 模块。
Node.js 要求 ES6 模块采用.mjs后缀文件名。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"。
请问下面这个函数中设置变量cjs的作用是什么?
cjs这个没有什么实际意义,他的作用大多用来控制一个循环的终止,由此减少时间开销 ,我认为它就是一个‘开关’变量
例如
int i,flag=1;
char a[10];
for(i=0 ;flag ; i++)
{
if(a[i]满足条件)flag=0;
}
这种情况下一般要查找所有的a数组数据,而对于a中的数据没有明确的结束条件,为此制造一个这样变量曲控制循环
再看下一个比较难的例子:是根据变元个数产生真值表的算法
For (j = 0 ;j n ;j + + ) / / n 为命题变元的个数
{
flag = 1 ;
k = (int) pow(2 ,n-j-1) ;
for (i = 0 ;i m;i + + ) / / m 为n 个命题变元的赋值组数,即m=pow(2,n)
{
if ( ! (i %k) ) flag = ! flag ;
if (flag) A[i ] [ j ] = 1 ;/ / 交替生成k 个0 和k 个1
else
A[i ] [ j ] = 0 ;
}
}
这里flag没有控制循环,而flag做赋值开关,对数组赋值
在 Node.js 中使用原生 ES 模块方法解析
从版本
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
模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。