繁体   English   中英

AngularJS + TypeScript + ES6模块:如何捆绑浏览器?

[英]AngularJS + TypeScript + ES6 modules: how to bundle for browser?

我正在使用Angular,TypeScript和ES6模块语法。 我们假设我有一个模块定义如下:

// SubModule.ts
import MyService from 'services/MyService';

export default angular.module('subModule', [])
    .service('myService', MyService);

编译的JavaScript将是:

var MyService_1 = require('services/MyService');
exports.default = angular.module('subModule', [])
    .service('myService', MyService_1.default);

我的应用依赖于该模块。 所以我在App.ts文件中有以下内容:

// App.ts
import SubModule from 'modules/SubModule';

angular.module('app', [SubModule.name]);

使用以下编译的JavaScript:

var SubModule_1 = require('modules/SubModule');
angular.module('app', [SubModule_1.default.name]);

所以,现在我正在尝试将其捆绑到浏览器中。 我目前正在尝试使用Browserify,但我愿意使用任何可用的捆绑工具。 Browserify给我一个错误,例如:

找不到'C:\\ the \\ path \\到\\ my \\ app'模块'modules / SubModule'

那么我如何让Browserify工作呢? 或者还有其他工具可以更好地工作吗? 我在Github上发现了这个问题,似乎说TypeScript的默认导出不能与CommonJS互操作 那我该怎么办?


编辑所以我想我已经找到了问题。 Browserify要求本地路径以./开头。 因此,例如,我需要引用我的子模块,如下所示:

import SubModule from './modules/SubModule';

有没有人知道Browserify插件会自动查找相对路径,即使我没有指定./ 我的应用程序相当大,我不想通过修改所有import语句。

或者,另一方面,是否有一个TypeScript编译器选项为'modules/SubModule'发出'./modules/SubModule' 'modules/SubModule'

您可以使用JSPM / Systemjs异步加载模块,如:

System.import('./packageName/ModuleName')

和systemjs-builder使用命令行工具创建包(jspm-cli)

jspm bundle ./packageName/ModuleName dist/app.js

或使用gulp任务:

var Builder = require('jspm').Builder;
var builder = new Builder();
builder.loadConfig('jspm.conf.js')
    .then(function() {
        var buildConfig = {
            sfxFormat: 'amd',
            minify: true,
            sourceMaps: true
        };
        return builder.buildSFX('./packageName/ModuleName', outFile, buildConfig);
    });

在这里你可以看到完整的工作示例: https//github.com/b091/ts-skeleton

如果您不指定它,browserify将查看NPM包(来自node_modules forlder)。 如果你想说“这是我的一个文件,而不是一个模块”,则需要./

注意:

对于大项目的问题,我会做一个简单的BASH脚本,如下所示:

files=`find . -type f`
from="from 'modules/"
to="from './modules/"

for file in $files
do 
    sed -i 's/$from/$to/g' $file
done

IMO,Browserify的重点是“ify”服务器上的NodeJS / CommonJS模块化结构,直到浏览器/客户端。 如果您这样想,那么您不希望更改import / require语句的行为,保留“./”,因此您应保持对称性,因为它应该与NodeJS中的common require语法内联。 我认为这只是很好的编码实践。

我为这个目的创建了一个gulp适配器。 它使用tscript.json打字稿项目文件中的扩展,从Typescript ES6模块语法构建模块包。 然后,gulp构建将所有组件放在一个组合的javascript包中。 我最近移植了Typescript-Angular todoMVC应用程序以使用typescript ES6语法,该语法是使用TsProject编译和构建的。 它在TsProject TodoMVC github网站上完整记录。 请查看它是否符合您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM