# Weex Loader

A webpack loader for Weex.

## Install

```
npm install weex-loader --save
```

## Dependencies

The loader needs `weex-scripter/weex-styler/weex-templater` in peer dependencies. You should install them in your projects.

```
npm install weex-scripter weex-styler weex-templater --save
```

## Feature

0. Can load `.we` file.
1. Can load parted files(`.js/.css/.tpl`) instead of one `.we` file.
2. Can chain any loader you want when write parted files.
3. Can require a CommonJS module.
4. Can specify the name of a component.

## Not yet for Spec

0. `<we-element>/<wa-element>/<wx-element>/<element>` tag

## Usage

### How to load a `.we` file.

**make a webpack config**
```javascript
var path = require('path');
var webpack = require('webpack');

var loader = require('weex-loader');
var scripter = require('weex-scripter');
var styler = require('weex-styler');
var templater = require('weex-templater');

/* use the default parsers or your custom parsers */
loader.useScripter(scripter);
loader.useStyler(styler);
loader.useTemplater(templater);

/* The banner plugin is required, please just copy to use it */
var banner = 'var __weex_define__ = define, __weex_bootstrap__ = bootstrap;';
var bannerPlugin = new webpack.BannerPlugin(banner, {
  raw: true
});

module.exports = {
  entry: './test/main.we?entry=true',
  output: {
    path: './test/actual',
    filename: 'main.js'
  },
  module: {
    loaders: [
      {
        test: /\.we(\?[^?]+)?$/,
        loader: 'weex'
      }
    ]
  },
  plugins: [bannerPlugin]
}
```

### How to write parted files

#### write .js/.css/.tpl anywhere

**main.js as script**
```javascript
module.exports = {
    data: {
        text: 'Hello World'
    }
}

module.exports.style = require('./main.css');
module.exports.template = require('./main.tpl');
```

**main.css as style**
```css
.h1 {
    font-size: 60px;
    color: red;
    padding-top: 20px;
    padding-bottom: 20px;
    padding-left: 20px;
    padding-right: 20px;
}
```

**main.tpl as template**
```html
<container>
    <text class="h1">{{text}}</text>
</container>
```

Then change the entry to `main.js` in `webpack.config.js`

#### add some loader in webpack config

**loader for script**
```json
  {
    test: /\.js(\?[^?]+)?$/,
    loader: 'weex?type=script'
  }
```

**loader for style**
```json
  {
    test: /\.css(\?[^?]+)?$/, 
    loader: 'weex?type=style'
  }
```

**loader for template**
```json
  {
    test: /\.tpl(\?[^?]+)?$/, 
    loader: 'weex?type=tpl'
  }
```

### How to require a CommonJS module

0. first, require a `path/to/module.js` in `script` like `var _ = require('loadash')`. 
1. then use it in `script`.

### How to embed a composed component

0. first, require a `path/to/component.js` in `script` like `require('./sub.js')`.
1. second, use it in `template` like `<sub></sub>`.

### How to specify the name of a component

0. By default, the name is the basename without extname of component path.
1. Give a name query in require request, like `require('./sub.js?name="goto"')`
2. use the name in `template` like `<goto></goto>`.

## Chain your favorite loader

For examples:

### write ES2015

Only your need is chain babel-loader before weex-loader.

```json
  {
    test: /\.js(\?[^?]+)?$/,
    loader: 'weex?type=script!babel?presets[]=es2015'
  }
```

### write SCSS

Only your need is chain scss loader before weex-loader.

```json
  {
    test: /\.scss(\?[^?]+)?$/, 
    loader: 'weex?type=style!scss'
  }
```

## Test

```bash
npm run test
```
will run mocha testing

```bash
npm run serve
```
then open `localhost:12581` on chrome, will run web testing
