如何部署单页应用程序。用ClojureScript / Figwheel写成静态服务器?

时间:2016-06-06 22:42:28

标签: single-page-application clojurescript figwheel

我正在玩Figwheel并编写一个简单的单页应用,不需要任何服务器端智能。

原则上,这个应用程序。可以放在任何静态的Web服务器上。

但我该如何实际部署呢?看起来我的Figwheel开发环境中的main.js正在设置图形连接。

我实际需要将哪些js和html文件放在我的静态服务器上? Figwheel是否创建了它们,还是我需要创建一个新的main.js和index.html?我在哪里可以找到例子?

该文档非常适合如何开始使用Figwheel,但令人惊讶的是对完成开发后的操作保持沉默。

2 个答案:

答案 0 :(得分:7)

第1步:进行生产构建: lein do clean, cljsbuild once min

第2步:将resources/public中的所有内容放在可公开访问的位置。

以下是我在示例项目中使用的脚本: https://github.com/timothypratley/whip/blob/master/deploy.sh

HTML资源在本地开发和部署之间不会更改。唯一不同的是编译的工件。您可以在事实上部署开发编译工件。建议进行“生产构建”的唯一原因是,在本地开发时,中间JS文件不会拼接在一起,因为将更改后的代码加载到浏览器中会更快。对于部署,具有单个编译工件更好。单个编译的JS可以具有高级优化,或者只是简单的优化,具体取决于您在project.clj中配置构建的方式。你真的不需要担心这一点,我只是在解释,因为你具体询问了哪些变化。

HTML页面完全没有变化可能听起来很奇怪,所以让我们再解释一下。 HTML页面包含一个已编译的JS,当你运行figwheel时,如果你打开那个JS,你会看到它依次加载其他JS文件。但是如果您退出figwheel并进行干净的“生产”构建,您将看到所有代码都进入一个JS文件。很狡猾吧?

那个鞭子项目应该提供你正在寻找的例子,如果有任何不清楚的地方,请告诉我。

它使用github页面和部署目标,但是你只需要在某处托管的resources / public目录中的所有内容。因此,您可以使用与任何部署目标非常相似的脚本。

答案 1 :(得分:3)

给蒂莫西·普拉特利提示他的答案。

我在它上面构建了更多细节。见https://github.com/deg/clojure-then-you-think/wiki/Static-website-deploy-to-GitHub

但是,由于Stack Overflow主持人正确地担心场外答案过时,这里是完整副本,截至目前正确:

(给Timothy Pratley提示!这里的想法是基于他的whip projectStack Overflow answer)。

许多ClojureScript项目不需要显式的服务器支持。他们要么在浏览器中做所有事情,要么为后端使用基于云的现有解决方案。一个例子是我的Trilystro玩具项目,该项目是前端的re-frame浏览器应用,并使用Firebase应用进行持久存储。

对于这种项目,一种非常简单的部署技术是创建GitHub Pages项目页面。成本为零,网站可用性似乎很好(在我非常轻的测试中)。

设置

GitHub配置

GitHub的详细说明在该页面上,但步骤非常简单: - 在GitHub上,进入项目设置|选项。 - 打开 GitHub页面(靠近选项页面底部)。 - 将已编译的项目部署到项目的gh-pages分支。 (见下文!) - 您的项目现在可在http://YOUR-GITHUB-ID.github.io/YOUR-GITHUB-REPOSITORY处获得 - (可选)设置自定义域    - 在选项中将新URL添加为自定义域    - 在DNS提供商处,添加指向 YOUR-GITHUB-ID .github.io的CNAME记录。重要提示: not 在此处包含存储库名称。 (CNAME必须指向主机,而不是URL)。    - 在已部署项目的根目录中添加名为CNAME的文件,仅包含URL

Clojure部署

我们刷过了上面的一个关键步骤。您必须编译ClojureScript项目并将其放入GitHub存储库的gh-pages分支。

从广义上讲,这非常简单:只需执行lein cljsbuild并将结果推送到GitHub。一如既往,魔鬼在细节中。根据Timothy Pratley的想法,我创建了两个我在Trilystro中使用的脚本。最新版本在这里:

让我们详细了解它们:(当然,请注意,我将来可能会继续更改这些文件。来源将比下面的副本更准确)

Trilystro仍然在一些地方硬编码到这些脚本中。您需要搜索并替换您自己的项目。

first-deploy.sh
  • 在本地仓库之外创建目录结构。这是我们将保留已部署站点的工作副本的地方。
  • 在本地初始化git repo
  • 添加CNAME文件
  • 将此回购与GitHub上的gh-pages分支相关联

```

#!/bin/bash

DEPLOYDIR=../trilystro-website
mkdir $DEPLOYDIR
pushd $DEPLOYDIR

git init

cat > CNAME <<EOF
trilystro.vuagain.com
EOF

git add .
git commit -m "Initial deploy to GitHub Pages"
git push --force --quiet "git@github.com:deg/trilystro.git" master:gh-pages

git branch gh-pages
git checkout gh-pages

popd

```

deploy.sh
  • 检查项目是否已完全提交。我们将使用git commit SHA标记部署,因此我们希望避免捕获任何杂散更改。
  • 清理并构建项目。如果发生任何错误,请中止。
  • 清理部署目录,然后重新构建CNAME文件并复制编译结果。
  • 还在名为git-describe.txt
  • 的文件中将有关构建的信息复制到部署中
  • 将新版本提交给GitHub,并附上描述版本的评论

```

#!/bin/bash
# Adapted from https://github.com/timothypratley/whip/blob/master/deploy.sh
# See also https://stackoverflow.com/questions/37667931/how-do-i-deploy-a-single-page-app-written-in-clojurescript-figwheel-to-a-stat
set -e

DEPLOYDIR=../trilystro-website

RED='\033[0;31m'
NOCOLOR='\033[0m'

function die(){
  echo -e ${RED}"$1"${NOCOLOR}
  exit 1
}

if [ -n "$(git status --untracked-files=no --porcelain)" ]; then
  die "Aborting deploy. There are uncommited changes.";
fi


lein clean
lein cljsbuild once min || die "Lein cljsbuild failed!"

GIT_COMMIT=$(git show -s --oneline HEAD)

pushd $DEPLOYDIR
rm -rf *
cp -r ../trilystro/resources/public/* .
cat > CNAME <<EOF
trilystro.vuagain.com
EOF
popd

git describe --always               > $DEPLOYDIR/git-describe.txt
git log -1 --format=%cd --date=iso >> $DEPLOYDIR/git-describe.txt

pushd $DEPLOYDIR
git add .
git commit -m "Deploy $GIT_COMMIT"
git push "git@github.com:deg/trilystro.git" gh-pages:gh-pages

popd

```