经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
如何解决在执行gulp任务中出现的错误ReferenceError: primordials is not defined
来源:cnblogs  作者:Jaxu  时间:2021/4/19 8:56:32  对本文有异议

  最近在执行一个gulp任务时遇到下面这个错误:

  Google的结果是说这个是gulp 3在Node 12.x上的一个bug。解决的办法有两个:要么通过nvm将node版本降到12以下,要么将gulp升级到4。由于我工作的电脑上还有其它的项目需要依赖node 12.x版本,所以只能采用第二种办法,将gulp升级到4.0.2。升级完之后继续执行刚才的命令,然后问题又来了:

  按照console中的错误描述:Did you forget to signal async completion? 意思是说这个gulp任务有可能是个异步操作,需要标记为async。然后我修改了gulp.js文件,在对应的task的回调函数前加了async标记,重新执行命令,顺利通过!

  1. gulp.task('makeNodeModule', async () => {
  2. var destPath = "./out";
  3. gulp.src("./lib/**", { 'dot': true })
  4. .pipe(gulp.dest(destPath + "/lib", {'overwrite':true}));
  5. gulp.src("./res/**", { 'dot': true })
  6. .pipe(gulp.dest(destPath + "/res", {'overwrite':true}));
  7. gulp.src("./package.json")
  8. .pipe(gulp.dest(destPath, {'overwrite':true}));
  9. });

  这是由于在gulp的任务中包含了异步代码,你必须在任务执行完后告诉gulp(异步操作)。在gulp 3.x中可以不用处理,如果没有显式地进行async标记,gulp会假定任务是同步执行的,一旦函数返回结果,gulp的任务也就结束了。但是gulp 4在这方面要求更加严格,你必须明确告知gulp任务何时执行完毕。事实上,按照gulp的官方文档的描述,有以下六种解决办法

  1. 返回Stream
    如果gulp任务只是在控制台输出一些信息,这个解决办法可能并不适用。不过在大多数情况下我们都会使用gulp streams来完成一个异步操作,下面是一个例子:
    1. var print = require('gulp-print');
    2. gulp.task('message', function() {
    3. return gulp.src('package.json')
    4. .pipe(print(function() { return 'HTTP Server Started'; }));
    5. });

    这里的return语句是关键,如果不返回stream,gulp就不会知道该任务何时结束。当然,如果一个gulp任务中存在多个异步操作,则该解决办法也不适用,继续往下看。

  2. 返回一个Promise
    在大多数情况下,这个解决办法可能更适用。不过在真实使用场景下,你可能并不需要自己创建一个Promise对象,我们可以借助于第三方的包来构建一个Promise(例如使用del包)。
    1. gulp.task('message', function() {
    2. return new Promise(function(resolve, reject) {
    3. console.log("HTTP Server Started");
    4. resolve();
    5. });
    6. });

    使用async/await语法可以进一步简化上面的代码。所有标记为async的函数都会隐式地返回一个Promise,所以上面的代码也可以改成下面这种形式(前提是你使用的node版本要支持):

    1. gulp.task('message', async function() {
    2. console.log("HTTP Server Started");
    3. });

    显然,如果一个gulp中存在多个异步操作,这个解决办法更加适用。

  3. 调用回调函数
    这个解决办法可能是最容易的。由于gulp会自动将回调函数作为第一个参数传递进来,所以当任务执行完后,你可以显式地执行这个回调函数:
    1. gulp.task('message', function(done) {
    2. console.log("HTTP Server Started");
    3. done();
    4. }); 
  4. 返回一个子进程
    不太推荐这个解决办法,因为它可能会过度依赖于系统环境。但是如果你可以在代码中直接调用命令行工具,这个解决办法可能会有用。
    1. var spawn = require('child_process').spawn;
    2. gulp.task('message', function() {
    3. return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
    4. });
  5. 返回一个RxJS Observable
    如果你使用RxJS,这个解决办法可能会适用。
    1. var of = require('rxjs').of;
    2. gulp.task('message', function() {
    3. var o = of('HTTP Server Started');
    4. o.subscribe(function(msg) { console.log(msg); });
    5. return o;
    6. });
  6. 返回一个EventEmitter
    和前一个一样,真实场景下你可能不太会使用这个解决办法,不过如果你已经在代码中使用了EventEmitter,这个解决办法可能会有用。
    1. gulp.task('message3', function() {
    2. var e = new EventEmitter();
    3. e.on('msg', function(msg) { console.log(msg); });
    4. setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
    5. return e;
    6. });

     

原文链接:http://www.cnblogs.com/jaxu/p/14662082.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号