拉出我的头发寻找一个简单的解决方案,通过NPM,跨多个Browserify或Webpack捆绑包共享代码.思考,有文件"桥"这样的东西吗?
这不是因为编译时间(我知道watchify),而是希望提取出我所有供应商特定的库,vendor.js
以便保持我的app.js
文件大小并且不会使浏览器崩溃大量的源图.另外,如果需要查看已编译的js,我发现它更清晰.所以:
// vendor.js
require('react');
require('lodash');
require('other-npm-module');
require('another-npm-module');
Run Code Online (Sandbox Code Playgroud)
非常重要的是,代码从NPM加载而不是Bower,或者保存到某个"供应商"目录中,以便通过相对路径导入并通过垫片识别.除了我的实际应用程序源之外,我想通过NPM保留每个库引用.
在app.js
我保留所有源代码,并通过externals
数组,从编译中排除上面列出的供应商库:
// app.js
var React = require('react');
var _ = require('lodash');
var Component = React.createClass()
// ...
Run Code Online (Sandbox Code Playgroud)
然后index.html
,我需要两个文件
// index.html
<script src='vendor.js'></script>
<script src='app.js'></script>
Run Code Online (Sandbox Code Playgroud)
使用Browserify或Webpack,如何才能app.js
"看到"通过npm加载的模块?我知道创建一个带有外部的包,然后node_modules
通过别名引用直接文件(比方说),但我希望找到一个更自动且更少"Require.js"的解决方案.
基本上,我想知道是否可以桥接这两个,以便app.js
可以查看内部vendor.js
以解决依赖关系.这似乎是一个简单,直接的操作,但我似乎无法在这个广泛的网络上找到答案.
谢谢!
从我想要做的节点应用程序中:
var typeScript = require('typescript');
typeScript.compile('...')
Run Code Online (Sandbox Code Playgroud)
我正在寻求将编译器实现到构建系统但无法访问公共API(typescript.compile等),这是不可能的.
这是我想要做的更完整的示例,不过下面是针对LiveScript而不是TypeScript,在为Brunch.io构建系统编写的插件中使用的:
LiveScript = require 'LiveScript'
sysPath = require 'path'
module.exports = class LiveScriptCompiler
brunchPlugin: yes
type: 'javascript'
extension: 'ls'
constructor: (@config) ->
null
compile: (data, path, callback) ->
try
result = LiveScript.compile data, bare: yes
catch err
error = err
finally
callback error, result
include: [
(sysPath.join __dirname, '..', 'vendor', 'prelude-browser-0.6.0.js')
]
Run Code Online (Sandbox Code Playgroud)
好奇,如果有人找到了解决方法吗?
更新
我最终实现了我自己的解决方案,解决了上面和其他地方列出的各种问题.有关更多信息和用法,请参阅https://github.com/damassi/TypeScript-Watcher.
为了尝试将我的.ts源文件与.js输出分开,我试图在TypeScript中实现一个正式的文件监视器,似乎不存在为单个文件指定输出路径的能力.
这个流程,只是要清楚:我开始观察我的整个src
目录,进行更改,比方说,src/views/HomeView.ts
我希望节点获取文件已被更改,并将编译后的版本移动到public/js/views/HomeView.js
.
使用tsc myfile.ts --out myfile.js
它遍历所有模块,并在.ts文件所在的相同路径中编译每个模块,而不将最终文件放在正确指定的路径中.但它会创建一个空文件,我希望它最终结束.
我在想:
1)是否可以使用该--out
参数并仅编译该文件?我不希望它遍历导入并编译每个文件,而只是在编译时进行语法/错误检查(这只是次要要求,不是必需的); 和
2)编译器中是否存在阻止其正确组合/创建文件的错误?同样,--out
path指令中的最终输出为空,但确实创建了一个文件.
任何帮助,将不胜感激.
*更新*
虽然我不想关闭这个问题,因为我认为它仍然是一个问题,但我继续实施核心TypeScript编译器以实现我需要做的事情,tsc
完全绕过.有关更多信息和用法,请参阅https://github.com/damassi/TypeScript-Watcher.
为了整合一个AMD友好的TypeScript应用程序框架,我遇到了一个障碍:我似乎无法从我当前的路径下拉导入另一个目录中的模块.我可以导入上面的模块,但是下面会抛出一个错误:
TypeScript Error: The name ''../core/View'' does not exist in the current scope
这是我(非常基本的)应用程序的结构:
app/
- core/
- View.ts
- views/
- HomeView.ts
- Application.ts
Run Code Online (Sandbox Code Playgroud)
在我的Application.ts
文件中,我可以成功导入这样的模块:
import HomeView = module( 'views/HomeView' );
export class Application {
constructor() {
console.log( 'initializing Application' );
}
}
Run Code Online (Sandbox Code Playgroud)
其中,当使用--module AMD标志时,正确输出
define(["require", "exports", 'views/HomeView'], function(require, exports, __HomeView__) {
var HomeView = __HomeView__;
var Application = (function () {
function Application() {
console.log('initializing Application', HomeView);
}
return Application;
})();
exports.Application = Application;
})
Run Code Online (Sandbox Code Playgroud)
现在,问题是当我跳进 …
node.js ×3
typescript ×3
javascript ×2
tsc ×2
amd ×1
browserify ×1
module ×1
npm ×1
scope ×1
webpack ×1