小编fra*_*ant的帖子

如何自动停止在后台运行的npm脚本

我使用npm脚本,我有一些应该并行运行.我有这样的事情:

...
scripts: {
   "a": "taskA &",
   "preb": "npm run a",
   "b": "taskB"
}
...
Run Code Online (Sandbox Code Playgroud)

这可以!但是我想在taskB完成后自动杀死taskA运行后台.

我怎样才能做到这一点?谢谢!

javascript background build node.js npm

8
推荐指数
1
解决办法
7087
查看次数

为什么我们在Flux/Redux架构中解耦动作和减少器?

我一直在使用Flux和Redux以后很长一段时间,我确实喜欢它们,我看到了它们的好处,但我脑海中浮现的一个问题是:

为什么我们要分解动作和减少器,并在表示改变状态(动作)的意图的调用和更改状态(减速器)的实际方式之间添加额外的间接,以这种方式更难以提供静态或运行时保证和错误检查?为什么不使用修改状态的方法或函数?

方法或函数将提供静态保证(使用Typescript或Flow)和运行时保证(未找到方法/函数等),而未处理的操作根本不会引发任何错误(静态或运行时),您只需要看到预期的行为没有发生.

让我用理论状态容器(TSC)更好地举例说明:

  • 这非常简单
  • 将其视为React Component的状态接口(setState,this.state),没有呈现部分.

所以,你唯一需要的是触发组件重新绘制时,我们TSC的状态改变,并有可能改变这种状态,这对我们来说将是修改状态平原方法:fetchData,setError,setLoading等.

我看到的是动作和减速器是动态或静态调度代码的分离,因此不是叫myStateContainer.doSomethingAndUpdateState(...)你调用actions.doSomethingAndUpdateState(...),而是让整个flux/redux机器将该动作连接到状态的实际修改.这一切也带来了thunk,sagas和其他中间件处理更复杂动作的必要性,而不是仅使用常规的javascript控制流.

主要问题是这种解耦需要你编写很多东西才能实现这种解耦: - 动作创建者函数的接口(参数) - 动作类型 - 动作有效负载 - 你的状态的形状 - 你如何更新你的状态

将此与我们的理论状态容器(TSC)进行比较: - 您的方法的接口 - 您的州的形状 - 您如何更新您的州

那我在这里错过了什么?这种脱钩有什么好处?

这与其他问题非常相似:Redux动作/减速器与直接设置状态

让我解释为什么对这个问题的最多投票答案不能回答我或原来的问题: - 行动/减少者让你问问谁和如何?这可以通过我们的TSC完成,它只是一个实现细节,与动作/减速器本身无关. - 动作/减少器让你回到你的状态:再次这是状态容器的实现细节问题,可以通过我们的TSC实现. - 等等:状态变更单,中间件以及当前通过操作/减速器实现的任何事情都可以通过我们的TSC来实现,这只是它的实现问题.

非常感谢!弗兰

reactjs reactjs-flux redux

5
推荐指数
1
解决办法
440
查看次数

使用Typescript实现Pure Class Mixins

我试图定义一个基于纯类的mixin函数,但是我无法为此类型获得正确的类型签名。

目的是提供一个接受任何Class A作为参数并返回扩展原始Class A的新Class B的函数。

export function mixin<A>(myclass: A) {
  return class B extends A {
    newMethod() {
      //stuff
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,我无法弄清楚。

  • 我需要一种表达A需要成为类的方法。
  • 我还需要表达返回类型,这会产生一些错误,其中包括:

    错误TS4060:导出函数的返回类型具有或正在使用私有名称'B'。

附加信息:

  • 这在utils.ts导出的模块内部,以便其他模块可以使用它
  • 所有这些都在我正在编写的库中进行

typescript typescript2.0

4
推荐指数
2
解决办法
2298
查看次数

为什么Babel使用自上而下的解析器?

我正在研究编译器构造,我自然也在研究这些概念的现实世界.其中一个例子是巴贝尔的解析者:巴比伦.

我浏览了Babylon的代码,它似乎使用了带有嵌入式临时语义规则的Top Down解析器.SRC

我期待Babel使用LR解析器的成员,并且可能是一个定义文件,其中语法产生与语义规则耦合在一起.为什么?好吧,主要是因为一堆其他现实世界的langs使用lr解析器生成器,如Yacc,Bison等,它们为您提供了这个精确的界面,并且似乎是一种更清晰,更易于维护的方式来表示这些规则,甚至更多考虑到Babel生活在Javascript标准的边缘,一直在实现新的东西.

我也构建了自顶向下和自底向上(lr)解析器,我没有看到两者之间的实现难度差异很大(两者都同样困难:))

那么,为什么Babel的解析器使用自顶向下的ad hoc语法定向翻译而不是我认为更结构化的方法呢?背后的设计决策是什么?我错过了什么?

谢谢!

javascript compiler-construction parsing babeljs babel-babylon

3
推荐指数
1
解决办法
210
查看次数

Rust 中的共享循环引用

我正在尝试实现一个非常幼稚的线程池模型。目前线程池的职责是:

  • create一个新线程并返回对其的引用
  • 维护已创建线程的映射
  • 根据线程触发的不同事件来改变线程

我的主要问题是,上述要求迫使我让线程池保留一些HashMap<Id, Thread>线程,但也在创建线程时提供对线程的引用。

最重要的是,我需要能够从任何线程内部调用线程池的方法,从而有效地最终改变 1 个或多个线程(调用者和目标)。

这是一个非功能性的实现:

use std::collections::HashMap;
use std::cell::RefCell;

type Id = u32;
type ThreadPoolRef = RefCell<ThreadPool>;

#[derive(Debug)]
struct ThreadPool {
    pool: HashMap<Id, RefCell<Thread>>,
    id_count: Id
}

impl ThreadPool {
    fn new() -> ThreadPool {
        ThreadPool {
            pool: HashMap::new(),
            id_count: 1
        }
    }

    fn create(&mut self) -> &RefCell<Thread> {
        let thread: RefCell<Thread> =
            RefCell::new(
                Thread::new(self.id_count, RefCell::new(self))
            );
        self.id_count = self.id_count + 1;
        self.pool.insert(self.id_count, thread);
        self.pool.get(&self.id_count).unwrap()
    }
}

#[derive(Debug, Clone)]
struct Thread { …
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
1418
查看次数