iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >从JavaScript到TypeScript的模块化和构建是怎样的
  • 340
分享到

从JavaScript到TypeScript的模块化和构建是怎样的

2024-04-02 19:04:59 340人浏览 独家记忆
摘要

今天就跟大家聊聊有关从javascript到typescript的模块化和构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。TypeScri

今天就跟大家聊聊有关从javascripttypescript的模块化和构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

TypeScript 带来的好处就是静态类型检查,所以在从 JavaScript 转向 TypeScript  之前,一定要认识到添加类型定义会带来额外的工作量,这是必要的代价。不过,相对于静态类型检查带来的好处,这些代价是值得的。当然,TypeScript  允许不定义类型或者将所有类型定义为 any,但如果这样做,TypeScript 带来的大部分静态检查功能都会失去作用,换言之,也就没必要使用  TypeScript 了。

模块化

在转换之前还要注意的一个问题就是模块化。早期的 JavaScript 代码基本上是每个 html 页面对应一个或几个 JavaScript 脚本,那时候的  JavaScript 代码中很少有模块化的概念。不过随着 WEB 2.0 的兴起,大量的工作从后端移到前端,JavaScript  程序变得越来越复杂,模块化成为刚需,大量的模块化框架随之而来,其中比较有名的有 Requestjs 及其带来的 AMD 标准,还有 SeaJS 带来的 CMD  标准。而随着 node.js 的兴起以及 JavaScript 的全栈化,又有了 CommonJS 标准。之后又出现了广为使用的 SystemJS。当然少不了  es6 的模块化标准,虽然到目前为止 node.js 和大部分浏览器都还不支持它。

TypeScript 本身支持两种模块化方式,一种是对 ES6 的模块的微小扩展,另一种是在 ES6 发布之前本身模仿 C#  的命名空间。大部分使用命令空间的场景都可以使用 ES6 模块化标准来代替。我们先来看一看两种模块化方式区别。

命名空间

使用命令空间写的 TS 脚本在转译成 JS 后,可以不使用任何模块加载框架,直接在页面中加载即可使用。不过很遗憾,这种方式转义出来的 JS 程序不能直接在  Node.js 中使用。因为 tsc 不为会命名空间形式的模块生成 modules.exports 对象以及 require 语句。

有一种情况例外。将所有 .ts 文件转译成一个 .js,假设叫 all.js,那么它可以通过 node all  来运行。这种情况下不需要任何模块的导入导出。

不过在浏览器环境中,严格的按照依赖顺序引入生成的 .js 文件是可行的。早期没有使用模块化的 JS  文件就可以使用“命名空间”形式的模块化写法,甚至可以将原来成百上千行的大型 JS 源文件,拆分成若干小的 TS 文件,再通过 tsc --outfile  输出单一 JS 文件来使用,这样既能实现模块化重构,又能不改变原有的 HTML(或其它动态页面文件)的代码。

还有一点需要注意的是,在指定生成单一输出文件的情况下,TypeScript 不会通过代码逻辑去检查模块间的依赖关系。默认情况下它会按文件名的字母序逐个转译  .ts 文件,除非源文件中通过 /// <reference path="..." /> 明确指定了依赖项。

ES6 模块

在 TypeScript 使用 ES6 模块语法来实现模块化的情况下,tsc 允许通过 module 参数来指定生成的 .js  会应用于何种模块化框架,默认的是 commonjs,其它比较常用的还有 amd、system 等。

显然,如果原来的 JS 程序使用了 AMD 框架,在转换成 TS 的时候,就可以使用 ES6 模块写法,并通过 tsc --module amd  来输出对应的 JS 文件,同样不需要修改原来的页面文件。

但是,如果原来的 JS 文件没有使用任何模块框架的情况下,转换为采用 ES6 模块写法的 TS  代码,在构建的时候就会麻烦一点。这种情况下即使构建成单一输出文件,仍然会需要模块化框架的支持,比如需要 AMD 的 define 和 require,或者需要  System 的 api 支持。

为了避免引入模块化框架,可以考虑以 commonjs 标准输出 JS,然后通过 webpack 来把所有生成的 JS 打包成单一文件。这里既然用到了  Webpack,构建配置就可以更灵活了,因为 Webpack 可以指定多个 entry,可以有多个输出,它会通过 import ... 转译成的  require(...) 自动检查依赖项。而且 Webpack 还可以使用 ts-loader 直接处理 .ts 文件而不需要先使用 tsc 来进行转译。如果在  TS 中用到了高版本 ECMAScript 语法,比如 async/await,还可以通过 babel-loader 来增加一层处理&hellip;&hellip;非常灵活。

但这里往往会有一个问题,生成的 .js 中所有定义都不在全局范围,那么脚本引入网页之后,如何使用其中定义的内容?这需要借助全局对象  window&mdash;&mdash;这里不需要考虑 Node.js 的全局对象 global,因为在 Node.js  下一般是采用模块化的方式引入,不需要向全局对象注入什么东西。

