JS -- 模块化(babel转译工具)

JS & 介绍 Babel 的使用及 presets & plugins 的概念 Babel 给 ES6/7/8/9 Typescript、React / Vue3 JSX 等"语法糖"带来无限的可能。 阅读详情

概念

ES6之前,JS没有出现模块化系统。因为它在设计之初根本没有想到今天的JS应用场景

JS主要在前端的浏览器中使用,js文件下载缓存到客户端,在浏览器中执行
比如简单的表单本地验证,漂浮一个广告
服务器端使用ASP、JSP等动态网页技术,将动态生成数据嵌入一个HTML模板,里面夹杂着JS后使用 <script> 标签,返回浏览器端执行。 <script> 还可以使用src属性,发起一个GET请求返回一个js文件,嵌入到当前页面执行环境中执行

这时候的JS只是一些简单函数和语句的组合

2005年之后,随着Google大量使用了A JAX技术之后,可以异步请求服务器端数据,带来了前端交互的巨大变化
前端功能需求越来越多,代码也越来也多。随着js文件的增多,灾难性的后果产生了:

  • 众多js文件通过 <script> 引入到当前页面中,每一个js文件发起一个GET请求,众多的js文件都需要返回到浏览器端。网络开销成本颇高
  • 习惯了随便写,js脚本中各种全局变量污染,函数名冲突
  • JS脚本加载有顺序,JS文件中的代码之间的依赖关系(依赖前后顺序、相互依赖)

亟待模块化的出现

2008年V8引擎发布,2009年诞生了Nodejs,支持服务端JS编程。使用JS编程的项目规模越来越大,没有模块化是不可以的
之后社区中诞生诸多模块化解决方案

CommonJS规范(2009年),使用全局require函数导入模块,将所有对象约束在模块对象内部,使用exports导出指定的对象
最早这种规范是用在Nodejs后端的,后来又向前端开发移植,这样浏览器端开发也可以使用CommonJS了

AMD(Asynchronous Module Definition)异步模块定义,这是由社区提出的一种浏览器端模块化标准。使用异步方式加载模块,模块的加载不影响它后面语句的执行。所有依赖这个模块的语句,都需要定义在一个回调函数,回调函数中使用模块的变量和函数,等模块加载完成之后,这个回调函数才会执行,就可以安全的使用模块的资源
了。其实现就是AMD/RequireJs。AMD虽然是异步,但是会预先加载和执行。目前应用较少

CMD(Common Module Definition),使用seajs,作者是淘宝前端玉伯,兼容并包解决了RequireJs的问题
CMD推崇as lazy as possible,尽可能的懒加载

由于社区的模块化呼声很高,ES6开始提供支持模块的语法,但是浏览器目前支持还不够

ES6模块化

ES6中模块自动采用严格模式

  • import语句,导入另一个模块导出的绑定
  • export语句,从模块中导出函数、对象、值的,供其它模块import导入用

导出

建立一个模块目录src,然后在这个目录下新建一个moda.js,内容如下:

缺省导出

export default class A{
    constructor(x){
        this.x = x;
    }
    show(){
        console.log(this.x);
    }
}

导出函数

export function foo(){
    console.log('foo function');
}

导出常量

export const CONSTA = 'aaa'

导入

其它模块中导入语句如下

import {CONSTA, foo} from "./moda";
import * as mod_a from "./moda";

VS Code可以很好的语法支持了,但是运行环境,包括V8引擎,都不能很好的支持模块化语法

转译工具

转译就是从一种语言代码转换到另一个语言代码,当然也可以从高版本转译到低版本的支持语句

由于JS存在不同版本,不同浏览器兼容的问题
使用transpiler转译工具解决对语法的支持问题

babel

开发中可以使用较新的ES6语法,通过转译器转换为指定的某些版本代码

官网 http://babeljs.io/

参考文档 https://babeljs.io/docs/en/6.26.3/index.html

注意当前版本7.x已经有了较大的变化,请参看6.x文档

打开Try it out,测试一段代码

function * counter(){
	let i = 0; 
	while(true) 
		yield (++i);
}

g = counter();
console.log(g.next().value);

预设

有如下一些预设presets,我们先看看有哪些,一会儿再进行预设的安装和配置

presets:
babel-preset-env 当前环境支持的代码,新target

ES2015转码规则
$ npm install --save-dev babel-preset-es2015

react转码规则
$ npm install --save-dev babel-preset-react

