本文目錄一覽:
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
模塊方法解析的全部內容,希望對大家有所幫助。如果您有什麼問題,可以給我留言。感謝大家對本站的支持。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/158170.html