funcunit
Version:
<!-- @hide title
298 lines (218 loc) • 7.67 kB
Markdown
@page StealJS.project-exporting Project Exporting
@parent StealJS.guides 2
StealJS can export your project into commonly used formats and platforms
which can be used to create distributables that can be used in almost any situation:
- [syntax.amd] and Bower
- [syntax.CommonJS] and NPM for [Browserify](http://browserify.org/)
- [syntax.es6 ES Syntax] and StealJS, SystemJS, or JSPM
- [syntax.global global format] and `<script>` tags
This guide uses the [steal-tools.grunt.export] task to call [steal-tools.export] which loads the module source and transpiles it to _AMD_, _CommonJS_ and _global_ compatible distributables. This guide uses the [bit-tabs](https://github.com/bitovi-components/bit-tabs) component built with CanJS, but the same techniques can be used to create and export projects that use any other framework or library.
## Project Structure
The Steal export process reads the contents of the project's source directory to generate the distributables. Our `bit-tabs` example component uses the _src/_ directory.
> Create `src/` and create the main entry-point in `src/bit-tabs.js`. The `dist/` and the subdirectories will be created by export process
```
bit-tabs/
/dist
/amd - AMD build
/cjs - CJS/Browserify builds
/global - Global / <script> build
/src - Source files
/test - Test source files
```
## package.json
The project's `package.json` is used to configure how Browserify or Steal loads your
project. The following walks through the important parts:
### "system"
The `system` property specifies SystemJS and StealJS overwrites. Set the [System.main] property as follows to tell SystemJS to use `src/bit-tabs.js` as the starting point of the application. The "npmIgnore" property tells StealJS to ignore processing the package.json files of certain dependencies.
> In the system property, create a "main" property that points to the main entry-point. And,
> set "npmIgnore" to ignore dependencies that aren't needed by the browser.
```
"system": {
"main": "src/bit-tabs",
"npmIgnore": ["devDependencies"]
},
```
### "main"
CJS/Browserify and StealJS will read the `main` property when requiring your package. Set the `main` property to the CommonJS output of the export process.
```
"main": "dist/cjs/lib/bit-tabs",
```
### "dependencies"
Use npm to install your project's dependencies. If your project includes css or LESS files,
include `cssify`. Browserify will use it to bundle css files.
```
"dependencies": {
"can": "2.2.0-alpha.10",
"cssify": "^0.6.0"
},
```
Add `steal`, `steal-tools`, `grunt`, and `grunt-cli` to your project's devDependencies:
> Add your project's dependencies to _package.json_.
```
"devDependencies": {
"grunt": "~0.4.1",
"grunt-cli": "^0.1.13",
"steal": "0.6.0-pre.0",
"steal-tools": "0.6.0-pre.2"
},
```
### "browser" and "browserify"
Because our project will export CSS, we need to tell Browserify to
run "cssify" on css files with a `transform`. To make this work
with new and old versions of Browserify you must specify both the
"browser" and "browserify" properties.
> Specify Browserify transforms.
```
"browser": {
"transform": ["cssify"]
},
"browserify": {
"transform": ["cssify"]
},
```
### "scripts"
Prior to publishing to `npm`, we need to build the distributables. We will create
a grunt build job that builds our project. For now, we will create a npm script command that points to a `grunt build` task which we will create in the next step:
> Create "prepublish" script command which points to `grunt build`.
```
"scripts": {
"test": "grunt test --stack",
"prepublish": "./node_modules/.bin/grunt build"
},
```
## Gruntfile.js
Finally, we use [Grunt](http://gruntjs.com/) for task automation. If Grunt isn't your thing, you can use [steal-tools.export steal-tool's export] method.
> Create a _Gruntfile.js_ that looks like the following code block.
```
module.exports = function (grunt) {
grunt.loadNpmTasks('steal-tools');
grunt.initConfig({
"steal-export": {
dist: {
system: {
config: "package.json!npm"
},
outputs: {
"+cjs": {},
"+amd": {},
"+global-js": {},
"+global-css": {}
}
}
}
});
grunt.registerTask('build',['steal-export']);
};
```
The [steal-tools.grunt.export] grunt task above loads modules and transpiles them to CommonJS, AMD, and a global distributables. The [steal-tools.grunt.export] task requires a [steal-tools.SystemConfig]. In this example, `system.config` points to the `package.json` file which will hold the export configuration.
## Publishing
To generate your project, run:
```
> npm run pre-publish
```
If you have `grunt-cli` installed you can alternatively call grunt directly.
```
> grunt build
```
This should create the `dist/amd`, `dist/cjs` and `dist/global` directories
with the files needed to use your project AMD, CommonJS and `<script>` tags respectively.
For now, you should inspect these files and make sure they work. Eventually,
we may release helpers that make it easy to test your distributables.
### To NPM
Run:
```
> npm publish
```
### To Bower
The first time you publish, you must regisiter your project and create a bower.json.
Register your project's name:
```
> bower register bit-tabs git://github.com/bitovi-components/bit-tabs
```
Create a [bower.json](https://github.com/bower/bower.json-spec#name). The
easiest thing to do is copy your `package.json` and remove any node
specific values.
```
{
"name": "bit-tabs",
"version": "0.0.1",
"description": "",
"main": "dist/cjs/lib/bit-tabs",
"dependencies": {
"can": "2.2.0-alpha.10",
"cssify": "^0.6.0"
},
"system": {
"main": "src/bit-tabs",
"npmIgnore": ["testee","cssify"]
},
}
```
Once bower is setup, publishing to bower just means pushing a
[semver](http://semver.org/) tag to github that matches your project's version.
```
> git tag v0.0.1
> git push origin tag v0.0.1
```
## Importing the Export
Developers need to know how to use your project. The following demonstrates what you need to tell them
depending on how they are using your project.
### NPM and StealJS
Simply import, require, or use define to load your project.
```
import "bit-tabs";
require("bit-tabs");
define(["bit-tabs"], function(){});
```
### NPM and CJS
Simply require your project.
```
require("bit-tabs")
```
### AMD
They must configure your project as a package:
```
require.config({
packages: [{
name: 'bit-tabs',
location: 'path/to/bit-tabs/dist/amd',
main: 'dist/amd/src/bit-tabs'
}]
});
```
And then they can use it as a dependency:
```
define(["bit-tabs"], function(){
});
```
### Global / Standalone
They should add script tags for the dependencies and your project and a link
tag for your project's css:
```
<head lang="en">
<link rel="stylesheet" type="text/css" href="dist/global/bit-tabs.css">
<script src='./node_modules/jquery/dist/jquery.js'></script>
<script src='./node_modules/can/dist/can.jquery.js'></script>
<script src='./node_modules/can/dist/can.stache.js'></script>
<script src='dist/global/bit-tabs.js'></script>
<script>
$(function(){
var frag = can.view("app-template", {});
$("#my-app").html(frag);
})
</script>
</head>
<body>
<script type='text/stache' id="app-template">
<can-import from="bit-tabs"/>
<bit-tabs>
<can-panel title="CanJS">
CanJS provides the MV*
</can-panel>
<can-panel title="StealJS">
StealJS provides the infrastructure.
</can-panel>
</bit-tabs>
</script>
<div id="my-app"></div>
```