Getting started with the Engine
Best way to understand how the engine works is to create a new project and start playing with it.
Prerequisites
Before we start playing with the engine, we will need to perform some setup. First, let's create a new project,
mkdir hello-engine && cd hello-engine && git init && npm init -y
Let's make a node application, in typescript.
npm install --saveDev typescript stylable
In your blank typescript repo:
- install engine-core package
npm i @wixc3/engine-core
- install dev-dependencies
npm i -D typescript webpack html-webpack-plugin react stylable
- install engineer as a dev dependency
npm i -D @wixc3/engineer
- if this is a typescript project, in the root of the project create an
engine.config.js
file, and inside we should add one of the following:
module.exports = {
// the folder where the transpiled js files will be located
featureDiscoveryRoot: 'dist',
};
create tsconfig.json
file in the root directory
{
"compilerOptions": {
"target": "es2020",
"lib": [
"dom",
"es2020"
],
"jsx": "react-jsx",
"module": "commonjs",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"importsNotUsedAsValues": "error",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
Then, let's create 2 files in the src/feature/hello-world
folder (every feature should have it's own <feature_name>
directory):
a. hello-world.feature.ts b. hello-world.my-env.env.ts
hello-world.feature
Let's paste these contents to the file
import { Feature, Environment } from '@wixc3/engine-core';
// this is the environment in which this feature will set itself up
export const myEnv = new Environment('my-env', 'node', 'single');
// our first feature
export default new Feature({
id: 'helloWorldFeature',
api: {},
});
create webpack.config.js
file and add:
const { StylableWebpackPlugin } = require('@stylable/webpack-plugin');
module.exports = {
plugins: [new StylableWebpackPlugin()],
};
We create the feature file, in which we declare what is the feature's API and its Id.
We also create a new environment - my-env
.
* It is important to export the environment from the feature file, this is how engineer
picks it up
hello-world.my-env.env.ts
Let's paste these contents to the file
import helloWorldFeature, { myEnv } from './hello-world.feature';
helloWorldFeature.setup(myEnv, ({ run }) => {
console.log('hello');
run(() => {
console.log('world');
});
});
We set our feature up in the my-env
environment.
In the setup phase of the feature, we will print hello
In the run phase, we will print world
.
Running the feature
In order to run this feature, all we need to do, is in the terminal just to run npx engineer start -f hello-world
.
This command will locate from the process.cwd()
or join(process.cwd(), featureDiscoveryRoot)
if provided,
the hello-world
feature and run it.
The -f
and -c
flags in engineer are calculated as follows:
-
find the name of the closest package.
-
remove the scope, if exists, and the
-feature
suffix of exists. -
if the feature name is different then the result in #2, append the feature name (as stated in the file name) with a
/
.
In our example, the package name was @example/hello-feature
then the call to engineer would
be npx engineer start -f hello/hello-world
, while if the package name was @example/hello-world-feature
, the call to
engineer would be npx engineer start -f hello-world
We should see hello
followed by world
written in the console.
For a live example, go to examples/hello-world
and run npm start