日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

import的几种用法

發(fā)布時(shí)間:2023/12/4 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 import的几种用法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

 第一種導(dǎo)出的方式:

  在lib.js文件中, 使用?export{接口}?導(dǎo)出接口, 大括號(hào)中的接口名字為上面定義的變量,?importexport是對(duì)應(yīng)的;

運(yùn)行下面代碼

//lib.js 文件
let bar = "stringBar";
let foo = "stringFoo";
let fn0 = function() {console.log("fn0");
};
let fn1 = function() {console.log("fn1");
};
export{ bar , foo, fn0, fn1}//main.js文件
import {bar,foo, fn0, fn1} from "./lib";
console.log(bar+"_"+foo);
fn0();
fn1();

    

  第二種導(dǎo)出的方式:

?  在export接口的時(shí)候, 我們可以使用 XX as YY, 把導(dǎo)出的接口名字改了, 比如:?closureFn as sayingFn, 把這些接口名字改成不看文檔就知道干什么的:

運(yùn)行下面代碼

//lib.js文件
let fn0 = function() {console.log("fn0");
};
let obj0 = {}
export { fn0 as foo, obj0 as bar};//main.js文件
import {foo, bar} from "./lib";
foo();
console.log(bar);

?

    

  第三種導(dǎo)出的方式:

  這種方式是直接在export的地方定義導(dǎo)出的函數(shù),或者變量:

運(yùn)行下面代碼

//lib.js文件
export let foo = ()=> {console.log("fnFoo") ;return "foo"},bar = "stringBar";//main.js文件
import {foo, bar} from "./lib";
console.log(foo());
console.log(bar);

?

    

  第四種導(dǎo)出的方式:

  這種導(dǎo)出的方式不需要知道變量的名字, 相當(dāng)于是匿名的, 直接把開發(fā)的接口給export;
  如果一個(gè)js模塊文件就只有一個(gè)功能, 那么就可以使用export default導(dǎo)出;

運(yùn)行下面代碼

//lib.js
export default "string";//main.js
import defaultString from "./lib";
console.log(defaultString);

?

    

  第五種導(dǎo)出方式:

  export也能默認(rèn)導(dǎo)出函數(shù), 在import的時(shí)候, 名字隨便寫, 因?yàn)槊恳粋€(gè)模塊的默認(rèn)接口就一個(gè):

運(yùn)行下面代碼

//lib.js
let fn = () => "string";
export {fn as default};//main.js
import defaultFn from "./lib";
console.log(defaultFn());

?

  第六種導(dǎo)出方式:

  使用通配符* ?,重新導(dǎo)出其他模塊的接口 (其實(shí)就是轉(zhuǎn)載文章, 然后不注明出處啦);

運(yùn)行下面代碼

//lib.js
export * from "./other";
//如果只想導(dǎo)出部分接口, 只要把接口名字列出來
//export {foo,fnFoo} from "./other";//other.js
export let foo = "stringFoo", fnFoo = function() {console.log("fnFoo")};//main.js
import {foo, fnFoo} from "./lib";
console.log(foo);
console.log(fnFoo());

?

  

  其他:ES6的import和export提供相當(dāng)多導(dǎo)入以及導(dǎo)出的語法;

  在import的時(shí)候可以使用通配符*導(dǎo)入外部的模塊:

運(yùn)行下面代碼

import * as obj from "./lib";
console.log(obj);

回到頂部

  ES6導(dǎo)入的模塊都是屬于引用:

  每一個(gè)導(dǎo)入的js模塊都是活的, 每一次訪問該模塊的變量或者函數(shù)都是最新的, 這個(gè)是原生ES6模塊?與AMDCMD的區(qū)別之一,以下代碼修改自http://exploringjs.com/es6/ch_modules.html#_imports-are-read-only-views-on-exports

運(yùn)行下面代碼

//lib.js
export let counter = 3;
export function incCounter() {counter++;
}
export function setCounter(value) {counter = value;
}//main.js
import { counter, incCounter ,setCounter} from './lib';// The imported value `counter` is live
console.log(counter); // 3
incCounter();
console.log(counter); // 4
setCounter(0);
console.log(counter); // 0

?

  在main.js中, counter一直指向lib.js中的局部變量counter, 按照J(rèn)S的尿性, 像數(shù)字或者字符串類型或者布爾值的原始值要被復(fù)制, 而不是賦址;

