模塊化開發(fā)

ES Modules特性
  • 1、ESM 自動采用嚴格模式,忽略 ‘use strict’
  • 2梁棠、每個ES Module 都是運行在單獨的私有作用域中
  • 3置森、ESM是通過CORS的方式請求外部JS模塊的
  • 4、ESM的script標簽會延遲執(zhí)行腳本 相當于defer屬性

安裝一個本地serve

npm i serve -g

serve .     //運行文件
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 通過給script 添加type = module 屬性掰茶,就可以  以  ES Module 的標準執(zhí)行js中的代碼 -->
    <script type="module">
        console.log('this is es module');
    </script>

    <!-- 1暇藏、ESM  自動采用嚴格模式蜜笤,忽略 ‘use strict’ -->
    <script type="module">
        console.log(this);
    </script>
    <!-- 2濒蒋、每個ES Module 都是運行在單獨的私有作用域中 -->
    <script type="module">
        var foo = 100;
        console.log(foo)
    </script>
    <script type="module">
        console.log(foo)
    </script>

    <!-- 3、ESM是通過CORS的方式請求外部JS模塊的 -->
    <script type="module" src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>

    <!-- 4把兔、ESM的script標簽會延遲執(zhí)行腳本  相當于defer屬性 -->
    <!-- <script src='demo.js'></script> -->
    <!-- <script type="module" src='demo.js'></script> -->
    <script defer src='demo.js'></script>
    <p>需要顯示的內(nèi)容</p>
</body>

</html>

ES Modules 導(dǎo)出

npm install -g browser-sync
啟動 BrowserSync

// --files 路徑是相對于運行該命令的項目(目錄) 
browser-sync start --server --files "css/*.css"

關(guān)鍵字 export

// 導(dǎo)出和重命名
export {
    name as name1
    hello as hello1
    Person as Person1
}

ES Module 導(dǎo)入導(dǎo)出的注意事項

1沪伙、導(dǎo)出的成員并不是一個字面量對象為固定語法
export {name,age}
2、導(dǎo)入的時候不是解構(gòu),為固定語法
import {name,age} from './module.js'
3县好、導(dǎo)出的成員不是本身围橡,只是導(dǎo)出了地址,外部的時候只是引用缕贡,只是只讀成員翁授,外部不能改變內(nèi)部的值。

ES Module 導(dǎo)入用法

import { name } from "./module.js";

import { } from "./module.js";

import * as mod from "./module.js";
console.log(mod);

//動態(tài)加載
import('./module.js').then(function(module){
  console.log(module);
})

//默認成員導(dǎo)出方法1
import { name ,age,default as title } from "./module.js";
//默認成員導(dǎo)出方法2
import title 晾咪,{ name ,age} from "./module.js";

ES Modules 導(dǎo)出導(dǎo)入成員

export { foo,bar } from './module.js'

ES Modules 瀏覽器環(huán)境兼容性Polyfill

https://unpkg.com/browse/browser-es-module-loader@0.4.1/dist/
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>jkljlk</div>
    <!-- Promise Polyfill 針對IE 2  只適合測試階段使用-->
    <script nomodule src="https://unpkg.com/browse/promise-polyfill@8.2.0/dist/polyfill.min.js"></script>
    <!-- ES Module Loader 針對低版本 1  只適合測試階段使用-->
    <script nomodule src="https://unpkg.com/browse/browser-es-module-loader@0.4.1/dist/babel-browser-build.js"></script>
    <script nomodule src="https://unpkg.com/browse/browser-es-module-loader@0.4.1/dist/browser-es-module-loader.js"></script>

    <script type="module">
        import { name1 } from '/02-export/module.js'
        console.log(name1);
    </script>
</body>

</html>

ES Modules in Node.js 支持情況

node --experimental-modules index.mjs   運行mjs

yarn add lodash  安裝lodash
import { foo, bar } from "./module.mjs";

console.log(foo, bar);

import fs from "fs";
fs.writeFileSync("./foo.txt", "es module working");

// 內(nèi)置模塊兼容了ESM的提取成員方式
import {writeFileSync} from "fs";
fs.writeFileSync("./bar.txt", "es module working");

// import _ from 'lodash'
// console.log(_.camelCase('ES odule'));

// 不支持收擦,因為第三方模塊都是導(dǎo)出默認成員
// import { camelCase } from "lodash";
// console.log(camelCase("ES odule"));

