Hapi.js: "Class extends value undefined is not a constructor or null"
Hapi.js: "Class extends value undefined is not a constructor or null"
我想用 Hapi.js 在 Typescript 中写一个 API 和 webpack 转译和捆绑整个应用程序。
不幸的是,当我创建最简单的 Hapi 服务器(甚至创建一个服务器实例)时,出现以下错误:
exports = module.exports = internals.Response = class extends Http.ServerResponse {
^
TypeError: Class extends value undefined is not a constructor or null
```
我的Hapi版本是^17.5.4,打字是^17.0.19,应该都是最新的版本了。
index.ts
import {Server, ServerOptions} from 'hapi';
const options: ServerOptions = {
host: 'localhost',
port: '9000'
}
const server = new Server(options); // instsantiating the server causes the error
webpack.config.ts
const path = require('path');
module.exports = {
entry: './app/index.ts',
mode: 'development',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.bundle.js',
},
resolve: {
extensions: ['.ts', '.js'],
modules: [
"node_modules",
path.resolve(__dirname, "app")
],
},
module: {
rules: [
{ test: /\.ts$/, loader: 'ts-loader' }
]
},
devtool: 'inline-source-map',
node: {
fs: 'empty',
net: 'empty'
}
};
tsconfig.json
{
"compilerOptions": {
"module": "esnext",
"target": "es5",
"noImplicitAny": true,
"removeComments": true,
"sourceMap": true,
"watch": true,
"forceConsistentCasingInFileNames": true,
"noImplicitThis": true,
"lib": ["ES2015", "dom"],
"moduleResolution": "node"
},
"compileOnSave": true,
"include": [
"*/src/**/*.ts",
"*/src/**/*.tsx",
"*/tests/**/*.ts",
"*/index.ts",
"tsd.d.ts"
]
}
感谢任何帮助!
Hapi.js 间接引用了 Node 的内置 http
模块,默认情况下,Webpack 将对 Node 内置模块的引用重定向到其浏览器兼容的替换模块,这可能不会提供 Node 内置模块的所有功能。在这种情况下,http
的替换没有 ServerResponse
导出,因此您会收到 运行 时间错误。 (不幸的是,这在构建时没有被捕获,我认为是因为 ts-loader
不够聪明,无法将 TypeScript 重定向到浏览器兼容模块的类型。)
假设您打算 运行 您的 bundle 在 Node 上,您需要将 target: 'node'
添加到 Webpack 配置中以告诉 Webpack 允许生成的 bundle 使用 Node 内置模块而无需重定向。参见 the documentation。
我想用 Hapi.js 在 Typescript 中写一个 API 和 webpack 转译和捆绑整个应用程序。
不幸的是,当我创建最简单的 Hapi 服务器(甚至创建一个服务器实例)时,出现以下错误:
exports = module.exports = internals.Response = class extends Http.ServerResponse {
^
TypeError: Class extends value undefined is not a constructor or null
```
我的Hapi版本是^17.5.4,打字是^17.0.19,应该都是最新的版本了。
index.ts
import {Server, ServerOptions} from 'hapi';
const options: ServerOptions = {
host: 'localhost',
port: '9000'
}
const server = new Server(options); // instsantiating the server causes the error
webpack.config.ts
const path = require('path');
module.exports = {
entry: './app/index.ts',
mode: 'development',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'app.bundle.js',
},
resolve: {
extensions: ['.ts', '.js'],
modules: [
"node_modules",
path.resolve(__dirname, "app")
],
},
module: {
rules: [
{ test: /\.ts$/, loader: 'ts-loader' }
]
},
devtool: 'inline-source-map',
node: {
fs: 'empty',
net: 'empty'
}
};
tsconfig.json
{
"compilerOptions": {
"module": "esnext",
"target": "es5",
"noImplicitAny": true,
"removeComments": true,
"sourceMap": true,
"watch": true,
"forceConsistentCasingInFileNames": true,
"noImplicitThis": true,
"lib": ["ES2015", "dom"],
"moduleResolution": "node"
},
"compileOnSave": true,
"include": [
"*/src/**/*.ts",
"*/src/**/*.tsx",
"*/tests/**/*.ts",
"*/index.ts",
"tsd.d.ts"
]
}
感谢任何帮助!
Hapi.js 间接引用了 Node 的内置 http
模块,默认情况下,Webpack 将对 Node 内置模块的引用重定向到其浏览器兼容的替换模块,这可能不会提供 Node 内置模块的所有功能。在这种情况下,http
的替换没有 ServerResponse
导出,因此您会收到 运行 时间错误。 (不幸的是,这在构建时没有被捕获,我认为是因为 ts-loader
不够聪明,无法将 TypeScript 重定向到浏览器兼容模块的类型。)
假设您打算 运行 您的 bundle 在 Node 上,您需要将 target: 'node'
添加到 Webpack 配置中以告诉 Webpack 允许生成的 bundle 使用 Node 内置模块而无需重定向。参见 the documentation。