- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我使用来自 Angular 2 docs 的 Rollup 时尝试执行汇总配置 js 文件时出现错误:
🚨 Unexpected token
node_modules/rxjs/util/isArrayLike.js (2:78)
1: "use strict";
2: var isArrayLike_1 = function (x) { return x && typeof x.length === 'number'; });
^
3: //# sourceMappingURL=isArrayLike.js.map
当我查看 rxjs
存储库中的 isArrayLike.js
文件时,我可以看到该文件包含以下代码:
exports.isArrayLike = (function (x) { return x && typeof x.length === 'number'; });
看起来在 tree shaking step rollup 中删除了一个括号 this -->(function (x)
并且 tree shaking 失败了。
如果我手动删除 rxjs/isArrayLike.js
文件中的最后一个括号,汇总工作正常。
有什么办法可以解决这个问题吗?
"rollup-plugin-commonjs": "^7.0.0"
"rxjs": "^5.2.0"
最佳答案
正如 Toby 提到的,最近的软件包更新似乎有一些重大变化。我还不确定是哪个包导致了这个问题。
下面列出的当前版本没有问题。当我更新到最新版本时,出现与您相同的错误:
"@angular/common": "2.4.7",
"@angular/compiler": "2.4.7",
"@angular/compiler-cli": "2.4.7",
"@angular/core": "2.4.7",
"@angular/forms": "2.4.7",
"@angular/http": "2.4.7",
"@angular/platform-browser": "2.4.7",
"@angular/platform-browser-dynamic": "2.4.7",
"@angular/platform-server": "2.4.7",
"rxjs": "5.1.0",
"zone.js": "0.7.6"
"gulp-typescript": "3.1.4",
"systemjs": "0.20.7",
"typescript": "2.1.6",
使用 NGC 编译源代码(es5 目标和 es6 模块)。这将在 src
文件夹中创建工厂,并在 dist
文件夹中创建元数据和 .d.ts
文件。
接下来通过在 tsconfig-aot.json 中设置以下选项来创建所需的元数据和 .d.ts 文件:
"compilerOptions": {
"target": "es5",
"module": "es6",
"moduleResolution": "node",
"declaration": true,
...
},
"angularCompilerOptions": {
"genDir": "",
"skipMetadataEmit" : false
}
使用tsc
重新编译src
文件夹;使用插件内联 HTML。我使用了 gulp-inline-ng2-template
:
gulp.task('compile:es6', function () {
return gulp.src(['./src/**/*.ts'])
.pipe(inlineNg2Template({ base: '/src' }))
.pipe(tsc({
"target": "es5",
"module": "es6",
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"lib": ["es6", "dom"]
}))
将 HTML 文件从 src
文件夹复制到 dist
文件夹。这部分是必要的,因为 NGC 是在 HTML 模板被内联之前编译的。结果,元数据仍然认为您的组件正在使用 templateURL。希望社区能提出一个好的内联 html 插件,这样就不再需要这一步了。
使用 rollup 摇动树并创建 bundle:
gulp.task('rollup:module', function() {
return rollup.rollup({
entry: pkg.main,
onwarn: function (warning) {
// Skip certain warnings
// should intercept ... but doesn't in some rollup versions
if (warning.code === 'THIS_IS_UNDEFINED') { return; }
// intercepts in some rollup versions
if ( warning.message.indexOf("The 'this' keyword is equivalent to 'undefined'") > -1 ) { return; }
if ( warning.message.indexOf("treating it as an external dependency") > -1 ) { return; }
if (warning.message.indexOf("No name was provided for external module") > -1) { return; }
// console.warn everything else
console.warn(warning.message);
}
}).then( function ( bundle ) {
bundle.write({
dest: `dist/${pkg.name}.bundle.umd.js`,
format: 'umd',
exports: 'named',
moduleName: pkg.name,
globals: {
}
});
bundle.write({
dest: `dist/${pkg.name}.bundle.cjs.js`,
format: 'cjs',
exports: 'named',
moduleName: pkg.name,
globals: {
}
});
bundle.write({
dest: `dist/${pkg.name}.bundle.amd.js`,
format: 'amd',
exports: 'named',
moduleName: pkg.name,
globals: {
}
});
});
});
.pipe(gulp.dest('./dist/src'));
});
当您发布包(即发布到 npm)时,请确保将 js、.d.ts 和 .metadata.js 文件包含在同一个 dist\src
文件夹中,并确保您的主包入口点有一个 index.js 文件。
bundle 允许您的用户使用任何动态模块加载器加载您的包;需要 js、.d.ts. 和 metadata.js 文件才能使您的包符合 AOT - 这意味着其他人可以安装您的库并创建 AOT 静态包。
希望对您有所帮助,干杯!
关于javascript - Angular 2 Rollup Tree Shaking RxJS 库中的意外标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42391887/
RxJS 中是否有一个运算符可以让我缓冲项目并在信号可观察对象触发时将它们一个一个地放出?有点像bufferWhen,但不是在每个信号上转储整个缓冲区,而是每个信号转储一定数量。它甚至可以转储信号 o
我正在像这样创建我的可观察源(每 5 秒调用一次 api): const obs$ = Observable.interval(5000).switchMap(() => makeApiCall())
我有一个 Action ,然后将触发一个ajax请求。 如果由于某种原因操作失败,我什么也不想做。我没有执行可以执行的无操作功能,而不是创建只返回先前状态的空白操作? export default f
在以下代码中:- RxJS.Observable.of(1,2).first().subscribe((x) => console.log(x);); 给定运营商 first() 是否有必要取消订阅?
我有一种情况,可以在很短的时间内将很多事件发送到流中。我想要一个运算符,它是ojit_code和debounceTime的混合体。 以下演示可用于说明我想拥有的https://stackblitz
我的用例如下:我得到事件,有时会突然发生。如果发生突发,我只需要处理一次即可。去抖动会执行此操作。 但是,去抖动仅给我提供连拍的最后一个元素,但我需要了解连拍中的所有元素才能汇总(使用平面图)。 这可
简化以下代码示例的方法是什么? 我找不到合适的运算符..有人可以举一个简短的例子吗? this.returnsObservable1(...) .subscribe( success =>
在RxJS 6中,如何导入静态合并功能以合并Observable列表? 我希望能够做到: const merged$ = merge( obs1$, obs2$, obs3$
我正在阅读 RxJS 的官方文档,然后我意识到它们都在做完全相同的事情。 对我来说,它们看起来完全相似。 如果有区别请指出。 最佳答案 我将根据它们的 Time 版本来描述它们之间的区别,因为这是我最
我对基本的 RxJS 概念有点熟悉,比如 Observables、Observers 和 Subjects,但是 RxJS Notifications概念对我来说是全新的。 它有什么用?我应该什么时候
从 rxjs 6.5 切换到 rxjs 7 后,我遇到了这个奇怪的错误。我不确定这是 rxjs 7 的类型问题还是 stackblitz ( https://stackblitz.com/edit/r
以前我只能使用此代码导入使用过的运算符: import 'rxjs/Observable'; import 'rxjs/add/operator/map'; import 'rxjs/add/oper
combineLatest 函数可以从 rxjs 和 rxjs/operators 导入。 当我从 rxjs/operators 导入它时(就像我导入 combineAll 我收到以下错误: TS23
我有一系列事件通过 fromEventPattern 进行像这样: fromEventPattern(addEventHandler).subscribe(ps$); 由于业务怪癖,我预计有时会抛出异
我是 rxjs 的新手,无法解决这个问题: 我有两个流: 一个有传入的对象 ---a----b----c----d-----> 一个是从列表中选择的对象 ----------------c---->
如果一个 observable 完成,我是否仍然需要取消订阅/处置(在 RxJS 中)该 observable 以删除 Observer(防止内存泄漏),或者一旦 onComplete 或 onErr
我有这样的订阅: this.test.subscribe(params => { ...some code }); 如果我传递回调函数而不是箭头函数,则缺少上下文。 我想将上下文绑定(bind)到
我有一个可观察的: messages: string[] = ['a', 'b', 'c']; const source = from(messages) 你如何延迟它,所以当有人订阅它时,它
我可以让 observable 触发一次该值。但我希望它在变量的值发生变化时发生。实际上我需要一个观察者。这就是我认为 observable 的意义所在。观察事物的值(value)或状态并更新订阅它的
我有以下代码: const fetchBook = (bookId: number) => { const title = 'Book' + bookId; console.log('
我是一名优秀的程序员,十分优秀!