blog icon indicating copy to clipboard operation
blog copied to clipboard

TypeScript、Rollup 与 ts-node

Open lmk123 opened this issue 8 years ago • 0 comments

最近迷上了 TypeScript,于是用它重写了 Selection-Translator/translation.js 算是练手。

开发时,我使用了 Rollup + rollup-plugin-typescript2 插件打包模块。

因为 Rollup 是基于 ES2015 的模块语法打包模块的,所以 tsconfig.json 里的 module 会被插件强制设置为 es2015。translation.js 引用了一个 CommonJS 模块 blueimp-md5,当 module 被设置为 es2015 的时候,我没法用 import md5 = require('blueimp-md5') 的方式引用 CommonJS,TypeScript 告诉我只能从 import n from 'mod'import { n } from 'mod'import * as n from 'mod'这几种方式中选择一个——但是,我挨个尝试后,发现都不行,因为 blueimp-md5 has no default export.

然后我尝试直接使用 CommonJS 的语法 const md5 = require('blueimp-md5'),打包时是没有问题了,但实际上 rollup 并没有解析这个模块,这条语句直接就输出在最终打包后的文件里了,如果我要在浏览器里用肯定是不行的。

最后,我在 tsconfig.json 里设置了 "allowSyntheticDefaultImports": true,然后使用了 import md5 from 'blueimp-md5',这样总算是没问题了。

可是接下来问题又来了——

在使用 ts-node 跑测试的时候,因为是在 Node.js 环境里运行,所以 module 需要设置成 commonjs,但是此时是没法用 import md5 from 'blueimp-md5' 这种语法的,只能用 TypeScript 专用的语法 import md5 = require('blueimp-md5') 😂

我尝试了各种方式,都没法让其中一种引用 CommonJS 模块的语法既能用在 es2015、也能用在 commonjs,最后只能用一种奇怪的方式解决问题——在跑测试前用代码将 import md5 from 'blueimp-md5' 改成 import md5 = require('blueimp-md5'),测试跑完后再改回来 😂 😂

lmk123 avatar Sep 21 '17 03:09 lmk123