在浏览器中使用 Typescript
Using Typescript in the Browser
最近我一直在为这个问题苦苦挣扎。我正在创建一个新的 Typescript 项目,我正在尝试找出使用 Typescript 连接数据库并在浏览器中显示结果的最佳方法。但是,我在浏览器中收到如下控制台错误:
Uncaught ReferenceError: exports is not defined ("export class Database")
Uncaught ReferenceError: require is not defined ("import {Database} from "./Database";")
据我所知,我收到错误是因为文件正在被转译为浏览器无法理解的 CommonJS 模块。
我的问题是:这是对问题的正确诊断吗?如果是这样,解决此类问题的最佳方法是什么?
我研究的一种方法是使用 WebPack 或 Browserify,其他人建议使用 AMD/SystemJS 或 RequireJS。我很好奇这是否可以通过 Gulp 和 Webpack 完成,但我不确定从哪里开始,或者它如何适合工作流程。
数据库Class
export class Database{
//...
}
Mongo Class
<reference path="../../../typings/browser/ambient/node/index.d.ts" />
<reference path="../../../typings/browser/ambient/mongodb/index.d.ts" />
import {IDatabase} from "../interfaces/IDatabase";
import {Database} from "./Database";
import {MongoClient} from "mongodb";
class MongoDB extends Database implements IDatabase{
//...
}
数据库接口
export interface IDatabase{
//...
}
TSConfig 选项
"target": "es6",
"module": "commonjs",
"moduleResolution": "classic",
"sourceMap": true,
这里有一些帮助您入门的资源:
- 网页包:link
- Gulp+webpack: link
- 浏览器化:link
- Systemjs: link, link
- 要求:link
- 示例 gulp 任务:
- index.html 中的示例基本 systemjs 配置:
没有 'best way' 这取决于您的应用程序的具体情况。如果您 need/can 将所有应用程序捆绑为单个 js 文件 - webpack 或 browserify。否则 - systemjs,也许 requirejs。我个人的偏好是gulp+systemjs。但正如链接 1-5 所示,它可以用任何加载程序完成。
到目前为止,浏览器无法加载 javascript 模块,需要所谓的加载器(即 webpack、requirejs、systemjs、browserify)来完成这项工作。这就是您看到指定错误的原因。为了摆脱它们 - 选择一个加载器,配置它,错误就会消失。
希望这对您入门有所帮助。
我已经解决了我的问题。我在 "index.html" 页面中直接引用了这些文件,这不是必需的。需要做的是更改引用,以便节点控制器知道文件在哪里,而不是索引页。在此之后,在编译时,导出和要求工作正常。
现在只有 tsc
命令行工具可以为您做所有事情,让您在浏览器上使用 typescript。
首先,在tsconfig.json
中将模块配置为'AMD'
{
"compilerOptions": {
"module": "amd",
"outDir": "./", //Just by default
"rootDir": "./" //Just by default
}
}
其次,准备一个非常简单的索引html。它使用入口文件 index.js 来引导整个应用程序(通过 require.js)。
<html>
<body>
<div id="me">Nothing</div>
<script data-main="./index.js" src="https://cdn.bootcss.com/require.js/2.3.6/require.min.js"></script>
</body>
</html>
然后,在 index.ts.
中写入任何内容
//import something from somewhere
const el : HTMLElement | null = document.getElementById('me');
if(el){
el.innerHTML = 'Hey I am typescript!';
}
您还可以像在常规打字稿中一样导入其他文件。
最后,运行tsc
命令编译所有文件,然后打开index.html,看看会发生什么。
最近我一直在为这个问题苦苦挣扎。我正在创建一个新的 Typescript 项目,我正在尝试找出使用 Typescript 连接数据库并在浏览器中显示结果的最佳方法。但是,我在浏览器中收到如下控制台错误:
Uncaught ReferenceError: exports is not defined ("export class Database")
Uncaught ReferenceError: require is not defined ("import {Database} from "./Database";")
据我所知,我收到错误是因为文件正在被转译为浏览器无法理解的 CommonJS 模块。
我的问题是:这是对问题的正确诊断吗?如果是这样,解决此类问题的最佳方法是什么?
我研究的一种方法是使用 WebPack 或 Browserify,其他人建议使用 AMD/SystemJS 或 RequireJS。我很好奇这是否可以通过 Gulp 和 Webpack 完成,但我不确定从哪里开始,或者它如何适合工作流程。
数据库Class
export class Database{
//...
}
Mongo Class
<reference path="../../../typings/browser/ambient/node/index.d.ts" />
<reference path="../../../typings/browser/ambient/mongodb/index.d.ts" />
import {IDatabase} from "../interfaces/IDatabase";
import {Database} from "./Database";
import {MongoClient} from "mongodb";
class MongoDB extends Database implements IDatabase{
//...
}
数据库接口
export interface IDatabase{
//...
}
TSConfig 选项
"target": "es6",
"module": "commonjs",
"moduleResolution": "classic",
"sourceMap": true,
这里有一些帮助您入门的资源:
- 网页包:link
- Gulp+webpack: link
- 浏览器化:link
- Systemjs: link, link
- 要求:link
- 示例 gulp 任务:
- index.html 中的示例基本 systemjs 配置:
没有 'best way' 这取决于您的应用程序的具体情况。如果您 need/can 将所有应用程序捆绑为单个 js 文件 - webpack 或 browserify。否则 - systemjs,也许 requirejs。我个人的偏好是gulp+systemjs。但正如链接 1-5 所示,它可以用任何加载程序完成。
到目前为止,浏览器无法加载 javascript 模块,需要所谓的加载器(即 webpack、requirejs、systemjs、browserify)来完成这项工作。这就是您看到指定错误的原因。为了摆脱它们 - 选择一个加载器,配置它,错误就会消失。
希望这对您入门有所帮助。
我已经解决了我的问题。我在 "index.html" 页面中直接引用了这些文件,这不是必需的。需要做的是更改引用,以便节点控制器知道文件在哪里,而不是索引页。在此之后,在编译时,导出和要求工作正常。
现在只有 tsc
命令行工具可以为您做所有事情,让您在浏览器上使用 typescript。
首先,在tsconfig.json
中将模块配置为'AMD'{
"compilerOptions": {
"module": "amd",
"outDir": "./", //Just by default
"rootDir": "./" //Just by default
}
}
其次,准备一个非常简单的索引html。它使用入口文件 index.js 来引导整个应用程序(通过 require.js)。
<html>
<body>
<div id="me">Nothing</div>
<script data-main="./index.js" src="https://cdn.bootcss.com/require.js/2.3.6/require.min.js"></script>
</body>
</html>
然后,在 index.ts.
中写入任何内容//import something from somewhere
const el : HTMLElement | null = document.getElementById('me');
if(el){
el.innerHTML = 'Hey I am typescript!';
}
您还可以像在常规打字稿中一样导入其他文件。