Faits :
A.
Le 25 avril 2016, la Municipalité de Duillier a accordé à B._ une autorisation préalable d'implantation en vue de transformer le bâtiment existant et d'en construire un nouveau sur les parcelles n° 21 et 286, sises en zone Village selon le plan général d'affectation de 2002 (PGA). Les oppositions formées par A._ et D._, propriétaires voisins, ont été écartées et les opposants ont saisi en vain la Cour de droit administratif et public du Tribunal cantonal vaudois (CDAP, arrêt du 29 juin 2017), puis le Tribunal fédéral (arrêt 1C_430/2017 du 31 août 2017 déclarant le recours irrecevable en raison du caractère incident de la décision attaquée).
Le 1er juillet 2016, la municipalité a annoncé son intention d'établir une zone réservée sur l'ensemble du territoire communal en vue de la révision de son PGA. Mis à l'enquête en septembre 2016 et en février 2017, le projet de zone réservée a été adopté le 20 mars 2018.
Le 19 juin 2018, la municipalité a délivré un permis de construire à B._ portant au total sur dix logements, considérant que le projet était conforme à l'autorisation préalable, malgré l'adoption ultérieure d'une zone réservée, l'ouvrage se situant dans un environnement largement bâti ne se prêtant pas à un dézonage.
B.
Par arrêt du 20 février 2019, la CDAP a admis le nouveau recours formé par les opposants. Dans son ancienne teneur (soit avant la révision entrée en vigueur le 1er septembre 2018), l'art. 79 de la loi vaudoise sur l'aménagement du territoire et les constructions (aLATC) imposait un refus de tout permis dès la mise à l'enquête des plans de zone réservée. En l'espèce, la demande de permis de construire avait été déposée le 20 décembre 2017, soit après la mise à l'enquête de la zone réservée. Se référant à la jurisprudence cantonale, la CDAP a considéré que l'obtention d'une autorisation préalable ne constituait pas une garantie d'obtention d'un permis de construire; une modification de la situation juridique (comme l'adoption d'une zone réservée) pouvait conduire à un refus. L'art. 3 al. 3 du règlement de la zone réservée permettait l'octroi d'un permis de construire lorsque sa mise à l'enquête avait eu lieu avant celle de la zone réservée. Cela valait toutefois pour un projet complet, et non pour une autorisation préalable. Il n'y avait pas lieu de procéder à un contrôle préjudiciel de la zone réservée, ni d'accorder un effet anticipé à la planification future.
C.
Agissant par la voie du recours en matière de droit public, B._ demande au Tribunal fédéral d'annuler l'arrêt cantonal.
La CDAP conclut au rejet du recours et se réfère à son arrêt. La Municipalité de Duillier conclut à l'admission du recours. Les opposants concluent à l'irrecevabilité, subsidiairement au rejet du recours. Dans leurs dernières observations, la municipalité, la recourante et les opposants persistent dans leurs conclusions respectives.