ES Modules in Node.js 與 CommonJS交互

  • ES Modules 中可以導(dǎo)入CommonJS 模塊
  • CommonJS 中不能導(dǎo)入ESModules模塊
  • COmmonJS 始終只會導(dǎo)出一個默認成員
  • import 不是解構(gòu)導(dǎo)出對象

ES Modules in Node.js 與 CommonJS差異

//cjs.js

// 加載模塊函數(shù)
console.log(require);

// 加載模塊對象
console.log(module);

// 導(dǎo)出對象別名
console.log(exports);

// 當前文件的絕對路徑
console.log(__filename);

// 當前文件所在目錄
console.log(__dirname);
//ems.mjs

// ESM 中沒有CommonJS 中的那些模塊全局成員了

import { fileURLToPath } from "url";
import { dirname } from "path";
const __filename = fileURLToPath(import.meta.url);
console.log(__filename+'1111111');
const __dirname = dirname(__filename);
console.log(__dirname+'22222');

ES Modules in Node.js 新版本進一步支持

新建package.json 添加type字段
{"type":"modules"} 就不需要將js修改為mjs
如果需要使用commonJS模塊,則需要將common.js 的文件擴展名修改為.cjs 再次執(zhí)行

ES Modules in Node.js - Babel 兼容方案

yarn add @babel/node @babel/core @babel/preset-env --dev
image.png

image.png
yarn babel-node index.js --presets=@babel/preset-env

新建 .babelrc 文件
{
“presets”:["@babel/preset-env"]
}

yarn babel-node index.js
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谍倦,一起剝皮案震驚了整個濱河市塞赂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昼蛀,老刑警劉巖宴猾,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叼旋,居然都是意外死亡仇哆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門夫植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讹剔,“玉大人,你說我怎么就攤上這事偷崩”倏剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵阐斜,是天一觀的道長衫冻。 經(jīng)常有香客問我,道長谒出,這世上最難降的妖魔是什么隅俘? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任邻奠,我火速辦了婚禮,結(jié)果婚禮上为居,老公的妹妹穿的比我還像新娘碌宴。我一直安慰自己,他們只是感情好蒙畴,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布贰镣。 她就那樣靜靜地躺著,像睡著了一般膳凝。 火紅的嫁衣襯著肌膚如雪碑隆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蹬音,我揣著相機與錄音上煤,去河邊找鬼。 笑死著淆,一個胖子當著我的面吹牛劫狠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播永部,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼独泞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扬舒?” 一聲冷哼從身側(cè)響起阐肤,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讲坎,沒想到半個月后孕惜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡晨炕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年衫画,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓮栗。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡削罩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出费奸,到底是詐尸還是另有隱情弥激,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布愿阐,位于F島的核電站微服,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缨历。R本人自食惡果不足惜以蕴,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一糙麦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丛肮,春花似錦赡磅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伴鳖,卻和暖如春节值,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榜聂。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗓蘑,地道東北人须肆。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像桩皿,于是被迫代替她去往敵國和親豌汇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 模塊化開發(fā)是當下最重要的前端開發(fā)范式之一 模塊化演變過程 Stage1 文件劃分方式具體的做法就是每個功能及其相關(guān)...
    amanohina閱讀 1,108評論 1 9
  • 模塊化開發(fā)是一種思想泄隔,隨著前端項目的日益龐大拒贱。為了使我們開發(fā)協(xié)作更加高效,互不影響佛嬉。將編寫的代碼模塊化逻澳,更利于協(xié)作...
    lowpoint閱讀 690評論 0 2
  • 模塊化開發(fā) 當下最重要的前段開發(fā)范式,“模塊化”是一種思想 模塊化演變過程 早期在沒有工具和規(guī)范的情況下暖呕,對模塊化...
    油菜又矮吹閱讀 588評論 0 0
  • 一斜做、模塊化開發(fā) common.js規(guī)范 一個文件就是一個模塊 每個模塊都有單獨的作用域 通過module.expo...
    我是一只小毛毛閱讀 1,118評論 0 0
  • 歷史 模塊化 只是一個思想或者是一個理論,并不包含具體的實現(xiàn) 內(nèi)容概述 模塊化演變過程 模塊化規(guī)范 常用的模塊化打...
    紅塵灬客棧閱讀 330評論 0 0