惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
博客园_首页
美团技术团队
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
J
Java Code Geeks
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
G
Google Developers Blog
爱范儿
爱范儿
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) 如何提升你的程式可讀性之實務技巧(一) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 如何在區域網路用 Docker 架設有 SSL 的 Gitlab 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能
JavaScript 中 require, import 的差別及效能
Nic Lin · 2019-10-03 · via Nic Lin's Blog

簡單說差別:import 是編譯中執行,CommonJS 的 require 是同步加載

import 無論在 node 或是瀏覽器都不能直接使用,透過 Babel 轉譯後還是使用 CommonJS 加載,所以兩者其實透過轉譯後是一樣的,只是遵循的規範及出現的時間點不同而已。

在效能上基本上沒區別,因為轉譯過後還是一樣的東西。

require / exports 出生在野生規範,也就是 JavaScript 社群開發者自己草擬的規則,得到了大家的廣泛應用。

現在大家比較常接觸的 import / export 則是所謂的名門正派,跟隨著新的 ECMAScript 版本,也就是大家常聽到的 ES5 / ES6 。

在 JavaScript 引擎還不支援 ES6 的情況下,只能用 webpacker + babel 轉譯,這時候 require / exports 依舊是必須使用的,因為 babel 最後將轉成瀏覽器能懂得 CommonJS,所以也就是如果你寫了 import 最後還是會被轉成 require 的。

不過以 require / exports 來說,只有簡單的寫法

const component = require('component')
exports.component = component
module.exports = component

而 import/export 的寫法就很多樣了

import fs from 'fs'
import { default as fs } from 'fs'
import * as fs from 'fs'
import { readFile} from 'fs'
import { readFile as read } from 'fs'
import fs, { readFile } from 'fs'

export default fs
export const fs
export function readFile
export { readFile, read }
export * from 'fs'

import 屬於靜態編譯,所以沒辦法動態加載,但 require 就可以了

const url = "a" + "b"

import url // => 噴錯
require(url) //=> OK

雖然在 node 9 以上版本就可以使用 ES6 了,但是還是需要設定一些東西,避免麻煩,大家多半還是用 webpacker + babel 解決。

小結

  • 基本上現在能用 ES6 寫 import 就用吧。
  • 有用 webpacker / babel 的話,不用在意 import 與 require 的效能,因為最後都會轉為 CommonJS
  • 需要動態加載時才使用 require

參考資源