回到頂部

  循環(huán)依賴的問題:

  NodeJS的循環(huán)依賴是這么處理的:打開;

  循環(huán)依賴是JS模塊化帶來的問題,?在瀏覽器端, 使用RequireJS測(cè)試模塊化,?比如有一個(gè)文件file0.js依賴于file1.js, 而file1.js又依賴于file0.js, 那么file0.js和file1.js到底誰先執(zhí)行?

運(yùn)行下面代碼

//index.html
<!DOCTYPE html>
<html>
<head><title></title><meta charset="utf-8"/>
</head>
<body><script data-main="cyclic" src="//cdn.bootcss.com/require.js/2.2.0/require.min.js"></script>
<script>
//cyclic.js
require(["file0"], function(file0) {console.log(file0)
})//file0.js
define(["file1"], function(file1) {console.log(file1)return {file0 : "file0"}
})//file1.js
define(["file0"], function(file0) {console.log(file0);return {file1 : "file1"}
})
</script>
</body>
</html>

?

  在控制臺(tái)的依次輸出為:

運(yùn)行下面代碼

undefined
Object { file1: "file1" } 
Object { file0: "file0" }

  在執(zhí)行file1.js的時(shí)候file0.js還沒執(zhí)行完, 所以輸出了undefined, 這種輸出結(jié)果和NodeJS輸出的情況是一樣的;

  然后我又使用了司徒大神的mass-framework框架試了一下, 司徒大神的框架直接提示我:?"模塊與之前的某些模塊存在循環(huán)依賴", 這樣還比較好點(diǎn), requireJS對(duì)于循環(huán)依賴是直接執(zhí)行循環(huán)依賴的模塊, 會(huì)導(dǎo)致在開發(fā)的時(shí)候給自己挖坑....;

  接下來我又在babel-node下進(jìn)行測(cè)試:下面是幾個(gè)測(cè)試,可以無視:

  我使用ES6的模塊試一試, 只要每一個(gè)模塊被引用, 無論模塊是否執(zhí)行完畢, 該模塊的export已經(jīng)被導(dǎo)出了, 如果導(dǎo)出的是函數(shù):

運(yùn)行下面代碼

//cyclic.js
import fn0 from "./file0";
fn0();//file0.js
import fn1 from "./file1";
fn1();
console.log("file0.js runs");
export default function() {console.log("file0 export runs")}//file1.js
import fn0 from "./file0";
fn0();
console.log("file1.js runs");
export default function() {console.log("file1 export runs")}

?

  

  如果導(dǎo)出的是字符串:

運(yùn)行下面代碼

//cyclic.js
import str from "./file0";
console.log(str);//file0.js
import str1 from "./file1";
console.log(str1)
console.log("file0.js runs");
export default "str0";//file1.js
import str0 from "./file0";
console.log(str0)
console.log("file1.js runs");
export default "str1";

?

  

  如果導(dǎo)出的是對(duì)象:

  那么第一行會(huì)先輸出一個(gè)初始值{},在最后等待file0.jsfile1.js執(zhí)行完畢以后, 才輸出file0.js導(dǎo)出的對(duì)象;

  如果是數(shù)組:

  那么第一行會(huì)輸出一個(gè)被靜態(tài)分析過的初始值undefined,在最后等待file0.jsfile1.js執(zhí)行完畢以后, 才輸出file0.js導(dǎo)出的對(duì)象;

  如果是布爾值:

  那么第一行會(huì)輸出一個(gè)被靜態(tài)分析過的初始值undefined,在最后等待file0.jsfile1.js執(zhí)行完畢以后, 才輸出file0.js導(dǎo)出的布爾值;

?

  為什么會(huì)這樣呢? 我好像在這邊找到了答案:http://exploringjs.com/es6/ch_modules.html#_modules?,ES6的import和export被提前到j(luò)s的最頂層, 在函數(shù)或者對(duì)象,或者基本值被導(dǎo)出去的時(shí)候提前被靜態(tài)分析過,參考:http://www.ecma-international.org/ecma-262/6.0/#sec-parsemodule?,?http://www.ecma-international.org/ecma-262/6.0/#sec-toplevelmoduleevaluationjob

  結(jié)論:用ES6的export導(dǎo)出數(shù)據(jù)接口的時(shí)候, 最好統(tǒng)一用函數(shù), 避免在循環(huán)依賴的時(shí)候, 因?yàn)镴S會(huì)把不同類型的對(duì)象靜態(tài)解析成不同的初始值;

轉(zhuǎn)載于:https://www.cnblogs.com/yforward/p/7263409.html

總結(jié)

以上是生活随笔為你收集整理的import的几种用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。