【发布时间】:2016-09-02 22:16:06
【问题描述】:
我想在我的 NodeJS 应用程序中使用 TypeScript。为了做到这一点,我认为使用 SystemJS 将我的源文件即时转换为 JavaScript 会很好。我已经设法绕过了与 SystemJS 配置相关的大部分问题,除了以下问题:
如何使 SystemJS 防止处理某些导入并使其使用原始的require?
SystemJS 通过它自己的require 实现将所有内容包装在它自己的模块表示中,不尊重模块的原始类型。它使 express 这样的 NodeJS 模块成为对象而不是函数(问题出在下面的代码中)
'use strict';
console.log('In server.ts');
if ('production' === process.env.NODE_ENV)
require('newrelic');
let PORT = process.env.PORT || 3333;
import * as fs from 'fs';
import * as os from 'os';
import * as https from 'https';
import * as express from 'express'; // <------------- SystemJS makes express an object
import * as socketio from 'socket.io';
import { Routes } from './routes/index';
import { DBConfig } from './config/db.conf';
import { RoutesConfig } from './config/routes.conf';
import { SocketServer } from "./reflex/SocketServer";
const app = express(); // <------------ This is object, so no way to initialize
RoutesConfig.init(app);
DBConfig.init();
Routes.init(app, express.Router());
const opts = {
key: fs.readFileSync(__dirname + '/cert/server.key'),
cert: fs.readFileSync(__dirname + '/cert/server.crt')
};
let server = https.createServer(opts, <any>app);
let socket = socketio(server, { transports: ['websocket'] });
let socketServer = new SocketServer(100, socket);
server.listen(PORT, () => {
console.log(`Application is up and running @: ${os.hostname()} on port: ${PORT}`);
console.log(`enviroment: ${process.env.NODE_ENV}`);
});
另一个问题是,通过替换原来的 require,不仅每个模块都应该被 SystemJS 配置覆盖,而且每个子模块都应该被覆盖。
这是我的 SystemJS 配置:
SystemJS.config({
transpiler: 'typescript',
defaultJSExtensions: false,
map: {
// ------ system modules ------
"console": "@node/console",
"buffer": "@node/buffer",
"querystring": "@node/querystring",
"events": "@node/events",
"http": "@node/http",
"cluster": "@node/cluster",
"zlib": "@node/zlib",
"os": "@node/os",
"https": "@node/https",
"punycode": "@node/punycode",
"repl": "@node/repl",
"readline": "@node/readline",
"vm": "@node/vm",
"child_process": "@node/child_process",
"url": "@node/url",
"dns": "@node/dns",
"net": "@node/net",
"dgram": "@node/dgram",
"fs": "@node/fs",
"path": "@node/path",
"string_decoder": "@node/string_decoder",
"tls": "@node/tls",
"crypto": "@node/crypto",
"stream": "@node/stream",
"util": "@node/util",
"assert": "@node/assert",
"tty": "@node/tty",
"domain": "@node/domain",
"constants": "@node/constants",
// ------ common modules ------
'helmet': '@node/helmet',
'morgan': '@node/morgan',
'express': '@node/express',
'mongoose': '@node/mongoose',
'socket.io': '@node/socket.io',
'socket.io-client': '@node/socket.io-client', // <----- this module is being referenced by 'socket.io'
'body-parser': '@node/body-parser',
// ------ SystemJS configuration ------
json: './node_modules/systemjs-plugin-json/json.js'
},
meta: {
'*.json': {
loader: 'json'
}
},
paths: {
'typescript': './node_modules/typescript',
},
packages: {
'typescript': {
main: 'lib/typescript'
},
'server': {
defaultExtension: 'ts'
}
},
typescriptOptions: tsconfig
});
所以问题如下:如何让 SystemJS 忽略某些导入(通过配置)并绕过对原生 NodeJS require 实现的控制?
提前谢谢你!
【问题讨论】:
-
我不了解 SystemJS,但我使用 TypeScript 和 express 和 commonjs 在 tsconfig 中设置“moduleResolution”:“node”,我会像这样导入文件:import express =要求('快递');
标签: javascript node.js typescript systemjs