gpt4 book ai didi

purescript - 如何组件化 purescript-halogen 应用程序

转载 作者:行者123 更新时间:2023-12-04 19:53:02 26 4
gpt4 key购买 nike

我想使用 Purescript 的 Halogen 编写前端的特定组件。

例如,我想使用卤素创建一个注册表单。它看起来像下面这样:

module RegistrationForm where

import Prelude

...

-- | The state of the application
newtype State = State { email :: String, password :: String }

derive instance genericState :: Generic State
instance showState :: Show State where show = gShow
instance eqState :: Eq State where eq = gEq

initialState :: State
initialState = State { email: "", password: "" }

-- | Inputs to the state machine
data Input a = FormSubmit a
| UpdateEmail String a
| UpdatePassword String a
| NoAction a

type AppEffects eff = HalogenEffects (ajax :: AJAX, console :: CONSOLE | eff)

ui :: forall eff . Component State Input (Aff (AppEffects eff))
ui = component render eval
where
render :: Render State Input
render (State state) = H.div_
[ H.h1_ [ H.text "Register" ]
, ...
]

eval :: Eval Input State Input (Aff (AppEffects eff))
eval (NoAction next) = pure next
eval (FormSubmit next) = do
...
eval (UpdateEmail email next) = do
...
eval (UpdatePassword password next) = do
...

runRegistrationForm :: Eff (AppEffects ()) Unit
runRegistrationForm = runAff throwException (const (pure unit)) $ do
{ node: node, driver: driver } <- runUI ui initialState
appendTo ".registration" node

同样,我有一个 LoginForm处理用户登录到应用程序的模块。

我想知道 如何组织我的源代码、构建我的源代码以及从 Javascript 调用我的 Purescript 代码 ?

目前,我的源代码组织如下:
$ cd my-application/
$ tree
.
├── bower.json
├── README.md
├── site/
│ └── index.html
├── src/
│   ├── LoginForm.purs
│   └── RegistrationForm.purs
└── test/
   └── Test.purs

但是,由于我没有 Main.purs ,我无法执行以下任何操作来构建我的源代码:
$ pulp build --to site/app.js
$ pulp browserify --to site/app.js
$ pulp server

能够将我的纯脚本代码构建到逻辑 javascript 文件中会很好。例如, src/LoginForm.purs可以构建为 site/loginForm.js , 和 src/RegistrationForm.purs可以构建为 site/registrationForm.js .

然后,我可以包含 loginForm.jsregistrationForm.js在我实际的html页面中作为需要。

最佳答案

Pulp 并没有真正涵盖这个用例,它只适用于只有一个 Main 的应用程序。 .

我建议使用 gulp设置来实现这一点,使用类似这样的 gulpfile:

"use strict";

var gulp = require("gulp"),
purescript = require("gulp-purescript"),
webpack = require("webpack-stream");

var sources = [
"src/**/*.purs",
"bower_components/purescript-*/src/**/*.purs",
];

var foreigns = [
"src/**/*.js",
"bower_components/purescript-*/src/**/*.js"
];

gulp.task("make", function() {
return purescript.psc({
src: sources,
ffi: foreigns
});
});

var mkBundleTask = function (name, main) {

gulp.task("prebundle-" + name, ["make"], function() {
return purescript.pscBundle({
src: "output/**/*.js",
output: "tmp/js/" + name + ".js",
module: main,
main: main
});
});

gulp.task("bundle-" + name, ["prebundle-" + name], function () {
return gulp.src("tmp/js/" + name + ".js")
.pipe(webpack({
resolve: { modulesDirectories: ["node_modules"] },
output: { filename: name + ".js" }
}))
.pipe(gulp.dest("site/js"));
});

return "bundle-" + name;
};

gulp.task("bundle", [
mkBundleTask("loginForm", "LoginForm"),
mkBundleTask("registrationForm", "RegistrationForm")
]);

gulp.task("default", ["bundle"]);

这可能不太正确,但我从我们如何使用 SlamData 中提取它,所以它绝对是正确的。

关于purescript - 如何组件化 purescript-halogen 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com