ES7不同阶段语法提案的转码规则(共有4个阶段),选装一个
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3

离线转译安装配置

1、初始化npm

在项目目录中使用
$ npm init
npm 相当于 linux 的yum ;相当于python 的pip
在这里插入图片描述
在项目根目录下会生成package.json文件,内容就是上面花括号的内容
在这里插入图片描述
descriotion 描述
entry point 入口
test command 测试的命令
license 许可证

package.json 根目录
这个文件很重要
先对项目初始化,才可以使用babel

2、设置镜像

为了连接国内的服务器,当前项目创建一个配置 .npmrc文件

  • 可以放在全局配置下,所有人用
  • 可以放到用户家目录中,当前用户下所有项目使用
  • 可以放到项目根目录中,当前项目用(推荐此种做法)

参考 http://npm.taobao.org/
本次放到项目根目录中,内容如下 registry=https://registry.npm.taobao.org

`$ echo "registry=https://registry.npm.taobao.org" > .npmrc`

在这里插入图片描述
在这里插入图片描述

3、安装

项目根目录下执行
$ npm install babel-core babel-cli --save-dev

--save-dev说明

  • 当你为你的模块安装一个依赖模块时,正常情况下你得先安装他们(在模块根目录下npm install module-name),然后连同版本号手动将他们添加到模块配置文件package.json中的依赖里(dependencies)。开发用
  • --save和--save-dev可以省掉你手动修改package.json文件的步骤
  • spm install module-name --save 自动把模块和版本号添加到dependencies部分。部署运行时用
  • spm install module-name --save-dev 自动把模块和版本号添加到devdependencies部分

安装完后,在项目根目录下出现 node_modules目录 ,里面有babel相关模块及依赖的模块

-g 安装全局,非万不得,不要使用
没有加 -g 默认安装到当前项目中
在这里插入图片描述

4、配置babel和安装预设

在目录根目录下创建 .babelrc 文件,Json格式
在这里插入图片描述

{ 
	"presets": ["env"]
}

env 可以根据当前环境自动选择
安装依赖
$ npm install babel-preset-env --save-dev

5、准备目录

项目根目录下建立src和lib目录

  • src 是源码目录
  • lib 是目标目录

6、修改package.json

替换为 scripts 的部分

{
  "name": "src",
  "version": "1.0.0",
  "description": "",
  "main": "moda.js",
  "scripts": {
    "build": "babel src -d lib"
  },
  "author": "luxia",
  "license": "ISC",
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.3",
    "babel-preset-env": "^1.7.0"
  }
}

babel src -d lib 意思是从src目录中转译后的文件输出到lib目录

7、准备js文件

在src中的moda.js文件

// 缺省导出
export default class A{
    constructor(x){
        this.x = x;
    }
    show(){
        console.log(this.x)
    }
}

export function foo(){
    console.log('foo function')
}

src目录下新建index.js

import A, {foo} from "./moda";

var a = new A(100);
a.show();

foo();

直接在VS Code的环境下执行出错。估计很难有能够正常运行的环境。所以,要转译为ES5的代码。

  • 在项目根目录下执行命令
$ npm run build

在这里插入图片描述
可以在lib文件夹中看到,2个文件被转译

  • 运行文件
$ node lib/index.js

在这里插入图片描述

使用babel等转译器转译JS非常流行
开发者可以在高版本中使用新的语法特性,提高开发效率,把兼容性问题交给转译器处理

npx是包之心器命令从npm 5.2开始提供。npx可以直接执行已经安装过的包的命令,而不用配置package.json中的run-script

npx babel src -d lib

在这里插入图片描述

node lib/index.js

在这里插入图片描述

导入导出

导出代码都在src/moda.js中,导入代码都写在src/index.js中

缺省导入导出

只允许一个缺省导出,缺省导出可以是变量、函数、类,但不能使用let、var、const关键字作为默认导出

  • 缺省导入的时候,可以自己重新命名,可以不需要和缺省导出时的名称一致,但最好一致
  • 缺省导入,不需要在import后使用花括号
// 缺省导出 匿名函数
export default function(){
    console.log('default export function')
}

// 缺省导入
import defaultFunc from '/.moda'
defaultFunc();

在这里插入图片描述

// 缺省导出 命名函数
export default function xyz(){
    console.log('default export function')
}

// 缺省导入
import defaultFunc from './moda'
defaultFunc();

在这里插入图片描述

命名导入导出

  • 导出举例
