【发布时间】:2015-12-26 19:09:46
【问题描述】:
我有一个用于 Node.js 和浏览器的内部库。它有很多文件,连接着一个 Grunt 任务和不同的序言,一个用于浏览器,一个用于 Node:
浏览器:
// 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 (...) {...};
节点:
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 中发现了 2 种不同类型的模块处理:
import {a, b} from './x'
和
import c = require('./y')
我习惯了后者来自 node,但第一个看起来像 ES6(可能是未来)。
目前我使用tsc --module commonjs,但这只是输出格式,对吧?还有--module system,但我找不到这个选项的文档,当我使用它时,编译器抱怨export = ... is not allowed。
还没有玩过browserify、tsify、watchify、jspm、SystemJS、webpack - 它太相似了,太多了,但我认为其中一个或几个工具可以为我做这项工作。
当我require(<a node module living in node_modules>) 时,tsc 找不到模块:“TS2307:找不到外部模块'moment'”。
具体问题
- 我应该在我的代码中使用哪种模块语法来最好地使用 Node 和 Browser?
- 哪个工具链可以解决我的需求?是否有可以从中复制的示例项目或样板文件? (我也对 Gulp 持开放态度,不必使用 Grunt)。
- 目前支持哪些 TypeScript 和 Node 版本?我在 IntelliJ 中嵌入了 1.4,当将 1.6.2 作为外部引用时,我收到了非常深奥的错误消息,例如“TypeError:host.fileExists 不是函数”(没有发现任何有用的信息)。也许使用 Node v4.1.1 不是最佳选择?
很抱歉这篇文章如此复杂。如有必要,请告诉我从哪里开始,或者最重要的事情是改变或开始。
【问题讨论】:
标签: javascript node.js typescript browserify webpack