向 window 注入对象(或函数、值等)的方法也很简单,分两步:申明、赋值,比如:

import MyApi from "./myapi";  declare global {     interface Window {         mime: MyApi;     } }  window.mime = new MyApi();

常用的构建配置

我们早期项目中使用 TypeScript 的命名空间,不过最近几乎都重构成 ES6 模块方式了。由于会用到 async 函数,所以一般会配置  TypeScript 输出 ES2017 代码,再通过 Babel 转译成 ES5 代码,***由 Webpack 打包输出。

tsconfig.JSON

{     "compilerOptions": {         "module": "commonjs",         "target": "es2017",         "lib": [             "dom",             "es6",             "dom.iterable",             "scripthost",             "es2017"         ],         "noImplicitAny": false,         "sourceMap": false     } }

在 target 为 es5 或 es6 的时候,TypeScript 会有默认的 lib 列表,这在官方文档中有详细说明。target 定义为  es2017 是为了支持 async 函数,但这个配置没有默认 lib 列表,所以参考官方文档对 --target es6 使用的 lib 列表,补充  es2017 类型库即可。

webpack.config.js

这里使用了 Webpack2 的配置格式。

module.exports = {     entry: {         index: "./js/index"     },     output: {         filename: "[name].js"     },     devtool: "source-map",     resolve: {         extensions: [".ts"]     },     module: {         rules: [             {                 test: /\.ts$/,                 use: [                     {                         loader: "babel-loader",                         options: {                             presets: ["es2015", "stage-3"]                         }                     },                     "ts-loader"                 ],                 exclude: /node_modules/             }         ]     } };

gulp task

如果还使用 gulp,任务是这样写的

const gulp = require("gulp"); const gutil = require("gulp-util");  // 转译JavaScript gulp.task("webpack", () => {     const webpack = require("webpack-stream");     const config = require("./webpack.config.js");     return gulp.src("./js*.ts")         .pipe(webpack(config, require("webpack")))         .on("error", function(err) {             gutil.log(err);             this.emit("end");         })         .pipe(gulp.dest("../www/js")); });

这里需要注意的是 webpack-stream 默认使用的是 webpack1,而我们的配置需要 webpack2,所以为它指定第二个参数,一个特定版本的  webpack 实例 (由 require("webpack") 导入的)。

需要的 Node 模块

从上面的构建配置中不难总结出构建过程需要安装的 Node 模块,有这样一些

  • gulp

  • gulp-util

  • webpack-stream

  • webpack

  • ts-loader

  • typescript

  • babel-loader

  • babel-core

  • babel-preset-es2015

  • babel-preset-stage-3

在 Node.js 环境直接运行 .ts

在 Node.js 中可以通过 ts-node 包来直接运行 TypeScript 代码。需要做的只是在入口代码文件(当然是个 .js  代码)中添加一句

require('ts-node').reGISter({  })

或者

require('ts-node/register')

因为 Node.js 7.6 开始已经直接支持 async 函数语法,所以即使用到了这个语法,也不用担心 ts-node  在内存的转译结果不能运行。

入口文件仍然必须是 .js 文件,这是个小小的遗憾,不过对于使用 Node.js 写构建脚本的用户来说,有两个好消息:gulp 和 webpack  都直接支持 .ts 入口(或配置)文件。比如以 gulp 为例,可以定义 gulpfile.ts (注意扩展名是 .ts) 如下

import * as gulp from "gulp";  gulp.task("hello", () => {     console.log("hello gulp"); });

不过 gulp 也是通过 ts-node 模块来实现使用 TypeScript 的,而 ts-node 的功能依赖于  typescript,所以别忘了安装这两个模块。

看完上述内容,你们对从JavaScript到TypeScript的模块化和构建是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网node.js频道,感谢大家的支持。

--结束END--

本文标题: 从JavaScript到TypeScript的模块化和构建是怎样的

