最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS中ESModule和commonjs介紹及使用區(qū)別

 更新時(shí)間:2022年07月26日 08:54:33   作者:??Larixs?  
這篇文章主要介紹了JS中ESModule和commonjs介紹及使用區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

ES Module

導(dǎo)出

僅導(dǎo)出

  • named exports: 命名導(dǎo)出,每次可以導(dǎo)出一個(gè)或者多個(gè)。
  • default exports: 默認(rèn)導(dǎo)出,每次只能存在一個(gè)。

以上兩者可以混合導(dǎo)出:

    // 命名導(dǎo)出
    export const b = 'b'
    // 默認(rèn)導(dǎo)出
    export default {
      a: 1
    };

    const c = 'c'
    export { c }
    
    // 以上內(nèi)容會(huì)合并導(dǎo)出,即導(dǎo)出為: {b:'b', c:'c', default: {a:1}}

更多示例可以直接去看mdn

重導(dǎo)出(re-exporting / aggregating)

算是一個(gè)導(dǎo)入再導(dǎo)出的一個(gè)語法糖吧。

  export {
    default as function1,
    function2,
  } from 'bar.js';

  // 等價(jià)于
  import { default as function1, function2 } from 'bar.js';
  export { function1, function2 };

然而這種語法是會(huì)報(bào)錯(cuò)的:

export DefaultExport from 'bar.js'; // Invalid

正確的語法應(yīng)該是:

export { default as DefaultExport } from 'bar.js'; // valid

我猜是因?yàn)閑xport 本身支持的export xxx這種語法必須是要導(dǎo)出一個(gè)對(duì)象,然而import xxx可能是任意類型,兩者沖突了,所以從編譯層面就不讓這種語法生效會(huì)更好。

嵌入式腳本

嵌入式腳本不可以使用export。

引入

語法

  • import all exports: import * as allVar,所有導(dǎo)出內(nèi)容,包含命名導(dǎo)出及默認(rèn)導(dǎo)出。allVar會(huì)是一個(gè)對(duì)象,默認(rèn)導(dǎo)出會(huì)作為allVar的key名為default對(duì)應(yīng)的值。
  • import named exports: import {var1, var2},引入命名導(dǎo)出的部分。沒找到,對(duì)應(yīng)的值就為undefined。個(gè)人覺得可以看做是"import all exports"的解構(gòu)語法。
  • import default exports: import defaultVar,引入默認(rèn)導(dǎo)出的部分。
  • import side effects: import "xxx./js",僅運(yùn)行這個(gè)js,可能是為了獲取其副作用。
    // test.js
    export const b = 'b'     // 命名導(dǎo)出
    export default {    // 默認(rèn)導(dǎo)出
      a: 1
    };

    // index.js
    import { b, default as _defaultModule } from './test.js'
    import defaultModule from './test.js'
    import * as allModule from './test.js'

    console.log('name export', b) // 'b'
    console.log('default export', defaultModule) // {a:1}
    console.log(_defaultModule === defaultModule) // true
    console.log('all export', allModule) // {b:'b', default: {a:1}}

一個(gè)之前老記錯(cuò)的case

    // test.js
    export default {    // 默認(rèn)導(dǎo)出
      a: 1
    };

    // index.js
    import { a } from './test.js'
    console.log('name export', a) // undefined

    // index.js
    import defaultModule from './test.js'
    import * as allModule from './test.js'
    console.log('default export', defaultModule) // {a:1}
    console.log('all export', allModule) // {default: {a:1}}

嵌入式腳本

嵌入式腳本引入modules時(shí),需要在script上增加 type="module"。

特點(diǎn)

live bindings:

  • 通過export在mdn上的解釋,export導(dǎo)出的是live bindings,再根據(jù)其他文章綜合判斷,應(yīng)該是引用的意思。即export導(dǎo)出的是引用
  • 模塊內(nèi)的值更新了之后,所有使用export導(dǎo)出值的地方都能使用最新值。

read-only:通過import在mdn上的解釋,import使用的是通過export導(dǎo)出的不可修改的引用。

strict-mode:被引入的模塊都會(huì)以嚴(yán)格模式運(yùn)行。

靜態(tài)引入、動(dòng)態(tài)引入