// 缺省导出类
export default class {
    constructor(x) {
        this.x = x;
    }
    show() {
        console.log(this.x);
    }
}

// 命名导出 函数
export function foo() {
    console.log('regular foo()');
}

// 函数定义
function bar() {
    console.log('regular bar()');
}

// 变量常量定义
let x = 100;
var y = 200;
const z = 300;

// 导出
export { bar, x, y, z };
  • 导入举例
    as 设置别名
import defaultCls, { foo, bar, x, y, z as CONST_C } from './moda';

foo();
bar();
console.log(x); // x只读,不可修改,x++异常
console.log(y); // y只读
console.log(CONST_C);
new defaultCls(1000).show();

在这里插入图片描述

  • 也可以使用下面的形式,导入所有导出,但是会定义一个新的名词空间。使用名词空间可以避免冲突
import * as newmod from './mod';

newmod.foo();
newmod.bar();
new newmod.default(2000).show();

在这里插入图片描述

前端JavaScript代码打包实战指南 本文还有配套的精品资源,点击获取 简介:“habr-js-bundle-example”项目演示了JavaScript前端开发中的模块化、打包及优化实践。此项目可能来自俄语技术社区Habr,并着重于展示JavaScript代码包的创建、管理及性能提升。它可能包括ES6+特性、流行框架的应用,以及Webpack和Babel的配置和使用,旨在指导开发者进行代码分割、懒加载和tr... 阅读详情

相关推荐

地心地固坐标系与北天东坐标系的转换

经过这一步旋转,x3轴和y3轴就处在过O3点的经度线所在的平面了,而且z3轴指向了东。将图3的坐标系旋转成图2的样子。这里需要多次旋转,每次以某个轴为对称轴进行旋转,对应的坐标变换参考。的原点在地心,Z轴指向北极点,X轴指向本初子午线与赤道的交点,Y轴指向符合右手定则,如下图所示。下面实现地心地固坐标系到北天东坐标系的转换,问题描述为:设一点。以y1轴为对称轴,顺时针旋转90°,得到图4的样子。,X轴指向北,Y轴指向天,Z轴指向东,如下图所示。因此,北天东坐标下的坐标为。点在图3坐标系下的坐标。

csdnqixiaoxin的博客 3555

Babeljs简介与使用

ES6-babel工具简介

CamphorBlossom的博客 5679

Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)

蜡烛图指标为识别K线形态的指标,笔者认为重点在于定义方式所提供的思路,背后的投资逻辑可以借鉴但不建议直接参考文档的翻译内容和源码逻辑存在不一致的现象,笔者分别列出中文百科中的定义和源码实际逻辑,供大家参考技术分析理论中的一些模糊词,ta-lib中给出了精确的定义源码

量化就是探索生活 3254

深入学习 JavaScript 转译器 Babel ,AST还原混淆代码

babel还原混淆代码

weixin_52057903的博客 4405

[VisionPro] CogPMAlignTool 工具详解

[VisionPro] [CogPMAlignTool] [模板匹配]

weixin_43163656的博客 1万+

工业数据采集实战:用open62541库读写PLC的OPC UA节点(避坑指南)

本文详细介绍了如何使用open62541库实现工业PLC的OPC UA节点数据采集,涵盖环境搭建、节点读写优化及生产环境故障排查。通过订阅模式和多节点读写技术,显著提升数据采集效率与稳定性,适用于智能制造和工业物联网场景。

weixin_30598225的博客 399

解决JS兼容问题以及初步认识babel(JS工具链的宏观认识)

本文介绍如何摆脱脚手架,通过自行的配置解决js在不同环境下的兼容问题以及对babel有初步认识,对前端工程化有初步认识。

beforeSend的博客 2665

深入浅出横向联邦学习、纵向联邦学习、联邦迁移学习

深入浅出解析横向联邦学习(Horizontal Federated Learning)、纵向联邦学习(Vertical Federated Learning)和联邦迁移学习(Federated Transfer Learning)有多个机构(比如几家不同的银行,或者几家医院)都拥有一些数据,他们希望联合起来训练一个更强大的机器学习模型,但出于隐私保护或法规要求,他们不能直接把数据共享出来。联邦学习就是为了解决这个问题而提出的。它的核心思想是“数据不动模型动”,即数据保留在本地,参与方共同训练模型。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2460

javascript转义函数有哪些