Considérant en droit :
1.
Dirigé contre une décision finale (<ref-law>) prise en dernière instance cantonale (art. 86 al. 1 let. d LTF) dans le domaine du droit public des constructions (<ref-law>), le recours en matière de droit public est en principe recevable, aucune des exceptions prévues à l'<ref-law> n'étant réalisée. La recourante a pris part à la procédure de recours devant le Tribunal cantonal. En tant que propriétaire dont le permis de construire a été annulé par la cour cantonale, elle est particulièrement touchée par l'arrêt attaqué et peut ainsi se prévaloir d'un intérêt digne de protection à son annulation (<ref-ruling> consid. 2.1 p. 218; arrêt 1C_206/2019 du 6 août 2019 consid. 3.1). Elle a donc en principe qualité pour agir au sens de l'<ref-law>.
1.1. Selon l'<ref-law>, le mémoire de recours doit contenir les conclusions et les motifs à l'appui de celles-ci, sous peine d'irrecevabilité. Les conclusions doivent indiquer sur quels points la décision est attaquée et quelles sont les modifications demandées (<ref-ruling> consid. 3.1). En l'occurrence, le recours ne tend qu'à l'annulation de l'arrêt cantonal. Malgré l'absence de conclusions en réforme, on comprend qu'il tend au rétablissement des décisions municipales accordant le permis de construire.
1.2. A teneur de l'<ref-law>, les motifs doivent exposer succinctement en quoi l'acte attaqué viole le droit. Pour satisfaire à cette exigence, il appartient à la partie recourante de discuter au moins brièvement les considérants de la décision litigieuse et d'expliquer en quoi ceux-ci seraient contraires au droit. Les griefs de violation des droits fondamentaux sont en outre soumis à des exigences de motivation accrues (<ref-law>). La partie recourante doit alors mentionner les principes constitutionnels qui n'auraient pas été respectés et expliquer de manière claire et précise en quoi ces principes auraient été violés. Les critiques de nature appellatoire sont irrecevables (<ref-ruling> consid. 1.1 p. 503). Se fondant sur le précédent arrêt de la CDAP du 29 juin 2017, la recourante estime que le second arrêt constituerait un revirement arbitraire et contraire aux principe de la bonne foi et de la sécurité du droit, s'agissant de la portée de l'autorisation préalable. Elle se prévaut par ailleurs de l'art. 3 al. 3 du règlement de la zone réservée dont l'interprétation littérale par la cour cantonale serait également arbitraire. Sur ces deux points, elle fait valoir une violation d'ordre constitutionnel suffisamment motivée, contrairement à ce que soutiennent les intimés.
1.3. Les autres conditions de recevabilité du recours en matière de droit public sont réunies, si bien qu'il y a lieu d'entrer en matière.
2.
La recourante rappelle les termes de l'arrêt de la CDAP du 29 juin 2017, dont il ressort qu'une autorisation préalable d'implantation aurait les mêmes effets juridiques qu'une autorisation de construire: elle aurait ainsi force de chose décidée sur les points qui y sont traités et un projet conforme déposé dans les deux ans ne pourrait plus être contesté. La recourante relève que suite à l'autorisation préalable, elle aurait engagé 210'000 fr. de frais d'architecte. Le revirement opéré dans l'arrêt attaqué serait arbitraire et porterait ainsi atteinte à la sécurité du droit ainsi qu'aux droits subjectifs de la recourante.
2.1. Selon la jurisprudence, un changement de jurisprudence ne se justifie en principe que lorsque la nouvelle solution procède d'une meilleure compréhension de la ratio legis, repose sur des circonstances de fait modifiées ou répond à l'évolution des conceptions juridiques; sinon, la pratique en cours doit être maintenue en vertu du principe de sécurité du droit (<ref-ruling> consid. 4).
2.2. Contrairement à ce que soutient la recourante, l'arrêt attaqué ne consacre pas un changement de pratique par rapport à l'arrêt du 29 juin 2017. Rappelant dans un premier temps les principes évoqués ci-dessus quant à la force de chose décidée de l'autorisation préalable, la CDAP relève que le premier arrêt a finalement laissé indécis le point de savoir si la municipalité pourrait - ou même devrait - refuser le permis de construire en raison de la procédure d'aménagement d'une zone réservée ou de la révision du PGA, dès lors que la procédure de recours portait alors uniquement sur la validité de l'autorisation préalable. La question de savoir si un changement des circonstances pouvait permettre de revenir sur l'autorisation préalable n'a donc nullement été résolue dans le premier arrêt. Or, la jurisprudence tant cantonale (mentionnée dans l'arrêt attaqué) que fédérale (arrêt 1C_588/2016 du 26 octobre 2017 consid. 2.3) considère que si les autorisations de construire préalables (ou permis d'implantation) disposent en principe de l'autorité de chose décidée pour les éléments qu'elles concernent, conférant certaines expectatives au constructeur, il n'est pas pour autant exclu qu'elles puissent être remises en cause par la suite, à l'instar de tout acte administratif unilatéral tel qu'une autorisation de construire ordinaire. Une révocation d'une telle décision est en effet possible, même en l'absence de base légale spécifique (MOOR/POLTIER, Droit administratif, volume II, 3e éd. 2011, p. 382 s.), en cas de changement dans la situation de fait ou dans la réglementation. De la même manière, l'autorisation préalable peut être revue à l'occasion de la procédure de permis définitif, pour autant que l'intérêt à une application correcte de la législation l'emporte sur les principes de sécurité du droit et de la bonne foi (arrêt 1C_588/2016 du 26 octobre 2017 consid. 2.3).
En l'occurrence, l'institution d'une zone réservée impliquant une interdiction généralisée de construire en vue d'une redéfinition de la zone à bâtir imposée par le droit fédéral, constituait un élément nouveau constitutif d'un intérêt majeur dont il ne pouvait être tenu compte dans la première procédure et dont l'autorité ne pouvait faire abstraction dans la seconde. Il n'y a aucun changement de pratique ni aucun arbitraire sur ce point.
3.
La recourante invoque ensuite l'art. 3 al. 3 du règlement de la zone réservée, disposition selon laquelle " tout permis de construire dont la mise à l'enquête publique a débuté avant la mise à l'enquête publique de la zone réservée peut être délivré ". Elle considère qu'il serait arbitraire d'exclure les autorisations préalables d'implantation du champ d'application de cette disposition, dans la mesure où celles-ci équivaudraient à un permis de construire. Elle relève par ailleurs que la parcelle concernée se trouve au coeur du village dans un secteur largement bâti, de sorte qu'un dézonage n'entrerait pas en considération; la faible importance du projet ne porterait pas atteinte aux objectifs de planification.
3.1. Selon la jurisprudence, une décision est arbitraire lorsqu'elle est manifestement insoutenable, méconnaît gravement une norme ou un principe juridique clair et indiscuté, ou heurte de manière choquante le sentiment de la justice et de l'équité; il ne suffit pas qu'une autre solution paraisse concevable, voire préférable; pour que cette décision soit annulée, encore faut-il qu'elle se révèle arbitraire non seulement dans ses motifs, mais aussi dans son résultat (<ref-ruling> consid. 7.3 p. 174 s. et les références).
3.2. L'on ne voit pas en quoi il serait arbitraire de s'en tenir à une interprétation littérale du règlement: un acte normatif doit en effet s'interpréter en premier lieu selon sa lettre, les autres éléments d'interprétation n'intervenant qu'à titre subsidiaire (ATF 141 I 280 consid. 6 p. 287). Comme cela est relevé ci-dessus, la cour cantonale pouvait également retenir, pour confirmer cette interprétation, qu'une autorisation préalable n'était pas en tout point comparable à un permis de construire définitif puisqu'elle ne confère pas un droit immédiat de construire. Dans la mesure où la recourante ne pouvait être mise au bénéfice de l'exception à l'interdiction de construire, l'art. 79 aLATC imposait un refus de permis de construire, quelles que soient les caractéristiques du projet et les investissements réalisés. Il n'y a pas arbitraire sur ce point également.
4.
Sur le vu de ce qui précède, le recours est rejeté. Conformément aux art. 66 al. 1 et 68 al. 2 LTF, les frais judiciaires sont mis à la charge de la recourante, de même que l'indemnité de dépens allouée aux intimés, lesquels obtiennent gain de cause avec l'assistance d'un avocat.

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Une indemnité de dépens de 3'000 fr. est allouée aux intimés A._ et D._, à la charge de la recourante.
3.
Les frais judiciaires, arrêtés à 4'000 fr., sont mis à la charge de la recourante.
4.
Le présent arrêt est communiqué aux mandataires des parties, à la Municipalité de Duillier et au Tribunal cantonal du canton de Vaud, Cour de droit administratif et public.
Lausanne, le 17 janvier 2020
Au nom de la Ire Cour de droit public
du Tribunal fédéral suisse
Le Juge présidant : Fonjallaz
Le Greffier : Kurz