TypeScript AMD编译和“桶”模块

时间:2017-05-01 10:49:11

标签: node.js typescript amd intern

我正在尝试使用Intern设置Node.js + TypeScript项目进行测试。当我使用“commonjs”(我为正常构建做)编译项目时,一切正常;编译“amd”时,TypeScript同样很高兴,这是Intern所要求的。但是,当使用intern-client传递测试时,它会抱怨一些事情:

首先,从“index.ts”文件(所谓的“桶”模块)导入不起作用。我的设置是这样的(同一目录中的所有内容):

// index.ts
export { x } from './x'

// x.ts
export function x() {}

// x.test.ts
import { x } from '.' // "Error: Failed to load module ..."

实际上,生成的JavaScript代码(对于x.test.ts)看起来像这样:

define(["require", "exports", "."], function (...) { ... })

而且我不确定AMD知道如何处理"."

第二个问题发生在相同的情况下(TypeScript编译愉快,但intern-client抱怨)。总之,我在执行时遇到错误:

import jsdom = require('jsdom')

我需要转换为:

const jsdom = require('jsdom')

让实习生能够处理它。

以下是我用来编译测试的tsconfig.json文件:

{
    "compilerOptions": {
        "target": "es6",
        "module": "amd",
        "moduleResolution": "node",
        "sourceMap": true,
        "rootDir": "src",
        "outDir": "build/tests",
        "noImplicitAny": true,
        "suppressImplicitAnyIndexErrors": true
    }
}

这是我的intern.js配置文件,如果它有帮助:

define({
    suites: ['build/tests/**/*.test.js'],
    excludeInstrumentation: true,
    filterErrorStack: true
})

修改(2017-05-03)

为帮助理解该问题,以下是项目目录树的摘录:

build
    tests // The compiled tests will end up here
src
    core
    utils
        x.ts
        x.test.ts
        // Other files, each containing a function that I would like to unit-test...
intern.js
package.json
tsconfig.json
...

1 个答案:

答案 0 :(得分:0)

关于第一个问题,AMD正在处理类似于'。'的导入。与Node不同。虽然他们都会映射出来。'对于包,Node使用默认模块名index.js,而AMD使用main.js。为了在AMD加载器中工作,您需要首先为'。'定义一个包,然后告诉AMD加载器该包使用什么默认模块。根据您的项目布局,您可以像这样配置Intern:

loaderOptions: {
  map: {
    // When a module in src/ references 'src/utils', redirect
    // it to 'utils'
    'src': {
      'src/utils': 'utils'
    }
  },

  packages: [
    // Define a package 'utils' with files in 'src/utils' that defaults
    // to the module index.js
    { name: 'utils', location: 'src/utils', main: 'index.js' }
  ]
}

关于第二个问题,目前还不清楚问题究竟是什么。 ImportScript语句将被TypeScript转换为define依赖项,因此Intern永远不会看到它们。