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

import與export在node.js中的使用詳解

 更新時(shí)間:2017年09月28日 09:11:09   作者:愛(ài)則拉絲  
本篇文章主要介紹了import與export在node.js中的使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)述

import與export是es6中模塊化的導(dǎo)入與導(dǎo)出,node.js現(xiàn)階段不支持,需要通過(guò)babel進(jìn)行編譯,使其變成node.js的模塊化代碼。(關(guān)于node.js模塊,可參考其他node.js模塊化的文章)

export 曝露

使用export可以曝露出方法、對(duì)象、字符串等等,如下代碼

//寫(xiě)法1
export var foo=function(){
  console.log(1);
}
//寫(xiě)法2
var bar ={a:"1",b:2};
export {bar};
//寫(xiě)法3
var baz='hello world';
export {baz as qux};

那么,上面的代碼經(jīng)過(guò)babel的編譯后,變成可以執(zhí)行的node.js代碼,如下

"use strict";
//標(biāo)記這個(gè)模塊是es的模塊
Object.defineProperty(exports, "__esModule", {
  value: true
});
//寫(xiě)法1
var foo = exports.foo = function foo() {
  console.log(1);
};
//寫(xiě)法2
var bar = { a: "1", b: 2 };
exports.bar = bar;
//寫(xiě)法3

var baz = 'hello world';
exports.qux = baz;

看到上面的代碼我們知道了,es6的export會(huì)被轉(zhuǎn)成node.js中的exports的曝露方式。

import 導(dǎo)入

再來(lái)看下import的寫(xiě)法,我們引入上面寫(xiě)export的文件xx.js

第一種寫(xiě)法

import {foo,qux} from './xx';
console.log(qux);

foo,qux是在xx.js中我們曝露出來(lái)的屬性,在xx.js中曝露出來(lái)的屬性有foo、bar、qux3個(gè),由此可知這種寫(xiě)法需要知道引入文件中曝露出來(lái)的屬性的名稱,并且可以按需要寫(xiě),不需要枚舉全部屬性。

下面我們來(lái)看下babel編譯后的代碼:

'use strict';
var _ = require('./xx');
console.log(_.qux);

就是一個(gè)簡(jiǎn)單的require方法,引入xx.js,所以用這種方式我們是可以引入es6的模塊也可以引入node.js模塊的。

第二種寫(xiě)法

import * as xx from './xx';
console.log(xx.bar);

這里還是引入xx.js,這種寫(xiě)法會(huì)把xx.js中曝露出來(lái)的屬性都賦值給xx這個(gè)變量(其實(shí)就是給module.exports起個(gè)別名),被babel編譯后如下下:

'use strict';
var _ = require('./xx');
var xx = _interopRequireWildcard(_);
function _interopRequireWildcard(obj) {
  //判斷是node模塊還是es模塊
  if (obj && obj.__esModule) {
    return obj;
  }
  else {
    var newObj = {};
    if (obj != null) {
      for (var key in obj) { 
        if (Object.prototype.hasOwnProperty.call(obj, key)) 
         newObj[key] = obj[key];
      }
    }
  //兼容舊的babel編譯
    newObj.default = obj;
    console.log(newObj);
    return newObj;
  }
}
console.log(xx.bar);

看到上面的代碼,有一個(gè)判斷是node模塊還是es模塊,這種寫(xiě)法也是兼容es模塊和node的模塊的。

第三種寫(xiě)法

import oo from './xx'
console.log(oo.bar);

在這種寫(xiě)法中oo是隨意的變量,乍一看可能會(huì)覺(jué)的和第二種寫(xiě)法一樣,其實(shí)不然,來(lái)看一下編譯后的代碼:

'use strict';
var _ = require('./xx');
var _2 = _interopRequireDefault(_);
function _interopRequireDefault(obj) { 
 return obj && obj.__esModule ? obj : 
 { default: obj }; 
}
console.log(_2.default.bar);

