fix some bugs
diff --git a/.gitignore b/.gitignore
index 074de94..81ee3b6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 node_modules
 lib
-test/actual/*.js
\ No newline at end of file
+test/actual/*.js
+*.log
\ No newline at end of file
diff --git a/README.md b/README.md
index afab1e5..d84a10e 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
 ## Feature
 
 0. Can load `.we` file.
-1. Can load parted files(`.js/.css/.html`) via a `src` attribute.
+1. Can load parted files(`.js/.css/.html`) via `src` attribute.
 2. Can specify a custom language to chain any loader.
 3. Can specify name when require `.we` file.
 4. Can write es2015 in script.
@@ -45,42 +45,14 @@
 
 ### How to write parted files
 
-#### write .js/.css/.html anywhere
-
-**main.js as script**
-```javascript
-module.exports = {
-    data: function () {
-      return {
-        text: 'Hello World'
-      }
-    }
-}
-```
-
-**main.css as style**
-```css
-.h1 {
-    font-size: 60px;
-    color: red;
-}
-```
-
-**main.html as template**
-```html
-<div>
-    <text class="h1">{{text}}</text>
-</div>
-```
-
-**main.we**
+**specify `src` attribute**
 ```html
 <template src="./main.html"></template>
 <style src="./main.css"></style>
 <script src="./main.js"></script>
 ```
 
-#### add some custom language for loaders
+### add some custom language for loaders
 
 **append a weex config in webpack config**
 ```javascript
@@ -131,12 +103,12 @@
 <template>
   <div>
     <fooo></fooo>
-    <barr></barr>
+    <baar></baar>
   </div>
 </template>
 
 <script>
-  require('./bar.we?name=barr')
+  require('./bar.we?name=baar')
 </script>
 ```
 
diff --git a/package.json b/package.json
index 70df19e..93cd7cb 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
     "webpack": "~1.13.0"
   },
   "dependencies": {
+    "hash-sum": "^1.0.2",
     "loader-utils": "~0.2.14",
     "md5": "^2.1.0",
     "source-map": "^0.5.6",
diff --git a/src/extract.js b/src/extract.js
index 28485b5..df79ddb 100644
--- a/src/extract.js
+++ b/src/extract.js
@@ -19,13 +19,11 @@
   extractBlocks(source, type)
     .then(result => {
       if (index != null) {
-        return result[index].content
+        result = result[index]
       }
-      else {
-        return result.content
-      }
-    }).then(result => {
-      callback(null, result)
+      return result.content
+    }).then(content => {
+      callback(null, content)
     }).catch(e => {
       callback(e, '')
     })
diff --git a/src/loader.js b/src/loader.js
index 674cd65..0403140 100644
--- a/src/loader.js
+++ b/src/loader.js
@@ -5,6 +5,7 @@
 
 import * as config from './config'
 import * as legacy from './legacy'
+
 import {
   parseFragment
 } from './parser'
@@ -62,6 +63,8 @@
 
   if (type === 'template') {
     loaders = [{
+      name: defaultLoaders.json
+    }, {
       name: defaultLoaders.template
     }]
     if (customLoader) {
@@ -89,6 +92,8 @@
 
   if (type === 'style') {
     loaders = [{
+      name: defaultLoaders.json
+    }, {
       name: defaultLoaders.style
     }]
     if (customLoader) {
@@ -186,7 +191,6 @@
 
 function loader (source) {
   this.cacheable && this.cacheable()
-
   const options = this.options.weex || {}
   const customLang = options.lang || {}
 
@@ -345,10 +349,12 @@
 ` + (
   frag.script.length > 0 ? `
     __weex_script__(__weex_require__, __weex_exports__, __weex_module__)
+    if (__weex_exports__.__esModule && __weex_exports__.default) {
+      __weex_module__.exports = __weex_exports__.default
+    }
 ` : ''
 ) +
 `
-    __weex_module__.exports = __weex_module__.exports || {}
     __weex_module__.exports.template = __weex_template__
 ` + (
   frag.style.length > 0 ? `
diff --git a/src/script.js b/src/script.js
index b0456a5..423bf96 100644
--- a/src/script.js
+++ b/src/script.js
@@ -1,5 +1,5 @@
 import {
-    parseScript
+  parseScript
 } from './parser'
 
 module.exports = function (source) {
@@ -8,27 +8,29 @@
   const callback = this.async()
 
   parseScript(source)
-        .then(({ parsed }) => {
-          let requireList = parsed.match(/require\([^()]+?\)/g)
+    .then(({
+      parsed
+    }) => {
+      let requireList = parsed.match(/require\([^()]+?\)/g)
 
-          if (requireList && requireList.length > 0) {
-            requireList = requireList.filter(str => {
-              if (str.indexOf('@weex-module') < 0) {
-                parsed = parsed.replace(str, '')
-                return true
-              }
-              return false
-            }).join('\n')
+      if (requireList && requireList.length > 0) {
+        requireList = requireList.filter(str => {
+          if (str.indexOf('@weex-module') < 0) {
+            parsed = parsed.replace(str, '')
+            return true
           }
+          return false
+        }).join('\n')
+      }
 
-          const result = `
+      const result = `
 ${requireList || ''}
 module.exports = function(require, exports, module){
-    ${parsed}
+${parsed}
 }
 `
-          callback(null, result)
-        }).catch(e => {
-          callback(e, '')
-        })
+      callback(null, result)
+    }).catch(e => {
+      callback(e, '')
+    })
 }
diff --git a/src/style.js b/src/style.js
index 01de0ca..3ddbe0a 100644
--- a/src/style.js
+++ b/src/style.js
@@ -16,9 +16,7 @@
       if (log && log.length) {
         logWarn(this, log)
       }
-      return `module.exports = ${parsed}\n`
-    }).then(result => {
-      callback(null, result)
+      callback(null, parsed)
     }).catch(e => {
       callback(e, '')
     })
diff --git a/src/template.js b/src/template.js
index 12332cf..aec4fb5 100644
--- a/src/template.js
+++ b/src/template.js
@@ -16,9 +16,7 @@
       if (log && log.length) {
         logWarn(this, log)
       }
-      return `module.exports = ${parsed}\n`
-    }).then(result => {
-      callback(null, result)
+      callback(null, parsed)
     }).catch(e => {
       callback(e, '')
     })
diff --git a/test/expect/k.js b/test/expect/k.js
index 2676b37..fda9399 100644
--- a/test/expect/k.js
+++ b/test/expect/k.js
@@ -1,7 +1,7 @@
 {
   "@weex-component/215a3c96c2c3802f228bf7ceec470c73": {
-    "ready": "function ready() {\n\t    _modal2.default.toast({ 'message': 'ready' });\n\t}",
-    "data": "function data() {\n\t    return {\n\t        hi: 'Hello',\n\t        name: 'Weex'\n\t    };\n\t}",
+    "ready": "function ready() {\n\t        _modal2.default.toast({ 'message': 'ready' });\n\t    }",
+    "data": "function data() {\n\t        return {\n\t            hi: 'Hello',\n\t            name: 'Weex'\n\t        };\n\t    }",
     "template": {
       "type": "div",
       "classList": [
diff --git a/test/npm-debug.log b/test/npm-debug.log
deleted file mode 100644
index cad643e..0000000
--- a/test/npm-debug.log
+++ /dev/null
@@ -1,158 +0,0 @@
-0 info it worked if it ends with ok
-1 verbose cli [ '/Users/terry 1/versions/node/v4.2.2/bin/node',
-1 verbose cli   '/Users/terry/versions/node/v4.2.2/bin/npm',
-1 verbose cli   'install',
-1 verbose cli   'weex-loader',
-1 verbose cli   'babel-loader',
-1 verbose cli   ' ' ]
-2 info using npm@3.9.6
-3 info using node@v4.2.2
-4 silly loadCurrentTree Starting
-5 silly install loadCurrentTree
-6 silly install readLocalPackageData
-7 silly fetchPackageMetaData weex-loader
-8 silly fetchPackageMetaData babel-loader@^6.2.4
-9 silly fetchPackageMetaData
-10 silly fetchNamedPackageData babel-loader
-11 silly mapToRegistry name babel-loader
-12 silly mapToRegistry using default registry
-13 silly mapToRegistry registry http://registry.npmjs.org/
-14 silly mapToRegistry data Result {
-14 silly mapToRegistry   raw: 'babel-loader',
-14 silly mapToRegistry   scope: null,
-14 silly mapToRegistry   name: 'babel-loader',
-14 silly mapToRegistry   rawSpec: '',
-14 silly mapToRegistry   spec: 'latest',
-14 silly mapToRegistry   type: 'tag' }
-15 silly mapToRegistry uri http://registry.npmjs.org/babel-loader
-16 silly fetchNamedPackageData weex-loader
-17 silly mapToRegistry name weex-loader
-18 silly mapToRegistry using default registry
-19 silly mapToRegistry registry http://registry.npmjs.org/
-20 silly mapToRegistry data Result {
-20 silly mapToRegistry   raw: 'weex-loader',
-20 silly mapToRegistry   scope: null,
-20 silly mapToRegistry   name: 'weex-loader',
-20 silly mapToRegistry   rawSpec: '',
-20 silly mapToRegistry   spec: 'latest',
-20 silly mapToRegistry   type: 'tag' }
-21 silly mapToRegistry uri http://registry.npmjs.org/weex-loader
-22 silly fetchDirectoryPackageData null
-23 verbose request uri http://registry.npmjs.org/weex-loader
-24 verbose request no auth needed
-25 info attempt registry request try #1 at 03:16:37
-26 verbose request using bearer token for auth
-27 verbose request id b05395499c9e154f
-28 http request GET http://registry.npmjs.org/weex-loader
-29 verbose request uri http://registry.npmjs.org/babel-loader
-30 verbose request no auth needed
-31 info attempt registry request try #1 at 03:16:37
-32 verbose request using bearer token for auth
-33 verbose etag "EW23D9MKRNP2807DDKRUKPXG"
-34 http request GET http://registry.npmjs.org/babel-loader
-35 http 200 http://registry.npmjs.org/weex-loader
-36 verbose headers { server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
-36 verbose headers   etag: '"84NTPFZCZIPAGB6NSL28IXNOE"',
-36 verbose headers   'content-type': 'application/json',
-36 verbose headers   'content-encoding': 'gzip',
-36 verbose headers   'cache-control': 'max-age=300',
-36 verbose headers   'transfer-encoding': 'chunked',
-36 verbose headers   'accept-ranges': 'bytes',
-36 verbose headers   date: 'Sat, 09 Jul 2016 19:13:18 GMT',
-36 verbose headers   via: '1.1 varnish',
-36 verbose headers   connection: 'keep-alive',
-36 verbose headers   'x-served-by': 'cache-lcy1123-LCY',
-36 verbose headers   'x-cache': 'MISS',
-36 verbose headers   'x-cache-hits': '0',
-36 verbose headers   'x-timer': 'S1468091598.000096,VS0,VE356',
-36 verbose headers   vary: 'Accept-Encoding' }
-37 silly get cb [ 200,
-37 silly get   { server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
-37 silly get     etag: '"84NTPFZCZIPAGB6NSL28IXNOE"',
-37 silly get     'content-type': 'application/json',
-37 silly get     'content-encoding': 'gzip',
-37 silly get     'cache-control': 'max-age=300',
-37 silly get     'transfer-encoding': 'chunked',
-37 silly get     'accept-ranges': 'bytes',
-37 silly get     date: 'Sat, 09 Jul 2016 19:13:18 GMT',
-37 silly get     via: '1.1 varnish',
-37 silly get     connection: 'keep-alive',
-37 silly get     'x-served-by': 'cache-lcy1123-LCY',
-37 silly get     'x-cache': 'MISS',
-37 silly get     'x-cache-hits': '0',
-37 silly get     'x-timer': 'S1468091598.000096,VS0,VE356',
-37 silly get     vary: 'Accept-Encoding' } ]
-38 verbose get saving weex-loader to /Users/terry/.npm/registry.npmjs.org/weex-loader/.cache.json
-39 verbose correctMkdir /Users/terry/.npm correctMkdir not in flight; initializing
-40 http 200 http://registry.npmjs.org/babel-loader
-41 verbose headers { server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
-41 verbose headers   etag: '"CN9KCPC8USQ6FOZKEY58UCARS"',
-41 verbose headers   'content-type': 'application/json',
-41 verbose headers   'content-encoding': 'gzip',
-41 verbose headers   'cache-control': 'max-age=300',
-41 verbose headers   'transfer-encoding': 'chunked',
-41 verbose headers   'accept-ranges': 'bytes',
-41 verbose headers   date: 'Sat, 09 Jul 2016 19:13:18 GMT',
-41 verbose headers   via: '1.1 varnish',
-41 verbose headers   connection: 'keep-alive',
-41 verbose headers   'x-served-by': 'cache-lcy1129-LCY',
-41 verbose headers   'x-cache': 'MISS',
-41 verbose headers   'x-cache-hits': '0',
-41 verbose headers   'x-timer': 'S1468091597.995738,VS0,VE698',
-41 verbose headers   vary: 'Accept-Encoding' }
-42 silly get cb [ 200,
-42 silly get   { server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
-42 silly get     etag: '"CN9KCPC8USQ6FOZKEY58UCARS"',
-42 silly get     'content-type': 'application/json',
-42 silly get     'content-encoding': 'gzip',
-42 silly get     'cache-control': 'max-age=300',
-42 silly get     'transfer-encoding': 'chunked',
-42 silly get     'accept-ranges': 'bytes',
-42 silly get     date: 'Sat, 09 Jul 2016 19:13:18 GMT',
-42 silly get     via: '1.1 varnish',
-42 silly get     connection: 'keep-alive',
-42 silly get     'x-served-by': 'cache-lcy1129-LCY',
-42 silly get     'x-cache': 'MISS',
-42 silly get     'x-cache-hits': '0',
-42 silly get     'x-timer': 'S1468091597.995738,VS0,VE698',
-42 silly get     vary: 'Accept-Encoding' } ]
-43 verbose get saving babel-loader to /Users/terry/.npm/registry.npmjs.org/babel-loader/.cache.json
-44 verbose correctMkdir /Users/terry/.npm correctMkdir not in flight; initializing
-45 silly install normalizeTree
-46 silly loadCurrentTree Finishing
-47 silly loadIdealTree Starting
-48 silly install loadIdealTree
-49 silly cloneCurrentTree Starting
-50 silly install cloneCurrentTreeToIdealTree
-51 silly cloneCurrentTree Finishing
-52 silly loadShrinkwrap Starting
-53 silly install loadShrinkwrap
-54 silly loadShrinkwrap Finishing
-55 silly loadAllDepsIntoIdealTree Starting
-56 silly install loadAllDepsIntoIdealTree
-57 silly rollbackFailedOptional Starting
-58 silly rollbackFailedOptional Finishing
-59 silly runTopLevelLifecycles Starting
-60 silly runTopLevelLifecycles Finishing
-61 silly install printInstalled
-62 verbose stack Error: Refusing to install weex-loader as a dependency of itself
-62 verbose stack     at checkSelf (/Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/lib/install/validate-args.js:53:14)
-62 verbose stack     at Array.<anonymous> (/Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/node_modules/slide/lib/bind-actor.js:15:8)
-62 verbose stack     at LOOP (/Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/node_modules/slide/lib/chain.js:15:14)
-62 verbose stack     at chain (/Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/node_modules/slide/lib/chain.js:20:5)
-62 verbose stack     at /Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/lib/install/validate-args.js:16:5
-62 verbose stack     at /Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/node_modules/slide/lib/async-map.js:52:35
-62 verbose stack     at Array.forEach (native)
-62 verbose stack     at /Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/node_modules/slide/lib/async-map.js:52:11
-62 verbose stack     at Array.forEach (native)
-62 verbose stack     at asyncMap (/Users/terry 1/versions/node/v4.2.2/lib/node_modules/npm/node_modules/slide/lib/async-map.js:51:8)
-63 verbose cwd /Users/terry 1/Develop/taobao/weex/toolchain/weex-loader/test
-64 error Darwin 15.0.0
-65 error argv "/Users/terry 1/versions/node/v4.2.2/bin/node" "/Users/terry/versions/node/v4.2.2/bin/npm" "install" "weex-loader" "babel-loader" " "
-66 error node v4.2.2
-67 error npm  v3.9.6
-68 error code ENOSELF
-69 error Refusing to install weex-loader as a dependency of itself
-70 error If you need help, you may report this error at:
-70 error     <https://github.com/npm/npm/issues>
-71 verbose exit [ 1, true ]
diff --git a/test/spec/k.we b/test/spec/k.we
index c07c5ba..de0c0ba 100644
--- a/test/spec/k.we
+++ b/test/spec/k.we
@@ -31,14 +31,16 @@
 <script>
 import modal from '@weex-module/modal'
 
-export function ready() {
-    modal.toast({'message': 'ready'})
-}
+export default {
+    ready() {
+        modal.toast({'message': 'ready'})
+    },
 
-export function data() {
-    return {
-        hi: 'Hello',
-        name: 'Weex'
+    data() {
+        return {
+            hi: 'Hello',
+            name: 'Weex'
+        }
     }
 }
 </script>
\ No newline at end of file