本文链接: https://www.lsjlt.com/news/86142.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 从JavaScript到TypeScript的模块化和构建是怎样的
    今天就跟大家聊聊有关从JavaScript到TypeScript的模块化和构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。TypeScri...
    99+
    2024-04-02
  • JavaScript 模块化解密:从零开始构建模块化代码
    简介 JavaScript 模块化是一种将代码组织成独立、可重用的模块的技术。模块化代码具有以下优势: 可读性增强:将代码组织成模块有助于理解和导航。 可维护性改进:通过将复杂代码封装在模块中,可以更容易地理解和修改。 代码重用性:模块...
    99+
    2024-02-18
    JavaScript 模块化 模块 封装 可重用性 代码组织
  • JavaScript模块化:模块化的艺术,构建高效代码
    模块的好处 模块化提供了许多好处,包括: 可重用性:模块可以轻松地在不同的应用程序或模块中重用,避免重复代码。 可维护性:模块化使代码更容易理解和维护,因为相关代码被分组在一起。 解耦:模块之间松耦合允许独立开发和测试,提高敏捷性和灵活...
    99+
    2024-04-02
  • JavaScript模块化:模块化的进化史,从混沌到井然有序
    1. 早期模块化(ES 模块之前) 在 ES 模块出现之前,开发人员采用各种非标准化的方法来实现模块化。这些方法包括: 闭包:使用立即调用的函数表达式(IIFE)来创建私有变量和函数。 命名空间:使用对象或函数来组织和封装相关代码。 模...
    99+
    2024-04-02
  • ES6 模块的实战运用:构建模块化的 JavaScript 应用
    理解 ES6 模块 ES6 模块通过 export 和 import 语法引入了模块的概念。export 语法用于将模块中的变量、函数或类对外暴露,而 import 语法用于从其他模块中引入这些暴露的内容。 创建 ES6 模块 创建一个...
    99+
    2024-03-02
    JavaScript、ES6、模块、模块化、可维护性、可重用性
  • JavaScript模块化:模块化的大师之路,从初学者到资深专家
    什么是模块化? 将庞大程序拆分为较小的、可重用的部分的过程。 模块的好处: 代码可复用、可维护性、松散耦合。 JavaScript 模块化: 使用 CommonJS、AMD、ES 模块等标准。 中级 不同模块化模式: 立即执行函数 ...
    99+
    2024-04-02
  • 从零开始用RequireJS构建模块化JavaScript应用程序
    了解RequireJS RequireJS是一个用于JavaScript模块加载的库。它允许您将JavaScript代码分成较小的模块,以便可以在应用程序的不同部分使用它们。RequireJS还具有依赖管理功能,可以确保模块在使用之前加...
    99+
    2024-02-11
    JavaScript 模块化 RequireJS 前端开发
  • JavaScript 模块化的涅槃重生:从混乱到清晰
    JavaScript 模块化已走过了漫长的道路,经历了混乱的初始阶段,但现在已经发展得更加清晰和结构化。模块化方法的不断演变为现代 JavaScript 开发带来了显着的优势和灵活性。 混乱的开端 在 JavaScript 的早期时代,模...
    99+
    2024-04-02
  • TypeScript和JavaScript深度对比是怎么样的
    TypeScript和JavaScript深度对比是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。TypeScript 和 JavaS...
    99+
    2024-04-02
  • JavaScript 模块化:代码架构的艺术
    模块化的好处 代码可重用性:模块创建可重用代码块,可跨应用程序或项目轻松导入和使用。 松散耦合:模块化代码具有松散耦合性,这意味着模块之间的依赖关系最小化,提高了应用程序的灵活性。 可测试性:独立模块便于单独测试,简化了应用程序的错误调...
    99+
    2024-04-02
  • BuildKit优化Dockerfile的构建是怎样的
    今天就跟大家聊聊有关BuildKit优化Dockerfile的构建是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Docker通过读取Dockerfile中的指令自动构建镜像,...
    99+
    2023-06-15
  • JavaScript引入模块的历史简介是怎样的
    JavaScript引入模块的历史简介是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着我们的应用越来越大,我们想要将...
    99+
    2024-04-02
  • Vuex 模块化教程:一步步构建可重用的模块
    ...
    99+
    2024-04-02
  • JavaScript模块化的作用是什么
    JavaScript模块化的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好...
    99+
    2023-06-14
  • ASP.NET的HTTP模块和处理程序的模块实现是怎样的
    本篇文章给大家分享的是有关ASP.NET的HTTP模块和处理程序的模块实现是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现一个提供安全服务的HTTP模块现在我们实现一...
    99+
    2023-06-17
  • 用Python构建区块链:从零到一的指南
    区块链是一种分布式、不可篡改的数字账本,用于记录交易和资产。随着其在金融、供应链和身份管理等领域的广泛应用,学习如何用 Python 构建区块链变得至关重要。 第 1 步:安装必要的库 构建区块链需要几个 Python 库,包括: Cr...
    99+
    2024-03-13
    Python与区块链
  • EF架构codeFirst从初始化到数据库迁移的过程是怎样的
    这篇文章给大家介绍EF架构codeFirst从初始化到数据库迁移的过程是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一些介绍CodeFirst是EntityFrameworks...
    99+
    2024-04-02
  • 使用PHP和TypeScript构建现代化的Web应用
    随着互联网的快速发展,Web应用也逐渐成为人们必不可少的工具。如今,许多人都希望构建现代化的Web应用,以在市场中保持竞争力。为了满足这一需求,许多开发人员使用PHP和TypeScript构建Web应用。PHP是一种广泛用于Web开发的开放...
    99+
    2023-05-24
    PHP TypeScript Web应用
  • javascript闭包的模块化怎么做
    本篇内容主要讲解“javascript闭包的模块化怎么做”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript闭包的模块化怎么做”吧!说明闭包的重要使用是模块化,它可以将成员变量的命...
    99+
    2023-06-20
  • Node和JavaScript中的模板引擎是怎样的
    本篇文章给大家分享的是有关Node/JavaScript中的模板引擎是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。简介我们将介绍如何用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作