转义函数:1、escape()函数,可将所有空格、标点、重音符号以及其他非ASCII字符用“%xx”十六进制序列码代替;2、encodeURI()函数,可把字符串作为URI进行编码;3、encodeURIComponent()函数。 js中有很多函数可以用来转义和反转义,如escape()和unescape()、encodeURI()和decodeURI()、encodeURIComponent()和decodeURIComponent()等。 1.escape()和unescape() escape()函

qf2019的博客 6291

倍福TwinCAT3 OPC UA配置全流程:从安装到无密码访问(附常见问题解决)

本文提供了倍福TwinCAT3 OPC UA配置的完整实战指南,重点讲解如何实现无密码游客访问。从软件安装、授权配置、服务器初始化到深度排错,详细解析了配置流程中的关键步骤与常见陷阱,帮助工程师高效打通PLC与上位系统的数据通讯通道。

vulkan6gpu的博客 471

LVGL8.x 实体按键与Keypad驱动的无缝对接实战

本文详细解析了LVGL8.x中实体按键与Keypad驱动的两种对接方案:坐标映射的Button方式与事件驱动的Keypad方式。重点阐述了如何模块化裁剪lv_port_indev.c模板文件,并深入讲解了Keypad驱动与Group焦点管理系统的核心协作机制,为无触摸屏的嵌入式设备提供流畅的UI交互解决方案。

weixin_29164497的博客 446

JS-模块化

文章目录模块化ES6模块化导出导入转译工具babel预设离线转译安装配置(*)导入导出缺省导入导出命名导入导出 模块化 ES6之前,JS没有出现模块化系统 JS主要在前端的浏览器中使用,js文件下载缓存到客户端,在浏览器中执行, 比如简单的表单本地验证,漂浮一个广告 服务器端使用ASP、JSP等动态网页技术,将动态生成数据嵌入一个HTML模板,里面夹杂着JS后使用script标签,返回浏览器端 ...

鑫仔之行 259

【Ranger】mac下Apache Ranger编译安装

a、编译过程中出现测试用例不通过和文件认证错误错误:带上参数-DskipTests=true -Drat.skip=true 重新编译;b、若编译过程中出现缺少jar包的情况,可能下载不了,需要手动自动添加;c、编译所需的其他工具如maven等安装配置略。采用这个会报错,因此我才用了下面一个命令。初始化设置Ranger Admin:执行。然后进入target目录。

九师兄 2103

JS模块化-三个模块化规范的区别

模块化规范 CommonJS Node.js : 服务器端 Browserify : 浏览器端 也称为js的打包工具 基本语法: 定义暴露模块 : exportsexports.xxx = value module.exports = value 引入模块 : requirevar module = require('模块名/模块相对路径') 引入模块发生在什么时候? ...

qq_42496307的博客 1360

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js模块化

ES6模块化 ES6中模块自动采用严格模式。 import语句,导入另一个模块导出的绑定。 export语句,从模块中导出函数、对象、值的,供其它模块import导入用。 转译工具 转译就是从一种语言代码转换到另一个语言代码,当然也可以从高版本转译到低版本的支持语句。 由于JS存在不同版本,不同浏览器兼容的问题, 使用transpiler转译工具解决。 babel 开发中可以使用较新的ES6语法,...

outsider_777的博客 266

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ECMAScript模块加载器ESM使用教程

`esm` 是一个简单、无依赖、无需打包的 ECMAScript 模块加载器,适用于 Node.js 环境。它允许开发者直接使用 ES 模块语法,无需通过 Babel 转译或使用其他构建工具。`esm` 符合最新的 ECMAScript 模块标准,支持动态导入、实时绑定等特点,是现代JavaScript模块化开发的便捷工具。 ## 2. 项目快速启动 ### 安装 对于新项目,可以使用以下命...

gitblog_00882的博客 962

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何将Hyro实时HTML5编辑器与现代化前端工具链集成:Webpack、ES6完整指南

Hyro是一款实时桌面HTML5编辑器,让开发者能够在编写代码的同时实时预览HTML效果。本文将详细介绍如何将这个强大的编辑器与Webpack、ES6等现代前端工具链无缝集成,提升开发效率和项目质量。 ## 📋 准备工作:Hyro项目结构概览 在开始集成前,我们先了解Hyro的项目结构,这有助于我们更好地规划工具链集成方案: - **核心代码目录**: - `js/hyro.js` -

gitblog_01177的博客 944

现代JavaScript开发