在最后一行,oo.bar被編譯成了_2.default.bar,多了一個(gè)default,這里的bar當(dāng)然就找不到了,所以這種用法不是用來(lái)引入export的屬性的,而是下面要說(shuō)的export default。

export default 曝露且一次性曝露

export與export default我會(huì)在別的文章總結(jié),這里我們只說(shuō)export default的用法,下面來(lái)看代碼。

var foo=123;
export default foo;

被babel編譯后

"use strict";
Object.defineProperty(exports, "__esModule", {
 value: true
});
var foo = 123;
exports.default = foo;

看到最后一行foo會(huì)被賦給exports.default,這樣正好對(duì)應(yīng)上了import oo from './xx'這種寫(xiě)法里面會(huì)調(diào)用default里面的屬性,所以這兩種用法對(duì)應(yīng)使用。既然屬性的值是會(huì)賦給exports.default,那么就可以有下面的用法

export default 123;

export default {foo:123};
export default function f(){}
export default function (){}

上面的代碼是分開(kāi)寫(xiě)的,因?yàn)橐粋€(gè)js里面只能使用一次export default,理由和使用module.exports一樣,除了不能寫(xiě)多個(gè),下面也是錯(cuò)誤的寫(xiě)法:

export default var foo=123; //錯(cuò)誤

export default還可以用來(lái)曝露class這里不多說(shuō)了,都是曝露。

其他的一些用法

繼承

這里說(shuō)是模塊繼承,其實(shí)就是一個(gè)父模塊引入子模塊,然后又將子模塊曝露出來(lái)的屬性曝露出去:

export * from './xx';

被編譯后

'use strict';
Object.defineProperty(exports, "__esModule", {
 value: true
});
var _ = require('./xx');
Object.keys(_).forEach(function (key) {
 if (key === "default" || key === "__esModule") return;
 Object.defineProperty(exports, key, {
  enumerable: true,
  get: function get() {
   return _[key];
  }
 });
});

注意下面這句

if (key === "default" || key === "__esModule") return;

default屬性不向外曝露...這說(shuō)明,我們的引入的xx.js這個(gè)文件里面用exports default是無(wú)效的,替代寫(xiě)法是

export {default} from './xx';

繼承的寫(xiě)法常用于組織多個(gè)模塊,經(jīng)常與下面要說(shuō)的引包一起用

引文件夾(引包)

很多人不理解下面這行代碼

import * as o from './oo'; //oo是個(gè)文件

為什么import可以引入文件夾,注意不是什么文件夾都可以,里面至少有一個(gè)文件就是index.js或者有package.json和另外名字的js,因?yàn)槲募A里面有index.js那么這就不是一個(gè)文件夾而是node.js的包了(更多參見(jiàn)node.js包的文章),import會(huì)被babel編譯成require,require可以去引用指定路徑的包,因此,import可以去導(dǎo)入一個(gè)文件夾,我們可以依賴index.js將文件夾中的其他文件代碼導(dǎo)出,例如:


//index.js
export * from './1';
export * from './2';

我們可以通過(guò)import oo這個(gè)文件夾得到1.js、2.js里面曝露出的屬性。

總結(jié)