import x from這種語法有syntactic rigid,需要編譯時(shí)置于頂部且無法做到動(dòng)態(tài)引入加載。如果需要?jiǎng)討B(tài)引入,則需要import ()語法。有趣的是,在mdn上,前者分類到了 Statements & declarations, 后者分類到了 Expressions & operators。這倆是根據(jù)什么分類的呢?

  true && import test from "./a.js";
  // SyntaxError: import can only be used in import() or import.meta
  // 這里應(yīng)該是把import當(dāng)成了動(dòng)態(tài)引入而報(bào)錯(cuò)

示例:

  // a.js
  const test = {
    a: 1
  };
  export default test;
  // 改動(dòng)模塊內(nèi)部的值
  setTimeout(() => {
    test.a = 2;
  }, 1000);

  // index.js
  import test from './index.js'

  /* live bindings */
  console.log(test) // {a:1}
  setTimeout(()=>{
    console.log(test) // {a:2}
  }, 2000)

  /* read-only */
  test= { a: 3 } // 報(bào)錯(cuò), Error: "test" is read-only.

  /* syntactically rigid */
  if(true){
    import test from './index.js' // 報(bào)錯(cuò), SyntaxError: 'import' and 'export' may only appear at the top level
  }

commonJS

導(dǎo)出

在 Node.js 模塊系統(tǒng)中,每個(gè)文件都被視為獨(dú)立的模塊。模塊導(dǎo)入導(dǎo)出實(shí)際是由nodejs的模塊封裝器實(shí)現(xiàn),通過為module.exports分配新的值來實(shí)現(xiàn)導(dǎo)出具體內(nèi)容。

module.exports有個(gè)簡寫變量exports,其實(shí)就是個(gè)引用復(fù)制。exports作用域只限于模塊文件內(nèi)部。 原理類似于:

// nodejs內(nèi)部
exports = module.exports

console.log(exports, module.exports) // {}, {}
console.log(exports === module.exports) // true

注意:nodejs實(shí)際導(dǎo)出的是module.exports,以下幾種經(jīng)典case單獨(dú)看一下:

case1:

// ?使用exports
exports.a = xxx
console.log(exports === module.exports) // true

// ?等價(jià)于
module.exports.a = xxx

case2:

// ?這么寫可以導(dǎo)出,最終導(dǎo)出的是{a:'1'}
module.exports = {a:'1'}

console.log(exports, module.exports) // {}, {a:'1'}
console.log(exports === module.exports) // false


// ?不會(huì)將{a:'1'}導(dǎo)出,最終導(dǎo)出的是{}
exports = {a:'1'}

console.log(exports, module.exports) // {a:'1'}, {}
console.log(exports === module.exports) // false

引入

通過require語法引入:

// a是test.js里module.exports導(dǎo)出的部分
const a = require('./test.js')

原理偽代碼:

function require(/* ... */) {
  const module = { exports: {} };
  ((module, exports) => {
    // Module code here. In this example, define a function.
    function someFunc() {}
    exports = someFunc;
    // At this point, exports is no longer a shortcut to module.exports, and
    // this module will still export an empty default object.
    module.exports = someFunc;
    // At this point, the module will now export someFunc, instead of the
    // default object.
  })(module, module.exports);
  return module.exports;
}

特點(diǎn)

值拷貝

// test.js
let test = {a:'1'}
setTimeout(()=>{
  test = {a:'2'}
},1000)
module.exports = test

// index.js
const test1 = require('./test.js')
console.log(test1) // {a:1}
setTimeout(()=>{
  console.log(test1) // {a:1}
},2000)

ES Module和 commonJS區(qū)別

語法:

exports、module.exportsrequire 是Node.js模塊系統(tǒng)關(guān)鍵字。

exportexport defaultimport 則是ES6模塊系統(tǒng)的關(guān)鍵字:

原理:

exports、module.exports導(dǎo)出的模塊為值復(fù)制。

export、export default為引用復(fù)制。

時(shí)機(jī):

ES Module靜態(tài)加載是編譯時(shí)確定,ES Module動(dòng)態(tài)加載是運(yùn)行時(shí)確定。

CommonJS是運(yùn)行時(shí)確定。