现代JavaScript开发 开发 代码的模块化,方便维护和复用。这些模块化可能是我们自己使用的模块也有可能第三方包; 第三方包有都可以从npm中下载到(包含开源包,以便我们自己的代码中包含第三方代码,比如react、jQuery,leaflet等等,也包含帮助我们构建应用程序的开发工具,例如实时服务器、Parcel、Babel、vite等等); 构建过程 通过构建工具将所有的依赖整合成一个捆绑包,也就是合并成一个文件,这个过程也可以去除或者忽略一些你没有被使用的代码,以便于浏览器加载; 这类的工具有

分享学习网络的点点滴滴 582

从零掌握 SSH:用一条命令安全访问云虚拟机(Learn to Cloud 实战指南)

> 本篇指南对应 Learn to Cloud 课程 Phase 1「Linux 与 Bash」中的 Topic 4:SSH。你将理解 SSH 协议为何成为云工程师访问虚拟机的默认方式,掌握从本地终端安全连接云上 Linux 实例的完整流程,并理解 SSH 密钥相比密码认证的优势所在。读完本篇并完成练习后,你就能独立完成「创建云虚拟机 → 生成密钥 → SSH 登录」这条云上最基础的运维链路,为后

gitblog_01200的博客 418

hql和sql转译_了解JavaScript模块:捆绑和转译

hql和sql转译p.tip { background-color: rgba(128,128,128,0.05); border-top-right-radius: 5px; border-bottom-right-radius: 5px; padding: 15px 20px; border-left: 10px solid rgba(128,128,128,0.075);...

218

关于 js:7. 模块化、构建与工具链

对比项CommonJSESMUMD加载方式同步异步(静态)自适应使用平台Node.js浏览器 + Node.js浏览器、Node、RequireJS导出方式export等不支持支持不支持缓存机制有有有是否支持动态导入是(require)是(import()否// mod.js// main.js一个模块 = 一个作用域单元export定义接口 →import引入依赖多次 import / 执行一次 / 缓存共享特性描述模块系统CommonJS。

Triste__chengxi的博客 1225

7天掌握JavaScript模块化:基于JavaScript Modularization Journey的快速学习路线

JavaScript模块化是现代前端开发的核心技能,本指南将通过JavaScript Modularization Journey项目提供的实践案例,帮助你在7天内系统掌握从基础到高级的模块化技术。无论是新手还是有经验的开发者,都能通过这个循序渐进的学习路线快速提升项目架构能力。 ## 🌟 为什么选择模块化开发? 随着JavaScript项目规模的扩大,代码组织变得越来越重要。模块化开发通过

gitblog_00286的博客 300

模块化基础概念与实践

在前端开发中,模块化意味着将JavaScript代码划分为多个自包含的单元。每个单元(即模块)都有自己的作用域,可以导出(export)特定的变量、函数或类供其他模块使用,同时也可以从其他模块导入(import)所需的依赖。这种结构使得代码更加有序,便于管理和扩展。CommonJS:主要用于服务器端的Node.js环境,通过require和module.exports或exports来实现模块化。// 导出模块// 导入模块// 输出: 25。

天涯学馆 922

FBJS构建流程完全解析:Gulp与Babel集成的最佳实践

FBJS是Meta众多JavaScript项目使用的实用工具库集合,其构建流程融合了Gulp与Babel的强大功能,为开发者提供了高效可靠的代码处理方案。本文将深入剖析FBJS的构建系统架构,帮助你掌握现代前端工程化的核心实践。 ## 📦 项目构建基础架构 FBJS采用**多包仓库**(Monorepo)结构,所有构建相关配置集中在以下关键文件: - **Gulp配置中心**:[packa

gitblog_00199的博客 790

Webpack的基础入门

目录为什么要学习Webpack什么是WebpackWebpack打包核心流程核心流程——极度简化版Get StartDependencies LookupTransformCombine Assets模块化+一致性使用Webpack使用Webpack---处理CSS使用Webpack---接入Babel(处理JS)使用Webpack---生成HTML使用Webpack---工具线使用Webpack---HMR使用Webpack---Tree-Shaking其他常用的工具 为什么要学习Webpack 理解

1900's 88 keys的博客 938

ES前端开发和JS初步学习

简单的学习了JS,对ES前端开发进行一定的了解。

飚 3052
上一篇: JS -- Promise对象
下一篇: React项目构建
鹿夏
博客等级 码龄8年 24粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值