A tree-shaking tool for PureScript.
zephyr takes root terms, finds all terms which are required to evaluate
them, and generates code just for them. This is done across all dependencies,
and can substantially reduce the size of PureScript bundles. zephyr can also
evaluate some expressions (an experimental feature).
The simplest option is to download the latest release binary. You may also build from source (see "Build & Test" section below).
# compile your project
purs compile -g corefn bower_components/purescript-*/src/**/*.purs src/**/*.purs
# run `zephyr`
zephyr -f Main.mainthen you can bundle with purs bundle command:
purs bundle -o app.js -m Main dce-output/**/*.jsYou can integrate it with other build tools, see below.
You can specify modules as entry points, which is the same as specifying all exported identifiers.
# include all identifiers from Data.Eq module
zephyr Data.Eq
# as above
zephyr module:Data.Eq
# include Data.Eq.Eq identifier of Data.Eq module
zephyr ident:Data.Eq.Eq
# include 'Data.Eq.eq' identifier
zephyr Data.Eq.eqzephyr reads corefn json representation from the output directory, removes
non transitive dependencies of entry points and generates common js modules (or
corefn representation) to dce-output directory.
Zephyr can evaluate some literal expressions.
import Config (isProduction)
a = if isProduction
then "api/prod/"
else "api/dev/"will be transformed to
a = "api/prod/"whenever isProduction is true. This allows to have different
development and production environments while still ship a minified code which
only contains production code. You may define isProduction in a module under
a src-prod directory and include it when compiling production code with pulp build -I src-prod and to have another copy for your development environment
under src-dev where isProduction is set to false.
zephyr can be integrated with
- pulp: use
pulp build -- -g corefnto compile, andpulp browserify --skip-compile -o dce-outputto bundlezephyr's output. - parcel
- spago. See
this
example. Use
spago build --purs-args '--codegen corefn,js'to compile, usingspago bundleis currently affected by issue.
cabal build exe:zephyrTo run tests
cabal run zephyr-testThe released binaries are dynamically linked against glibc, so if your system is using musl (like Alpine Linux in docker) or another alternative C library, you will need to compile zephyr from source using ghc on that system.
The -f switch is not 100% safe. Upon running, zephyr will remove exports from
foreign modules that seems to be not used: are not used in PureScript code and
seem not to be used in the foreign module. If you simply assign to exports
using JavaScript dot notation then you will be fine, but if you use square
notation exports[var] in a dynamic way (i.e. var is a true variable rather
than a string literal), then zephyr might remove code that shouldn't be
removed.