到此這篇關(guān)于JS中ESModule和commonjs介紹及使用區(qū)別的文章就介紹到這了,更多相關(guān)JS ESModule和commonjs 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解JavaScript中Canvas的高級(jí)繪圖和動(dòng)畫技術(shù)

    詳解JavaScript中Canvas的高級(jí)繪圖和動(dòng)畫技術(shù)

    JavaScript中的Canvas 是一個(gè)強(qiáng)大的 HTML5 元素,允許你通過編程方式創(chuàng)建圖形、繪制圖像和實(shí)現(xiàn)復(fù)雜的動(dòng)畫效果,在本文中,我們將深入探討 JavaScript Canvas 的高級(jí)繪圖和動(dòng)畫技術(shù),并提供一個(gè)復(fù)雜的案例,以展示其潛力,需要的朋友可以參考下
    2023-10-10
  • 微信小程序?qū)崿F(xiàn)文字滾動(dòng)

    微信小程序?qū)崿F(xiàn)文字滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)文字滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • JS打印彩色菱形的實(shí)例代碼

    JS打印彩色菱形的實(shí)例代碼

    本文通過一段簡單的實(shí)例代碼給大家介紹js實(shí)現(xiàn)打印彩色菱形的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-08-08
  • javascript數(shù)據(jù)類型詳解

    javascript數(shù)據(jù)類型詳解

    本文介紹了對(duì)javascript數(shù)據(jù)類型;隱式轉(zhuǎn)換 (+ 和 -,== 和 ===);包裝對(duì)象等相關(guān)知識(shí)進(jìn)行詳細(xì)介紹,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 學(xué)習(xí)drag and drop js實(shí)現(xiàn)代碼經(jīng)典之作

    學(xué)習(xí)drag and drop js實(shí)現(xiàn)代碼經(jīng)典之作

    今天讀John Resig的Pro Javascript Techniques時(shí)候看到他書上給的一個(gè)關(guān)于drag and drop的例子, 合上書本自己寫一個(gè)簡化版本的。大約20分鐘完成, 沒有考慮兼容firefox。整個(gè)代碼封裝成一個(gè)對(duì)象 也是借鑒書中的風(fēng)格。我覺得很好。
    2009-04-04
  • JS中引用百度地圖并將百度地圖的logo和信息去掉

    JS中引用百度地圖并將百度地圖的logo和信息去掉

    采用CSS覆蓋的方法就可以了,但是官方是不允許這么做的,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下
    2013-09-09
  • JavaScript模板引擎用法實(shí)例

    JavaScript模板引擎用法實(shí)例

    這篇文章主要介紹了JavaScript模板引擎用法,涉及javascript實(shí)現(xiàn)模板的定義與字符替換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • JavaScript阻止回車提交表單的方法

    JavaScript阻止回車提交表單的方法

    如何防止回車(enter)鍵提交表單,其實(shí)很簡單,就一句話。onkeydown="if(event.keyCode==13)return false;"把這句寫在from標(biāo)簽里面就好了
    2015-12-12
  • JavaScript中DOM詳解

    JavaScript中DOM詳解

    這篇文章主要介紹了jQuery 中DOM 操作詳解,以及在火狐和IE之間的13點(diǎn)JavaScript差異,需要的朋友可以參考下
    2015-04-04
  • HTML與javascript常碰到的編碼問題

    HTML與javascript常碰到的編碼問題

    在日常的前端開發(fā)工作中,我們會(huì)經(jīng)常的與HTML、javascript、css等語言打交道,和一門真正的語言一樣,計(jì)算機(jī)語言也有它的字母表、語法、詞法、編碼方式等
    2008-12-12

最新評(píng)論

尼木县| 富阳市| 昌邑市| 天门市| 舞钢市| 武城县| 唐山市| 平南县| 乾安县| 无棣县| 巩义市| 淅川县| 梁河县| 航空| 阿巴嘎旗| 澎湖县| 孟津县| 太湖县| 诸城市| 来宾市| 庄浪县| 南京市| 灵宝市| 佳木斯市| 富裕县| 富锦市| 林甸县| 舟山市| 建始县| 龙游县| 山西省| 小金县| 邢台县| 勐海县| 平远县| 宜川县| 博湖县| 佛冈县| 陆良县| 清远市| 宁波市|