Vue前端工程化-模块化

1 - 模块化概述

传统开发模式的主要问题:① 命名冲突,② 文件依赖

通过模块化解决上述问题:

  • 模块化就是把单独的一个功能封装到一个模块(文件)中,模块之间相互隔离,但是可以通过特定的接口公开内部成员,也可以依赖别的模块
  • 模块化开发的好处:方便代码的重用,从而提升开发效率,并且方便后期的维护

2 - 大一统的模块化规范 - ES6模块化

1. ES6模块化

ES6模块化出现之前,浏览器端和服务器端的模块化是不同的,如下:

  1. 浏览器端的模块化
① AMD(Asynchronous Module Definition,异步模块定义)
代表产品为:Require.js
② CMD(Common Module Definition,通用模块定义)
代表产品为:Sea.js
  1. 服务器端的模块化
服务器端的模块化规范是使用CommonJS规范:
① 使用require引入其他模块或者包
② 使用exports或者module.exports导出模块成员
③ 一个文件就是一个模块,都拥有独立的作用域

在ES6模块化规范诞生之前,Javascript社区已经尝试并提出了 AMD、CMD、CommonJS 等模块化规范,但是,这些社区提出的模块化标准,还是存在一定的差异性与局限性,并不是浏览器与服务器通用的模块化标准,例如:AMD 和 CMD 适用于浏览器端的 Javascript 模块化,CommonJS 适用于服务器端的 Javascript 模块化。

因此,ES6 语法规范中,在语言层面上定义了 ES6 模块化规范,是浏览器端与服务器端通用的模块化开发规范。

ES6模块化规范中定义:

  • 每个 js 文件都是一个独立的模块
  • 导入模块成员使用 import 关键字
  • 暴露模块成员使用 export 关键字

2. Node.js 中通过 babel 体验 ES6 模块化

Node.js中默认支持CommonJS模块化规范,但是对于 ES6模块化支持的并不是很好,所以通常需要借助babel这个第三方插件,才能在Node中体验高级的ES6特性。

babel是一个语法转换工具可以把高级的有兼容性的js代码转换成低级的没有兼容性的js代码。

步骤:

  1. cd到项目目录,使用npm init -y创建package.json文件
  2. 安装babel的依赖包:npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node,安装完之后会创建node_modules文件夹和package-lock.json文件
  3. 安装polyfill插件:npm install --save @babel/polyfill
  4. 项目根目录创建文件 babel.config.js文件,文件内容如下
  5. 创建index.js文件,文件写一行输出代码:console.log("ok")
  6. 通过 npx babel-node index.js 执行代码(npx在高版本的npm中默认提供了,可以直接通过npx运行某些cli命令,这里就是通过npx运行babel-node命令,运行的文件是index.js)
  7. 发现终端打印:ok,说明babel配置的没问题

给index.js运行babel-node命令,babel运行之前会先读取babel.config.js 文件内容,再做代码转换。

// 语法转换的数组,里面是语法转换时可能用到的语法转换插件
const presets = [ 
  ["@babel/env", { 
    targets: {  // 转换完毕的代码最低要支持如下浏览器
      edge: "17", 
      firefox: "60", 
      chrome: "67", 
      safari: "11.1" 
    } 
  }] 
]; 
module.exports = { presets };  // 向外暴露出去,供babel使用

babel配置完成之后我们就可以在这个node项目下学习ES6模块化的一些高级特性,比如ES6的模块化导入。

3 - ES6 模块化的基本语法

1. 默认导出 与 默认导入

创建m1.js文件,代码如下:

// 定义私有成员 a 和 c
let a = 10
let c = 20
// 外界访问不到变量d,因为它没有被暴露出去
let d = 30
function show() {}

// 默认导出:将本模块中的私有成员暴露出去,供其他模块使用
export default {
  a,
  c,
show }

在index.js文件导入,代码如下:

// 默认导入:导入模块成员
import m1 from './m1.js'

console.log(m1) // { a: 10, c: 20, show: [Function: show] }

执行:npx babel-node index.js命令,打印输出的结果为:{ a: 10, c: 20, show: [Function: show] }

  1. 每个模块中,只允许使用唯一的一次 export default,否则会报错!如果在一个模块中没有向外暴露成员,其他模块引入该模块时将会得到一个空对象。
  2. 默认导出和默认导入都是对象,不能是其他东西,默认导出和默认导入最常用。

2. 按需导出 与 按需导入

m1.js文件代码如下:

// 向外按需导出变量 s1 
export let s1 = 'aaa' 
// 向外按需导出变量 s2 
export let s2 = 'ccc' 
// 向外按需导出方法 say 
export function say = function() {}

在index.js中按需导入:

// 导入模块成员
import { s1, s2 as ss2, say } from './m1.js'   // 把s2起了个别名ss2

console.log(s1) // 打印输出 aaa 
console.log(ss2) // 打印输出 ccc 
console.log(say) // 打印输出 [Function: say]

执行:npx babel-node index.js命令,打印输出的结果如上。

注意

  1. 每个模块中,可以多次使用按需导出,只能使用一次默认导出。
  2. 默认导出/导入是对象,按需导出/导入是成员。
  3. 默认导出和按需导出可以同时使用,如果同时使用,则需要按如下格式导入,其中m1中是默认导出的成员。
import m1, { s1, s2 as ss2, say } from './m1.js'

3. 直接导入并执行模块代码

有时候,我们只想单纯执行某个模块中的代码,并不需要得到模块中向外暴露的成员,此时,可以直接导入并执行模块代码。

m2.js文件代码如下:

// 在当前模块中执行一个 for 循环操作
for(let i = 0; i < 3; i++) { 
  console.log(i) 
}

在index.js中导入:

// 直接导入并执行模块代码 
import './m2.js'

终端执行如下命令:

npx babel-node ./index.js
// 打印:0 1 2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容