從看babel編譯后的代碼,可以看出export與exports,module.exports與export default的用法的相似,至于用什么怎么用還是看個(gè)人喜好吧。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用node.js 制作網(wǎng)站前臺(tái)后臺(tái)

    使用node.js 制作網(wǎng)站前臺(tái)后臺(tái)

    本文給大家介紹實(shí)用node.js 制作網(wǎng)站前臺(tái)和后臺(tái),非常的詳盡,有需要的朋友可以參考下
    2014-11-11
  • express.js如何做mysql注入與node-mysql中防止SQL注入方法解析

    express.js如何做mysql注入與node-mysql中防止SQL注入方法解析

    這篇文章主要介紹了express.js如何做mysql注入與node-mysql中防止SQL注入方法,結(jié)合實(shí)例形式分析了express框架使用mysql數(shù)據(jù)庫(kù)過(guò)程中SQL注入的原理與防范技巧,需要的朋友可以參考下
    2023-05-05
  • NodeJS實(shí)現(xiàn)圖片上傳代碼(Express)

    NodeJS實(shí)現(xiàn)圖片上傳代碼(Express)

    本篇文章主要介紹了NodeJS實(shí)現(xiàn)圖片上傳代碼(Express) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 詳解Node全局變量global模塊

    詳解Node全局變量global模塊

    這篇文章主要介紹了詳解Node全局變量global模塊,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Nodejs中讀取中文文件編碼問(wèn)題、發(fā)送郵件和定時(shí)任務(wù)實(shí)例

    Nodejs中讀取中文文件編碼問(wèn)題、發(fā)送郵件和定時(shí)任務(wù)實(shí)例

    這篇文章主要介紹了Nodejs中讀取中文文件編碼問(wèn)題、發(fā)送郵件和定時(shí)任務(wù)實(shí)例,本文使用了3個(gè)模塊來(lái)解決這3個(gè)需求,并給出了代碼操作實(shí)例,需要的朋友可以參考下
    2015-01-01
  • 使用Node.js在深度學(xué)習(xí)中做圖片預(yù)處理的方法

    使用Node.js在深度學(xué)習(xí)中做圖片預(yù)處理的方法

    這篇文章主要介紹了使用Node.js在深度學(xué)習(xí)中做圖片預(yù)處理的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 如何在Nestjs和Vue3中使用socket.io示例詳解

    如何在Nestjs和Vue3中使用socket.io示例詳解

    這篇文章主要為大家介紹了如何在Nestjs和Vue3中使用socket.io示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Node.js 中的流Stream模塊簡(jiǎn)介及如何使用流進(jìn)行數(shù)據(jù)處理

    Node.js 中的流Stream模塊簡(jiǎn)介及如何使用流進(jìn)行數(shù)據(jù)處理

    Node.js中的流(Stream)模塊用于高效處理流式數(shù)據(jù),包括可讀流、可寫(xiě)流、雙邊流和轉(zhuǎn)換流等,通過(guò)`fs.createReadStream`和`.pipe`方法可以方便地讀取文件并寫(xiě)入控制臺(tái)或處理網(wǎng)絡(luò)請(qǐng)求,在實(shí)際開(kāi)發(fā)中,需要注意錯(cuò)誤處理、資源管理和性能優(yōu)化等問(wèn)題
    2025-03-03
  • NodeJS制作爬蟲(chóng)全過(guò)程

    NodeJS制作爬蟲(chóng)全過(guò)程

    這篇文章主要介紹了NodeJS制作爬蟲(chóng)的全過(guò)程,包括項(xiàng)目建立,目標(biāo)網(wǎng)站分析、使用superagent獲取源數(shù)據(jù)、使用cheerio解析、使用eventproxy來(lái)并發(fā)抓取每個(gè)主題的內(nèi)容等方面,有需要的小伙伴參考下吧。
    2014-12-12
  • Node.js高版本降為低版本的操作步驟

    Node.js高版本降為低版本的操作步驟

    部分老舊項(xiàng)目需要使用低版本的node,網(wǎng)上很多是無(wú)效的,高版本無(wú)法直接安裝低版本node,但是低版本nodejs可以安裝部分高版本node,從而達(dá)到升級(jí)效果,下面這篇文章主要給大家介紹了關(guān)于nodejs高版本降為低版本的詳細(xì)解決方案,需要的朋友可以參考下
    2024-03-03

最新評(píng)論

阿拉善盟| 宽城| 长寿区| 福州市| 毕节市| 兴业县| 方城县| 历史| 汤阴县| 吴堡县| 沧州市| 利辛县| 平乐县| 西藏| 朝阳市| 上犹县| 兴海县| 榆树市| 通榆县| 公主岭市| 沅江市| 凯里市| 清原| 涿州市| 深州市| 河西区| 鄂托克旗| 绵阳市| 吴川市| 临沭县| 衢州市| 郑州市| 孙吴县| 永春县| 南安市| 安国市| 崇左市| 清流县| 连南| 阆中市| 舟山市|