diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..52151b0
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,141 @@
+{
+  "parserOptions": {
+    "ecmaVersion": 6,
+    "sourceType": "module"
+  },
+
+  "env": {
+    "es6": true,
+    "node": true,
+    "mocha": true
+  },
+
+  "globals": {
+    "document": false,
+    "navigator": false,
+    "window": false,
+    "location": false,
+    "callNative": false,
+    "callJS": false
+  },
+
+  "rules": {
+    "accessor-pairs": 2,
+    "arrow-spacing": [2, { "before": true, "after": true }],
+    "block-spacing": [2, "always"],
+    "brace-style": [2, "stroustrup", { "allowSingleLine": true }],
+    "camelcase": [2, { "properties": "never" }],
+    "comma-dangle": [2, "never"],
+    "comma-spacing": [2, { "before": false, "after": true }],
+    "comma-style": [2, "last"],
+    "constructor-super": 2,
+    "curly": [2, "multi-line"],
+    "dot-location": [2, "property"],
+    "eol-last": 2,
+    "eqeqeq": [2, "allow-null"],
+    "generator-star-spacing": [2, { "before": true, "after": true }],
+    "handle-callback-err": [2, "^(err|error)$" ],
+    "indent": [2, 2, { "SwitchCase": 1 }],
+    "key-spacing": [2, { "beforeColon": false, "afterColon": true }],
+    "keyword-spacing": [2, { "before": true, "after": true }],
+    "new-cap": [2, { "newIsCap": true, "capIsNew": false }],
+    "new-parens": 2,
+    "no-array-constructor": 2,
+    "no-caller": 2,
+    "no-class-assign": 2,
+    "no-cond-assign": 2,
+    "no-const-assign": 2,
+    "no-control-regex": 2,
+    "no-debugger": 2,
+    "no-delete-var": 2,
+    "no-dupe-args": 2,
+    "no-dupe-class-members": 2,
+    "no-dupe-keys": 2,
+    "no-duplicate-case": 2,
+    "no-empty-character-class": 2,
+    "no-empty-pattern": 2,
+    "no-eval": 2,
+    "no-ex-assign": 2,
+    "no-extend-native": 2,
+    "no-extra-bind": 2,
+    "no-extra-boolean-cast": 2,
+    "no-extra-parens": [2, "functions"],
+    "no-fallthrough": 2,
+    "no-floating-decimal": 2,
+    "no-func-assign": 2,
+    "no-implied-eval": 2,
+    "no-inner-declarations": [2, "functions"],
+    "no-invalid-regexp": 2,
+    "no-irregular-whitespace": 2,
+    "no-iterator": 2,
+    "no-label-var": 2,
+    "no-labels": [2, { "allowLoop": false, "allowSwitch": false }],
+    "no-lone-blocks": 2,
+    "no-mixed-spaces-and-tabs": 2,
+    "no-multi-spaces": 2,
+    "no-multi-str": 2,
+    "no-multiple-empty-lines": [2, { "max": 1 }],
+    "no-native-reassign": 2,
+    "no-negated-in-lhs": 2,
+    "no-new-object": 2,
+    "no-new-require": 2,
+    "no-new-symbol": 2,
+    "no-new-wrappers": 2,
+    "no-obj-calls": 2,
+    "no-octal": 2,
+    "no-octal-escape": 2,
+    "no-path-concat": 2,
+    "no-proto": 2,
+    "no-redeclare": 2,
+    "no-regex-spaces": 2,
+    "no-return-assign": [2, "except-parens"],
+    "no-self-assign": 2,
+    "no-self-compare": 2,
+    "no-sequences": 2,
+    "no-shadow-restricted-names": 2,
+    "no-spaced-func": 2,
+    "no-sparse-arrays": 2,
+    "no-this-before-super": 2,
+    "no-throw-literal": 2,
+    "no-trailing-spaces": 2,
+    "no-undef": 2,
+    "no-undef-init": 2,
+    "no-unexpected-multiline": 2,
+    "no-unmodified-loop-condition": 2,
+    "no-unneeded-ternary": [2, { "defaultAssignment": false }],
+    "no-unreachable": 2,
+    "no-unsafe-finally": 2,
+    "no-unused-vars": [2, { "vars": "all", "args": "none" }],
+    "no-useless-call": 2,
+    "no-useless-computed-key": 2,
+    "no-useless-constructor": 2,
+    "no-useless-escape": 2,
+    "no-whitespace-before-property": 2,
+    "no-with": 2,
+    "one-var": [2, { "initialized": "never" }],
+    // "operator-linebreak": [2, "after", { "overrides": { "?": "before", ":": "before" } }],
+    "padded-blocks": [2, "never"],
+    "quotes": [2, "single", {"avoidEscape": true, "allowTemplateLiterals": true}],
+    "semi": [2, "never"],
+    "semi-spacing": [2, { "before": false, "after": true }],
+    "space-before-blocks": [2, "always"],
+    "space-before-function-paren": [2, "always"],
+    "space-in-parens": [2, "never"],
+    "space-infix-ops": 2,
+    "space-unary-ops": [2, { "words": true, "nonwords": false }],
+    "spaced-comment": [2, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }],
+    "template-curly-spacing": [2, "never"],
+    "use-isnan": 2,
+    "valid-typeof": 2,
+    "wrap-iife": [2, "any"],
+    "yield-star-spacing": [2, "both"],
+    "yoda": [2, "never"],
+
+    "no-var": 2,
+    "prefer-const": 2,
+    "object-curly-spacing": [2, "always", {
+      objectsInObjects: false
+    }],
+    "array-bracket-spacing": [2, "never"]
+  }
+}
diff --git a/.gitignore b/.gitignore
index 9730c19..a76bb72 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 node_modules
+lib
 
 test/actual
 test/expect/*.js
diff --git a/.npmignore b/.npmignore
index 79e6ea4..246c4aa 100644
--- a/.npmignore
+++ b/.npmignore
@@ -1,2 +1,3 @@
 node_modules
-test
\ No newline at end of file
+src
+test
diff --git a/index.js b/index.js
index a4b96d7..9615572 100644
--- a/index.js
+++ b/index.js
@@ -1,284 +1 @@
-'use strict';
-
-var path = require('path');
-var fs = require('fs');
-var md5 = require('md5');
-var loaderUtils = require('loader-utils');
-var blocker = require('weex-transformer/lib/blocker');
-
-var pkg = require('./package.json');
-var transformerVersion = pkg.dependencies['weex-transformer'].match(/\d+(?:\.\d+){0,2}/)[0];
-
-var templater = require('weex-templater');
-var styler = require('weex-styler');
-var scripter = require('weex-scripter');
-
-var MODULE_EXPORTS_REG = /module\.exports/g;
-var REQUIRE_REG = /require\((["'])(\@weex\-module\/[^\)\1]+)\1\)/g;
-
-function parseScript(loader, params, source, config, data, elementName, elements) {
-    elements = elements || []
-
-    if (!scripter) {
-        return Promise.reject('please use a script parser. e.g. weex-scripter');
-    }
-
-    var target = scripter.fix(source);
-    var name = elementName || params.resourceQuery.name ||
-                    path.basename(params.resourcePath).replace(/\..*$/, '');
-
-    if (!elementName && params.resourceQuery.entry === true) {
-        name = md5(source);
-    }
-
-    target = target.replace(MODULE_EXPORTS_REG, '__weex_module__.exports')
-                .replace(REQUIRE_REG, '__weex_require__($1$2$1)');
-
-    target = ';__weex_define__("@weex-component/' + name + '", [], ' + 
-                'function(__weex_require__, __weex_exports__, __weex_module__)' + 
-                '{\n' + target + '\n})';
-
-    if (!elementName && params.resourceQuery.entry === true) {
-        target += '\n;__weex_bootstrap__("@weex-component/' + name + '", ' + 
-                    String(config) + ',' + 
-                    String(data) + ')';
-    }
-
-    target = elements.concat(target).join(';\n\n')
-
-    return Promise.resolve(target);
-}
-
-var logLevel = false;
-function logWarning(loader, log) {
-    if (logLevel === false) return;
-
-    if (log && log instanceof Array) {
-        log.forEach(function(l) {
-            loader.emitWarning(l.reason + '\t@' + l.line + ':' + l.column)
-        });
-    }
-}
-
-function parseStyle(loader, params, source) {
-    return new Promise(function(resolve, reject) {
-        if (!styler) {
-            return reject('please use a style parser. e.g. weex-styler');
-        }
-
-        styler.parse(source, function(err, obj) {
-            if (err) {
-                reject(err);
-            } else {
-                logWarning(loader, obj.log);
-                var target = JSON.stringify(obj.jsonStyle, null, '  ');
-                resolve(target);
-            }
-        });
-    });
-}
-
-var FUNC_START = '#####FUN_S#####';
-var FUNC_START_REG = new RegExp('["\']' + FUNC_START, 'g');
-var FUNC_END = '#####FUN_E#####';
-var FUNC_END_REG = new RegExp(FUNC_END + '["\']', 'g');
-function stringifyFunction(key, value) {
-    if (typeof value === 'function') {
-      return  FUNC_START + value.toString() + '#####FUN_E#####';
-    }
-    return value;
-}
-
-function parseTemplate(loader, params, source, deps) {
-    return new Promise(function(resolve, reject) {
-        if (!templater) {
-            return reject('please use a template parser. e.g. weex-templater');
-        }
-
-        templater.parse(source, function(err, obj) {
-            if (err) {
-                reject(err);
-            } else {
-                logWarning(loader, obj.log);
-
-                if (deps && obj.deps) {
-                    var context = path.dirname(params.resourcePath);
-                    obj.deps.map(function(dep) {
-                        var filename = './' + dep + '.we';
-                        var filepath = path.resolve(context, filename);
-                        if (fs.existsSync(filepath)) {
-                            return filename;
-                        }
-                    }).forEach(function(dep) {
-                        if (dep) {
-                            deps.push(dep);
-                        }
-                    });
-                }
-
-                var target = JSON.stringify(obj.jsonTemplate, stringifyFunction, '  ');
-                target = target.replace(FUNC_START_REG, '')
-                        .replace(FUNC_END_REG, '');
-
-                resolve(target);
-            }
-        });
-    });
-}
-
-function parseWeexFile(loader, params, source, deps, elementName) {
-    var results;
-    deps = deps || [];
-
-    return new Promise(function(resolve, reject) {
-        blocker.format(source, function(err, ret) {
-            if (err) {
-                reject(err);
-            } else {
-                results = ret;
-                resolve();
-            }
-        });
-    }).then(function() {
-        var promises = [Promise.resolve(), Promise.resolve(), Promise.resolve()];
-        var content;
-        if (results.elements) {
-            var elPromises = []
-            Object.keys(results.elements).forEach(function (key) {
-                var el = results.elements[key];
-                elPromises.push(parseWeexFile(loader, params, el.content, deps, el.name));
-            });
-            promises[0] = Promise.all(elPromises);
-        }
-        if (results.template) {
-            content = results.template.content;
-            promises[1] = parseTemplate(loader, params, content, deps);
-        }
-        if (results.styles) {
-            content = results.styles.reduce(function(pre, cur) {
-                return pre + '\n' + cur.content;
-            }, '');
-            promises[2] = parseStyle(loader, params, content);
-        }
-
-        return Promise.all(promises);
-    }).then(function(ret) {
-        var elements = ret[0] || [];
-        var template = ret[1];
-        var style = ret[2];
-
-        var content = '';
-        var config = {};
-        var data;
-
-        if (results.scripts) {
-            content += results.scripts.reduce(function(pre, cur) {
-                return pre + '\n;' + cur.content;
-            }, '');
-        }
-
-        var requireContent = '';
-        if (deps.length) {
-            requireContent += deps.map(function(dep) {
-                if (!content.match(new RegExp('require\\(["\']./' + path.basename(dep) + '(\.we)?["\']\\)', 'g'))) {
-                    return 'require("' + dep + '");';
-                } else {
-                    return '';
-                }
-            }).join('\n');
-            content = requireContent + '\n' + content;
-        }
-
-        if (template) {
-            content += '\n;module.exports.template = module.exports.template || {}' + 
-                        '\n;Object.assign(module.exports.template, ' + template + ')';
-        }
-
-        if (style) {
-            content += '\n;module.exports.style = module.exports.style || {}' + 
-                        '\n;Object.assign(module.exports.style, ' + style + ')';
-        }
-
-        if (results.config) {
-            config = new Function('return ' + results.config.content.replace(/\n/g, ''))();
-        }
-        config.transformerVersion = transformerVersion;
-        config = JSON.stringify(config, null, '  ');
-
-        if (results.data) {
-            data = new Function('return ' + results.data.content.replace(/\n/g, ''))();
-            data = JSON.stringify(data, null, ' ');
-        }
-        return parseScript(loader, params, content, config, data, elementName, elements);
-    });
-}
-
-function partedLoader(type, loader, params, source) {
-    var promise;
-    switch(type) {
-        case 'js':
-        case 'script':
-            var config = JSON.stringify({
-                transformerVersion: transformerVersion
-            });
-            promise = parseScript(loader, params, source, config);
-            break;
-        case 'css':
-        case 'style':
-            promise = parseStyle(loader, params, source);
-            break;
-        case 'html':
-        case 'tpl':
-        case 'template':
-            promise = parseTemplate(loader, params, source);
-            break;
-        case 'we':
-        default:
-            promise = parseWeexFile(loader, params, source);
-            break;
-    }
-    return promise;
-}
-
-function loader(source) {
-    var self = this;
-    this.cacheable && this.cacheable();
-
-    var callback = this.async();
-    var params = {
-        loaderQuery: loaderUtils.parseQuery(this.query),
-        resourceQuery: loaderUtils.parseQuery(this.resourceQuery),
-        resourcePath: this.resourcePath
-    };
-    var type = params.loaderQuery.type || 'we';
-    var promise = partedLoader(type, this, params, source);
-
-    promise.then(function(result) {
-        if (type === 'style' || type === 'css' ||
-            type === 'html' || type === 'tpl' || type === 'template') {
-            result = 'module.exports=' + result;
-        }
-        callback(null, result);
-    }).catch(function(err) {
-        self.emitError(err.toString());
-        callback(err.toString(), '');
-    });
-}
-
-loader.useScripter = function(module) {
-    console.warn('\u001b[1;32m[Warn]\u001b[0m: method useScripter() in weex-loader is no more necessary');
-}
-
-loader.useStyler = function(module) {
-    console.warn('\u001b[1;32m[Warn]\u001b[0m: method useStyler() in weex-loader is no more necessary');
-}
-
-loader.useTemplater = function(module) {
-    console.warn('\u001b[1;32m[Warn]\u001b[0m: method useTemplater() in weex-loader is no more necessary');
-}
-
-loader.setLogLevel = function(level) {
-    logLevel = level
-}
-
-module.exports = loader;
+module.exports = require('./lib/')
diff --git a/package.json b/package.json
index 13d6f66..7884d3e 100644
--- a/package.json
+++ b/package.json
@@ -16,17 +16,21 @@
     "transformer"
   ],
   "scripts": {
+    "prepublish": "node_modules/babel-cli/bin/babel.js src --out-dir lib",
+    "test:lint": "eslint src",
     "test:build": "webpack --config test/webpack.config.js",
     "test:transform": "transformer test/expect/*.we -o test/expect",
-    "test:mocha": "mocha --compilers js:babel-core/register test/test.js",
-    "test": "npm run test:build && npm run test:transform && npm run test:mocha",
+    "test:mocha": "mocha test/test.js",
+    "test": "npm run prepublish && npm run test:lint && npm run test:build && npm run test:transform && npm run test:mocha",
     "serve": "serve ./test -p 12581"
   },
   "devDependencies": {
-    "babel-core": "^6.7.6",
+    "babel-cli": "^6.10.1",
+    "babel-core": "^6.10.4",
     "babel-loader": "^6.2.4",
-    "babel-preset-es2015": "^6.6.0",
+    "babel-preset-es2015": "^6.9.0",
     "chai": "^3.5.0",
+    "eslint": "^2.13.1",
     "less": "^2.6.1",
     "less-loader": "^2.2.3",
     "mocha": "^2.4.5",
@@ -38,9 +42,13 @@
   "dependencies": {
     "loader-utils": "~0.2.14",
     "md5": "^2.1.0",
+    "source-map": "^0.5.6",
     "weex-scripter": "^0.1.4",
     "weex-styler": "^0.0.17",
     "weex-templater": "^0.2.1",
     "weex-transformer": "^0.3.1"
+  },
+  "babel": {
+    "presets": ["es2015"]
   }
 }
diff --git a/src/config.js b/src/config.js
new file mode 100644
index 0000000..c1e9e30
--- /dev/null
+++ b/src/config.js
@@ -0,0 +1,3 @@
+import pkg from '../package.json'
+export const transformerVersion = pkg.dependencies['weex-transformer'].match(/\d+(?:\.\d+){0,2}/)[0]
+export const logLevel = false
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..fbec04e
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,70 @@
+import loaderUtils from 'loader-utils'
+
+import {
+  parseScript,
+  parseStyle,
+  parseTemplate,
+  parseWeexFile
+} from './parser'
+import * as config from './config'
+import * as legacy from './legacy'
+
+function partedLoader (type, loader, params, source) {
+  let promise
+  switch (type) {
+    case 'js':
+    case 'script':
+      const transformerVersion = config.transformerVersion
+      promise = parseScript(loader, params, source,
+        { config: JSON.stringify({ transformerVersion }) })
+      break
+    case 'css':
+    case 'style':
+      promise = parseStyle(loader, params, source)
+      break
+    case 'html':
+    case 'tpl':
+    case 'template':
+      promise = parseTemplate(loader, params, source)
+      break
+    case 'we':
+    default:
+      promise = parseWeexFile(loader, params, source)
+      break
+  }
+  return promise
+}
+
+function loader (source) {
+  this.cacheable && this.cacheable()
+
+  const callback = this.async()
+  const params = {
+    loaderQuery: loaderUtils.parseQuery(this.query),
+    resourceQuery: loaderUtils.parseQuery(this.resourceQuery),
+    resourcePath: this.resourcePath
+  }
+  const type = params.loaderQuery.type || 'we'
+  const promise = partedLoader(type, this, params, source)
+
+  promise.then(result => {
+    if (type === 'style' || type === 'css' ||
+      type === 'html' || type === 'tpl' || type === 'template') {
+      result = 'module.exports=' + result
+    }
+    callback(null, result)
+  }).catch(err => {
+    this.emitError(err.toString())
+    callback(err.toString(), '')
+  })
+}
+
+loader.setLogLevel = level => {
+  config.logLevel = level
+}
+
+for (const key in legacy) {
+  loader[key] = legacy[key]
+}
+
+module.exports = loader
diff --git a/src/legacy.js b/src/legacy.js
new file mode 100644
index 0000000..4754970
--- /dev/null
+++ b/src/legacy.js
@@ -0,0 +1,13 @@
+export function useScripter () {
+  warn('useScripter()')
+}
+export function useStyler () {
+  warn('useStyler()')
+}
+export function useTemplater () {
+  warn('useTemplater()')
+}
+
+function warn (method) {
+  console.warn(`\u001b[1;32m[Warn]\u001b[0m: method ${method} in weex-loader is no more necessary`)
+}
diff --git a/src/parser.js b/src/parser.js
new file mode 100644
index 0000000..ac1dd76
--- /dev/null
+++ b/src/parser.js
@@ -0,0 +1,211 @@
+import blocker from 'weex-transformer/lib/blocker'
+import templater from 'weex-templater'
+import styler from 'weex-styler'
+import scripter from 'weex-scripter'
+
+import md5 from 'md5'
+
+import { transformerVersion } from './config'
+import {
+  MODULE_EXPORTS_REG,
+  REQUIRE_REG,
+  FUNC_START_REG,
+  FUNC_END_REG,
+  getNameByPath,
+  checkFileExist,
+  depHasRequired,
+  stringifyFunction,
+  appendToWarn
+} from './util'
+
+export function parseWeexFile (loader, params, source, deps, elementName) {
+  return new Promise(
+    // separate source into <element>s, <template>, <style>s and <script>s
+    separateBlocks(source, deps || []))
+    // pre-parse non-javascript parts
+    .then(preParseBlocks(loader, params, elementName))
+    // join blocks together and parse as javascript finally
+    .then(parseBlocks(loader, params, elementName))
+}
+
+function separateBlocks (source, deps) {
+  return (resolve, reject) => {
+    blocker.format(source, (err, ret) => {
+      if (err) {
+        reject(err)
+      }
+      else {
+        ret.deps = deps
+        resolve(ret)
+      }
+    })
+  }
+}
+
+function preParseBlocks (loader, params) {
+  return (blocks) => {
+    const { deps, elements, template, styles, scripts, config, data } = blocks
+    const promises = [
+      Promise.resolve(),
+      Promise.resolve(),
+      Promise.resolve(),
+      Promise.resolve(scripts),
+      Promise.resolve(deps),
+      Promise.resolve(config),
+      Promise.resolve(data)
+    ]
+    let content
+    // pre-parse sub elements
+    if (elements) {
+      const elPromises = []
+      Object.keys(elements).forEach(key => {
+        const el = elements[key]
+        elPromises.push(parseWeexFile(loader, params, el.content, deps, el.name))
+      })
+      promises[0] = Promise.all(elPromises)
+    }
+    // pre-parse template
+    if (template) {
+      content = template.content
+      promises[1] = parseTemplate(loader, params, content, deps)
+    }
+    // pre-parse styles
+    if (styles) {
+      content = styles.reduce((pre, cur) => {
+        return pre + '\n' + cur.content
+      }, '')
+      promises[2] = parseStyle(loader, params, content)
+    }
+    return Promise.all(promises)
+  }
+}
+
+function parseBlocks (loader, params, elementName) {
+  return (results) => {
+    const elements = results[0] || []
+    const template = results[1]
+    const style = results[2]
+    const scripts = results[3]
+    const deps = results[4] || []
+    const configResult = results[5]
+    const dataResult = results[6]
+
+    let content = ''
+    let config = {}
+    let data
+
+    if (scripts) {
+      content += scripts.reduce((pre, cur) => {
+        return pre + '\n;' + cur.content
+      }, '')
+    }
+
+    let requireContent = ''
+    if (deps.length) {
+      requireContent += deps.map(dep =>
+        depHasRequired(content, dep) ? 'require("' + dep + '");' : ''
+      ).join('\n')
+      content = requireContent + '\n' + content
+    }
+
+    if (template) {
+      content += '\n;module.exports.template = module.exports.template || {}' +
+        '\n;Object.assign(module.exports.template, ' + template + ')'
+    }
+
+    if (style) {
+      content += '\n;module.exports.style = module.exports.style || {}' +
+        '\n;Object.assign(module.exports.style, ' + style + ')'
+    }
+
+    if (configResult) {
+      config = new Function('return ' + configResult.content.replace(/\n/g, ''))()
+    }
+    config.transformerVersion = transformerVersion
+    config = JSON.stringify(config, null, 2)
+
+    if (dataResult) {
+      data = new Function('return ' + dataResult.content.replace(/\n/g, ''))()
+      data = JSON.stringify(data, null, 2)
+    }
+
+    return parseScript(loader, params, content, { config, data, elementName, elements })
+  }
+}
+
+export function parseTemplate (loader, params, source, deps) {
+  return new Promise((resolve, reject) => {
+    templater.parse(source, (err, obj) => {
+      if (err) {
+        reject(err)
+      }
+      else {
+        appendToWarn(loader, obj.log)
+        // push valid obj.deps to deps
+        if (deps && obj.deps) {
+          obj.deps.map(
+            dep => checkFileExist(dep, params.resourcePath)
+          ).forEach(dep => {
+            if (dep) {
+              deps.push(dep)
+            }
+          })
+        }
+        // parse json to string and treat function specially
+        let target = JSON.stringify(obj.jsonTemplate, stringifyFunction, '  ')
+        target = target.replace(FUNC_START_REG, '').replace(FUNC_END_REG, '')
+        resolve(target)
+      }
+    })
+  })
+}
+
+export function parseStyle (loader, params, source) {
+  return new Promise((resolve, reject) => {
+    styler.parse(source, (err, obj) => {
+      if (err) {
+        reject(err)
+      }
+      else {
+        appendToWarn(loader, obj.log)
+        resolve(JSON.stringify(obj.jsonStyle, null, 2))
+      }
+    })
+  })
+}
+
+export function parseScript (loader, params, source, env) {
+  const { config, data, elementName, elements } = env
+
+  // the entry component has a special resource query and not a sub element tag
+  const isEntry = params.resourceQuery.entry === true && !elementName
+
+  // resolve component name
+  const name = isEntry
+    ? md5(source)
+    : (elementName || params.resourceQuery.name || getNameByPath(params.resourcePath))
+
+  // fix data option from an object to a function
+  let target = scripter.fix(source)
+
+  // wrap with __weex_define__(name, [], (r, e, m) {...})
+  target = target
+      .replace(MODULE_EXPORTS_REG, '__weex_module__.exports')
+      .replace(REQUIRE_REG, '__weex_require__($1$2$1)')
+  target = ';__weex_define__("@weex-component/' + name + '", [], ' +
+      'function(__weex_require__, __weex_exports__, __weex_module__)' +
+      '{\n' + target + '\n})'
+
+  // append __weex_bootstrap__ for entry component
+  if (isEntry) {
+    target += '\n;__weex_bootstrap__("@weex-component/' + name + '", ' +
+        String(config) + ',' +
+        String(data) + ')'
+  }
+
+  // join with elements deps
+  target = (elements || []).concat(target).join(';\n\n')
+
+  return Promise.resolve(target)
+}
+
diff --git a/src/util.js b/src/util.js
new file mode 100644
index 0000000..3417388
--- /dev/null
+++ b/src/util.js
@@ -0,0 +1,42 @@
+import fs from 'fs'
+import path from 'path'
+
+import * as config from './config'
+
+export const MODULE_EXPORTS_REG = /module\.exports/g
+export const REQUIRE_REG = /require\((["'])(@weex\-module\/[^\)\1]+)\1\)/g
+
+export function getNameByPath (filepath) {
+  return path.basename(filepath).replace(/\..*$/, '')
+}
+
+export const FUNC_START = '#####FUN_S#####'
+export const FUNC_START_REG = new RegExp('["\']' + FUNC_START, 'g')
+export const FUNC_END = '#####FUN_E#####'
+export const FUNC_END_REG = new RegExp(FUNC_END + '["\']', 'g')
+
+export function stringifyFunction (key, value) {
+  if (typeof value === 'function') {
+    return FUNC_START + value.toString() + '#####FUN_E#####'
+  }
+  return value
+}
+
+export function appendToWarn (loader, logs) {
+  if (config.logLevel && logs && logs.length) {
+    logs.forEach(log => {
+      loader.emitWarning(log.reason + '\t@' + log.line + ':' + log.column)
+    })
+  }
+}
+
+export function checkFileExist (name, resourcePath) {
+  const context = path.dirname(resourcePath)
+  const filename = './' + name + '.we'
+  const filepath = path.resolve(context, filename)
+  return fs.existsSync(filepath) ? filename : null
+}
+
+export function depHasRequired (content, dep) {
+  return !content.match(new RegExp('require\\(["\']./' + path.basename(dep) + '(.we)?["\']\\)', 'g'))
+}
diff --git a/test/webpack.config.js b/test/webpack.config.js
index 6f306fe..4833d07 100644
--- a/test/webpack.config.js
+++ b/test/webpack.config.js
@@ -1,6 +1,4 @@
-var path = require('path');
-var webpack = require('webpack');
-var loader = require('../index.js');
+var path = require('path')
 
 module.exports = {
   entry: {
@@ -42,4 +40,4 @@
   resolveLoader: {
     modulesDirectories: ['./', './node_modules']
   }
-};
+}
