我有一个在 Node.js 和浏览器中使用的内部库。它有许多文件,与 Grunt 任务和不同的序言连接在一起,一个用于浏览器,一个用于 Node:
browser:
// dependent 3rd-party libs like Mustache are already global
window.myLib = { /*just a namespace object filled with stuff later*/ }
// then comes the plain javascript which just adds elements to myLib.
// This part is identical to that used in Node
// example:
myLib.renderPartDetail = function (...) {...};
Node:
var Mustache = require('mustache');
var myLib = {};
module.exports = myLib;
// then comes the plain javascript which just adds elements to myLib.
// This part is identical to that used in Browser
这会产生 2 个不同的单输出 js 文件,一个用于浏览器,一个用于 Node。
我想要什么
- 使用 TypeScript
- 如果可能,浏览器和节点仅使用一种 CommonJS 语法(或 ES6 模块)
- 投资于未来几个月内不会消亡的事物
- 更加模块化(也许有人只需要库的一部分)
是什么让我困惑
我在 TypeScript 中发现了两种不同类型的模块处理:
import {a, b} from './x'
and
import c = require('./y')
我习惯了 Node 中的后者,但第一个看起来像 ES6(可能是未来)。
目前我使用tsc --module commonjs
但这只是输出格式,对吗?还有--module system
但我找不到此选项的文档,当我使用它时,编译器会抱怨export = ...
不允许。
还没玩过browserify
, tsify
, watchify
, jspm
, 系统JS,webpack
- 它太相似了,太多了,但我认为其中一个或几个工具可以为我完成工作。
当我require(<a node module living in node_modules>)
,tsc 找不到模块:“TS2307:找不到外部模块‘时刻’”。
具体问题
- 我应该在代码中使用哪种模块语法才能最好地与 Node 和浏览器配合使用?
- 哪个工具链可以解决我的需求?是否有示例项目或样板可供我复制? (我也对 Gulp 持开放态度,不必使用 Grunt)。
- 目前支持哪些 TypeScript 和 Node 版本?我将 1.4 嵌入到 IntelliJ 中,当将 1.6.2 引用为外部时,我收到非常深刻的神秘错误消息,例如“TypeError:host.fileExists 不是函数”(没有找到任何对此有帮助的信息)。也许使用 Node v4.1.1 不是最佳选择?
很抱歉这篇文章如此复杂。如果有必要,请给我建议从哪里开始,或者什么是最重要的改变或开始。