2012-03-10 20:11:23 +08:00
# modules-webpack
As developer you want to reuse existing code.
2012-04-08 03:36:55 +08:00
As with node.js and web all files are already in the same language, but it is extra work to use your code with the node.js module system and the browser.
2012-04-03 22:26:08 +08:00
2012-03-10 20:11:23 +08:00
The goal of `webpack` is to bundle CommonJs modules into javascript files which can be loaded by `<script>` -tags.
2012-05-01 12:14:17 +08:00
Simply concatenating all required files has a disadvantage: many code to download (and execute) on page load.
2012-03-11 20:44:38 +08:00
Therefore `webpack` uses the `require.ensure` function ([CommonJs/Modules/Async/A](http://wiki.commonjs.org/wiki/Modules/Async/A)) to split your code automatically into multiple bundles which are loaded on demand.
2012-04-08 03:36:55 +08:00
This happens mostly transparent to the developer.
Dependencies are resolved for you.
2012-05-01 12:14:17 +08:00
The result is a smaller initial code download which results in faster page load.
2012-03-10 20:11:23 +08:00
2012-04-08 03:36:55 +08:00
Another common thing in web development is that some files have to be preprocessed before send to the client (ex. template files).
This introduce more complexity to the compile step.
`webpack` supports loaders which process files before including them.
You as developer can use such files like any other module.
2012-05-03 06:11:08 +08:00
[](http://travis-ci.org/sokra/modules-webpack)
2012-03-10 20:11:23 +08:00
**TL;DR**
2012-03-11 20:44:38 +08:00
* bundle CommonJs modules for browser
* reuse server-side code (node.js) on client-side
2012-04-03 22:26:08 +08:00
* create multiple files which are loaded on demand (faster page load in big webapps or on mobile connections)
* dependencies managed for you, on compile time (no resolution on runtime needed)
2012-04-08 03:36:55 +08:00
* loaders can preprocess files
2012-03-20 02:59:38 +08:00
## Goals
2012-04-03 22:26:08 +08:00
* make node.js and browser development similar
* minimize code size (mobile connection)
2012-05-01 12:14:17 +08:00
* minimize code size on initial download
2012-03-20 02:59:38 +08:00
* download code only on demand
2012-04-03 22:26:08 +08:00
* require minimal configuration, but offer a maximum
2012-03-20 02:59:38 +08:00
* load polyfills for node-specific things if used
2012-05-01 12:14:17 +08:00
* offer replacements for node buildin libraries
2012-03-10 20:11:23 +08:00
2012-04-08 18:53:54 +08:00
# Example
See [example webapp ](http://sokra.github.com/modules-webpack-example/ ).
## Simple Example
2012-03-10 20:11:23 +08:00
``` javascript
// a.js
var b = require("./b");
b.stuff("It works");
// b.js
exports.stuff = function(text) {
console.log(text);
}
```
2012-04-08 03:36:55 +08:00
are compiled to (reformatted)
2012-03-10 20:11:23 +08:00
``` javascript
(/* small webpack header */)
({
0: function(module, exports, require) {
var b = require(1);
b.stuff("It works");
},
1: function(module, exports, require) {
exports.stuff = function(text) {
2012-04-08 03:36:55 +08:00
console.log(text)
2012-03-10 20:11:23 +08:00
}
}
})
```
2012-03-11 20:44:38 +08:00
## Code Splitting
### Example
``` javascript
var a = require("a");
var b = require("b");
require.ensure(["c"], function(require) {
require("b").xyz();
var d = require("d");
});
```
```
File 1: web.js
2012-03-20 02:59:38 +08:00
- code of that file
2012-03-11 20:44:38 +08:00
- code of module a and dependencies
- code of module b and dependencies
File 2: 1.web.js
- code of module c and dependencies (but code is not used)
- code of module d and dependencies
```
2012-04-03 22:26:08 +08:00
Initially only `web.js` is included (and loaded) by your application.
`1.web.js` is loaded when the call to `require.ensure` happens.
After the second bundle (`1.web.js`) is loaded, the callback function will be invoked.
2012-04-05 20:59:01 +08:00
See [details ](/sokra/modules-webpack/tree/master/examples/code-splitting ) for exact output.
See [more examples ](/sokra/modules-webpack/tree/master/examples ).
2012-03-11 20:44:38 +08:00
2012-03-20 02:59:38 +08:00
## Reusing node.js code
`webpack` was built to support most of the code that was coded for node.js environment.
For example this works out of the box:
* `require("./templates/" + templateName);`
* `require(condition ? "moduleA" : condition2 ? "moduleB" : "./localStuff");`
* `function xyz(require) { require("text"); } xyz(function(a) { console.log(a) });`
* `var r = require; r("./file");` with warning
* `function xyz(require) { require("./file"); } xyz(require);` with warning
* `try { require("missingModule"); } catch(e) { console.log("missing") }` with warning
* `var require = function(a) { console.log(a) }; require("text");`
* `if(condition) require("optionalModule")` with warning if missing
2012-03-10 20:11:23 +08:00
## Browser replacements
Somethings it happens that browsers require other code than node.js do.
`webpack` allow module developers to specify replacements which are used in the compile process of `webpack` .
Modules in `web_modules` replace modules in `node_modules` .
2012-03-27 06:34:38 +08:00
`filename.web.js` replaces `filename.js` when required without file extension.
2012-03-10 20:11:23 +08:00
2012-03-21 20:41:47 +08:00
in options: `alias: { "http": "http-browserify" }`
in shell: `--alias http=http-browserify`
2012-03-10 20:11:23 +08:00
2012-04-08 03:36:55 +08:00
## Contexts
2012-03-12 04:37:18 +08:00
2012-03-21 20:41:47 +08:00
If the required module is not known while compile time we get into a problem.
2012-03-12 04:37:18 +08:00
A solution is the method `require.context` which takes a directory as parameter
and returns a function which behaves like the `require` function issued from a file
in this directory (but only if used for files in that directory).
2012-03-21 20:41:47 +08:00
The whole directory is included while compiling, so you have access to all files in it.
2012-03-12 04:37:18 +08:00
### Example
We have a directory full of templates, which are compiled javascript files.
A template should be loaded by template name.
``` javascript
var requireTemplate = require.context("./templates");
function getTemplate(templateName) {
return requireTemplate("./" + templateName);
}
```
In addition to that `webpack` uses the `require.context` function automatically
2012-05-01 12:14:17 +08:00
if you use variables or other not parse-able things in the `require` function.
2012-03-12 04:37:18 +08:00
That means the following code behaves like the above:
``` javascript
function getTemplate(templateName) {
return require("./templates/" + templateName);
}
// is compiled like: return require.context("./templates")("./"+templateName)
2012-03-21 20:41:47 +08:00
// which compiles to: return require(123)("./"+templateName)
2012-03-12 04:37:18 +08:00
```
2012-04-03 22:26:08 +08:00
See [details ](/sokra/modules-webpack/tree/master/examples/require.context ) for complete example.
2012-03-12 04:37:18 +08:00
2012-03-14 23:33:46 +08:00
When try to store the `require` function in another variable or try to pass it as parameter,
2012-03-21 20:41:47 +08:00
`webpack` convert it to a `require.context(".")` to be compatible.
2012-03-14 23:33:46 +08:00
There is a warning emitted in this case.
2012-03-12 04:37:18 +08:00
*Warning: The complete code in the directory are included. So use it carefully.*
2012-03-27 10:23:11 +08:00
## Loaders
You can use a syntax for loader plugins to preprocess files before emitting javascript code to the bundle.
The following example loads the raw content of a file with the `raw` loader:
``` javascript
var content = require("raw!./file.txt");
```
2012-05-01 12:14:17 +08:00
Multiple loader plugins can be prepended by separating them with `!` .
2012-03-27 10:23:11 +08:00
The loader plugins are resolved like in normal `require` call but with different default extension.
The `raw` loader plugin is looked up at modules `raw-webpack-web-loader` , `raw-webpack-loader` , `raw-web-loader` , `raw-loader` , `raw`
and the following files are looked up: `index.webpack-web-loader.js` , `index.webpack-loader.js` , `index.web-loader.js` , `index.loader.js` , `index` , `index.js` .
Note that the `web-` versions are omitted if loaders are used in node.js.
2012-04-03 22:26:08 +08:00
See [example ](/sokra/modules-webpack/tree/master/examples/loader ).
2012-03-27 10:23:11 +08:00
2012-04-08 03:36:55 +08:00
The following loaders are included in webpack:
2012-03-27 10:23:11 +08:00
2012-05-12 23:02:20 +08:00
* [`raw` ](https://github.com/sokra/webpack-raw-loader ): Loads raw content of a file (as utf-8)
* [`json` ](https://github.com/sokra/webpack-json-loader ) (default at `.json` ): Loads file as JSON
* [`jade` ](https://github.com/sokra/webpack-jade-loader ) (default at `.jade` ): Loads jade template and returns a function
* [`coffee` ](https://github.com/sokra/webpack-coffee-loader ) (default at `.coffee` ): Loads coffee-script like javascript
* [`css` ](https://github.com/sokra/webpack-css-loader ): Loads css file with resolved imports and returns css code
* [`less` ](https://github.com/sokra/webpack-less-loader ): Loads and compiles a less file and returns css code
* [`val` ](https://github.com/sokra/webpack-val-loader ): Excutes code as module and consider exports as javascript code
* [`bundle` ](https://github.com/sokra/webpack-bundle-loader ): Wraps request in a `require.ensure` block
* [`file` ](https://github.com/sokra/webpack-file-loader ): Emits the file into the output folder and returns the (relative) url (`file/{ext}` for some extensions)
* [`style` ](https://github.com/sokra/webpack-style-loader ): Adds result of javascript execution to DOM
* [`script` ](https://github.com/sokra/webpack-script-loader ): Executes a javascript file once in global context (like in script tag), requires are not parsed. Use this to include a library. ex. `require("script!./jquery.min.js")` . This is synchron, so the `$` variable is available after require.
2012-05-04 22:42:38 +08:00
* (`.css` defaults to `style!css` loader, so all css rules are added to DOM)
* (`.less` defaults to `style!css!val!less` loader, so all less rules are added to DOM)
See docs for loader in github repo of the loader.
2012-03-27 10:23:11 +08:00
## TL;DR
``` javascript
var a = require("a"); // require modules
var b = require("./b"); // and files
// like in node.js
// polyfill require method to use the new members in node.js too
require = require("webpack/require-polyfill")(require.valueOf());
// create a lazy loaded bundle
require.ensure([], function(require) {
var c = require("c");
// require json
var packageJson = require("../package.json");
// or jade templates, coffee-script, and many more with own loaders
var result = require("./template.jade")(require("./dataFrom.coffee"));
// files are compiled to javascript and packed into the bundle...
});
```
... and compile from the shell with:
```
webpack lib/input.js js/output.js
```
try `--min` to minimize with `uglify-js` .
2012-03-10 20:11:23 +08:00
## Limitations
### `require`-function
2012-04-03 22:26:08 +08:00
* `require` should not be overwritten, except from polyfill
2012-03-12 04:37:18 +08:00
* `require.ensure` should not be overwritten or called indirect
* `require.context` should not be overwritten or called indirect
* the argument to `require.context` should be a literal or addition of multiple literals
2012-03-14 23:33:46 +08:00
* An indirect call of `require` should access a file in current directory: This throws an exception: `var r = require; r("../file");`
2012-03-21 20:41:47 +08:00
The following cases could result in **too much code** in result file if used wrong:
2012-03-14 23:33:46 +08:00
2012-04-03 22:26:08 +08:00
* indirect call of `require` : `var r = require; r("./file");` . It includes the whole directory.
2012-03-14 23:33:46 +08:00
* `require.context` . It includes the whole directory.
2012-04-03 22:26:08 +08:00
* expressions in require arguments: `require(variable)` . It includes the whole directory. (except from `?:` -operator `require(condition ? "a" : "b")` )
* the function passed to `require.ensure` is not inlined in the call. Only requires in inlined function move into the second bundle.
2012-03-14 23:33:46 +08:00
2012-03-10 20:11:23 +08:00
### node.js specific modules
2012-04-03 22:26:08 +08:00
As node.js specific modules like `fs` will not work in browser they are not included (by default) and cause an exception.
2012-03-12 05:16:24 +08:00
You should replace them by own modules if you want to use them.
2012-04-03 22:26:08 +08:00
For some simple modules are replacements included in `webpack` .
2012-03-21 20:41:47 +08:00
Expensive replacements are not needed by everyone, so that are not included by default.
You need to specify `--alias [module]=[replacement]` to use them.
2012-04-03 22:26:08 +08:00
A warning saying that some module is missing is emitted in the case you use it without providing a replacement.
Some credit goes to the browserify contributors, you can use replacements provided by them.
2012-03-10 20:11:23 +08:00
2012-03-27 10:45:48 +08:00
Included simple replacements:
2012-04-05 20:59:01 +08:00
* `assert` : copy of node.js' version, small change
* `buffer` : copy of node-browserify's version
* `buffer_ieee754` : copy of node-browserify's version
2012-03-27 10:45:48 +08:00
* `child_process` : disabled
* `events` : copy of node.js' version
2012-04-05 20:59:01 +08:00
* `path` : copy of node.js' version
2012-04-08 03:36:55 +08:00
* `punycode` : copy of node.js' version, one line removed (http://mths.be/punycode by @mathias )
2012-04-05 20:59:01 +08:00
* `querystring` : copy of node.js' version
* `string_decoder` : copy of node.js' version
* `url` : copy of node.js' version
2012-03-27 10:45:48 +08:00
* `util` : copy of node.js' version
Here is a list of possible useful replacements: (intentionally not by default)
2012-03-10 20:11:23 +08:00
2012-03-21 20:41:47 +08:00
* `http=http-browserify`
* `vm=vm-browserify`
* TODO provide some more replacements
2012-03-14 23:33:46 +08:00
2012-03-10 20:11:23 +08:00
## Usage
### Shell
`webpack` offers a command line interface:
after `npm install webpack -g` you can use the `webpack` command
if invoked without arguments it prints a usage:
```
Usage: webpack < options > < input > < output >
Options:
2012-03-16 20:59:19 +08:00
--min Minimize it with uglifyjs [boolean] [default: false]
--filenames Output Filenames Into File [boolean] [default: false]
--options Options JSON File [string]
2012-05-12 22:43:37 +08:00
--public-prefix Path Prefix For JavaScript Loading [string]
2012-03-16 20:59:19 +08:00
--libary Stores the exports into this variable [string]
--colors Output Stats with colors [boolean] [default: false]
--json Output Stats as JSON [boolean] [default: false]
2012-04-08 03:36:55 +08:00
--by-size Sort modules by size in Stats [boolean] [default: false]
--verbose Output dependencies in Stats [boolean] [default: false]
2012-03-16 20:59:19 +08:00
--alias Set a alias name for a module. ex. http=http-browserify [string]
2012-04-08 03:36:55 +08:00
--debug Prints debug info to output files [boolean] [default: false]
2012-05-02 03:33:59 +08:00
--watch Recompiles on changes (except loaders) [boolean] [default: false]
--progress Displays a progress while compiling [boolean] [default: false]
2012-03-10 20:11:23 +08:00
```
### Programmatically Usage
2012-03-11 20:44:38 +08:00
``` javascript
webpack(context, moduleName, [options], callback)
webpack(absoluteModulePath, [options], callback)
```
2012-03-10 20:11:23 +08:00
#### `options`
2012-04-03 22:26:08 +08:00
You can also save this options object in a JSON file and use it with the shell command.
2012-03-10 20:11:23 +08:00
2012-05-12 22:43:37 +08:00
``` javascript
{
output: "out/file.js", // required
// output file to initial chunk
outputDirectory: "out/dir", // default: extract directory from output
// output directory for file
outputPostfix: ".chunk.js", // default: "." + output
// postfix appended to id of lazy loaded chunks
ouputJsonpFunction: "myJsonp", // default: "webpackJsonp"
// jsonp function used for lazy loaded chunks,
// should be unique for all instances of webpack in a page
publicPrefix: "http://static.url.com/asserts/", // default: ""
// path to create the chunks url relative to page
// deprecated name: scriptSrcPrefix
libary: "mylib", // default: null
// store the exports of the entrace module in a variable of this name
// use this to create a libary from webpack
includeFilenames: true, // default: false
// include the filename of each module as comment before the module
watch: true, // default: false
// recompiles on changes on module and contexts (currently not on loaders)
watchDelay: 1000, // default: 200
// delay in ms before recompile after the last file change
events: new EventEmitter(), // default: new EventEmitter()
// EventEmitter on which events for the compile process are fired
// events: "bundle", "module", "context", "task", "task-end"
parse: {
// options for parsing
overwrites: {
"myglobal": "modulename-of-myglobal"
// defaults: (defaults are also included if you define your own)
// process: "__webpack_process",
// module: "__webpack_module",
// console: "__webpack_console",
// global: "__webpack_global",
// Buffer: "buffer+.Buffer" // -> require("buffer").Buffer
// "__dirname": "__webpack_dirname",
// "__filename": "__webpack_filename"
},
// inject a free variable named "myglobal" which are required as
// require("modulename-of-myglobal")
// to each module which uses "myglobal"
}
resolve: {
// options for resolving
paths: ["/my/absolute/dirname"],
// default: (defaults are also included if you define your own)
// [".../buildin",
// ".../buildin/web_modules", ".../buildin/name_modules",
// ".../node_modules"]
// search paths for modules
alias: {
"old-module": "new-module"
},
// replace a module
extensions: ["", ".www.js", ".js"],
// defaults: (defaults are NOT included if you define your own)
// ["", ".webpack.js", ".web.js", ".js"]
// postfixes for files to try
loaderExtensions: [".loader.js", ".www-loader.js", "", ".js"],
// defaults: (defaults are NOT included if you define your own)
// [".webpack-web-loader.js", ".webpack-loader.js",
// ".web-loader.js", ".loader.js", "", ".js"]
// postfixes for loaders to try
loaderPostfixes: ["-loader", "-xyz", ""],
// defaults: (defaults are NOT included if you define your own)
// ["-webpack-web-loader", "-webpack-loader",
// "-web-loader", "-loader", ""]
// postfixes for loader modules to try
loaders: [{test: /\.generator.js/, loader: "val"}],
// default: (defaults are also included if you define your own)
// [{test: /\.coffee$/, loader: "coffee"},
// {test: /\.json$/, loader: "json"},
// {test: /\.jade$/, loader: "jade"},
// {test: /\.css$/, loader: "style!css"},
// {test: /\.less$/, loader: "style!css!val!less"}]
// automatically use loaders if filename match RegExp
// and no loader is specified
}
}
```
2012-04-03 22:26:08 +08:00
2012-03-10 20:11:23 +08:00
#### `callback`
2012-03-12 05:16:24 +08:00
2012-03-10 20:11:23 +08:00
`function(err, source / stats)`
2012-05-12 22:43:37 +08:00
`source` if `options.output` is not set (DEPRECATED)
else `stats` as json:
``` javascript
{
hash: "52bd9213...38d",
chunkCount: 2,
modulesCount: 10,
modulesIncludingDuplicates: 10,
modulesFirstChunk: 3,
fileSizes: {
"output.js": 1234,
"1.output.js": 2345
},
warnings: [ "Some warning" ],
errors: [ "Some error" ],
fileModules: {
"output.js": [
{ id: 0, size: 123, filename: "/home/.../main.js", reasons: [
{ type: "main" }
]},
{ id: 1, size: 234, filename: "...", reasons: [
{ type: "require", // or "context", "async require", "async context"
count: 2,
filename: "/home/.../main.js",
// or dirname: "..." // for type = "context" or "async context"
}
]},
...
],
"1.output.js": [...]
}
}
```
2012-03-10 20:11:23 +08:00
2012-05-01 23:54:19 +08:00
## Bonus features
2012-05-01 23:46:26 +08:00
### File hash
2012-05-12 23:02:20 +08:00
You can use `[hash]` in `publicPrefix` , `output` , `outputDirectory` , `outputPostfix` and in the shell parameters.
2012-05-01 23:46:26 +08:00
`webpack` will replace it with a hash of your files, when writing.
2012-05-02 03:33:59 +08:00
### From shell
Combine the options `--colors --watch --progress` to get a pretty shell compilation.
2012-03-20 02:59:38 +08:00
## Comparison
< table >
< tr >
< th >
Feature
< / th >
< th >
sokra/< br / > modules-< br / > webpack
< / th >
< th >
medikoo/< br / > modules-< br / > webmake
< / th >
< th >
substack/< br / > node-< br / > browserify
< / th >
< / tr >
< tr >
< td >
single bundle
< / td >
< td >
yes
< / td >
< td >
yes
< / td >
< td >
yes
< / td >
< / tr >
< tr >
< td >
multiple bundles, Code Splitting
< / td >
< td >
yes
< / td >
< td >
no
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
indirect require
< code > var r = require; r("./file");< / code >
< / td >
< td >
in directory
< / td >
< td >
include by config option
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
concat in require
< code > require("./fi" + "le")< / code >
< / td >
< td >
yes
< / td >
< td >
yes
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
variables in require (local)
< code > require("./templates/"+template)< / code >
< / td >
< td >
yes, complete directory included
< / td >
< td >
include by config option
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
variables in require (global)
< code > require(moduleName)< / code >
< / td >
< td >
no
< / td >
< td >
include by config option
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
node buildin libs
< code > require("http");< / code >
< / td >
< td >
2012-04-08 03:36:55 +08:00
yes
2012-03-20 02:59:38 +08:00
< / td >
< td >
no
< / td >
< td >
2012-04-08 03:36:55 +08:00
yes
2012-03-20 02:59:38 +08:00
< / td >
< / tr >
< tr >
< td >
< code > process< / code > polyfill
< / td >
< td >
yes, on demand
< / td >
< td >
no
< / td >
< td >
yes, ever
< / td >
< / tr >
< tr >
< td >
< code > module< / code > polyfill
< / td >
< td >
yes, on demand
< / td >
< td >
no
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
< code > require.resolve< / code >
< / td >
< td >
no
< / td >
< td >
no
< / td >
< td >
yes
< / td >
< / tr >
< tr >
< td >
< code > global< / code > to < code > window< / code > mapping
< / td >
< td >
yes
< / td >
< td >
no
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
requirable files
< / td >
< td >
filesystem
< / td >
< td >
directory scope
< / td >
< td >
filesystem
< / td >
< / tr >
< tr >
< td >
different modules with same name
< / td >
< td >
yes
< / td >
< td >
no
< / td >
< td >
yes
< / td >
< / tr >
< tr >
< td >
eliminate duplicate code
< / td >
< td >
2012-03-21 06:32:28 +08:00
no
2012-03-20 02:59:38 +08:00
< / td >
< td >
no
< / td >
< td >
2012-03-21 06:32:28 +08:00
no
2012-03-20 02:59:38 +08:00
< / td >
< / tr >
< tr >
< td >
require JSON
< / td >
< td >
2012-05-01 23:46:26 +08:00
yes
2012-03-20 02:59:38 +08:00
< / td >
< td >
no
< / td >
< td >
no
< / td >
< / tr >
< tr >
< td >
plugins
< / td >
< td >
no
< / td >
< td >
no
< / td >
< td >
yes
< / td >
< / tr >
< tr >
< td >
2012-03-27 06:34:38 +08:00
loaders
< / td >
< td >
2012-05-01 23:46:26 +08:00
yes
2012-03-20 02:59:38 +08:00
< / td >
< td >
no
< / td >
< td >
no
< / td >
2012-03-27 06:34:38 +08:00
< / tr >
< tr >
< td >
compile coffee script
< / td >
< td >
2012-05-01 23:46:26 +08:00
yes
2012-03-27 06:34:38 +08:00
< / td >
< td >
no
< / td >
2012-03-20 02:59:38 +08:00
< td >
yes
< / td >
< / tr >
< tr >
< td >
watch mode
< / td >
< td >
2012-05-08 05:46:59 +08:00
yes
2012-03-20 02:59:38 +08:00
< / td >
< td >
no
< / td >
< td >
yes
< / td >
< / tr >
< tr >
< td >
debug mode
< / td >
< td >
2012-04-08 03:36:55 +08:00
yes
2012-03-20 02:59:38 +08:00
< / td >
< td >
no
< / td >
< td >
yes
< / td >
< / tr >
< tr >
< td >
libaries
< / td >
< td >
on global obj
< / td >
< td >
no
< / td >
< td >
requirable
< / td >
< / tr >
< tr >
< td >
browser replacements
< / td >
< td >
< code > web_modules< / code > and < code > .web.js< / code >
< / td >
< td >
no
< / td >
< td >
by alias config option
< / td >
< / tr >
< tr >
< td >
compiles with (optional) modules missing
< / td >
< td >
yes, emit warnings
< / td >
< td >
no
< / td >
< td >
no
< / td >
< / tr >
< / table >
2012-03-10 20:11:23 +08:00
2012-03-27 06:34:38 +08:00
2012-03-10 20:11:23 +08:00
## Tests
2012-03-12 04:50:55 +08:00
You can run the unit tests with `npm test` .
2012-03-10 20:11:23 +08:00
You can run the browser tests:
```
cd test/browsertests
node build
```
2012-04-08 03:36:55 +08:00
and open `test.html` in browser. There must be several OKs in the file, no FAIL and no RED boxes.
2012-03-10 20:11:23 +08:00
## Contribution
You are welcome to contribute by writing issues or pull requests.
2012-05-08 05:46:59 +08:00
It would be nice if you open source your own loaders or webmodules. :)
2012-03-10 20:11:23 +08:00
2012-03-21 06:28:43 +08:00
You are also welcome to correct any spelling mistakes or any language issues, because my english is not perfect...
## Future plans
* more polyfills for node.js buildin modules, but optional
2012-05-02 01:54:33 +08:00
* `require("webpack/require-polyfill.install")` to install for all modules
2012-03-21 06:28:43 +08:00
* require from protocol `require("http://...")`
2012-05-08 05:46:59 +08:00
* write it into the wiki if you have more ideas...
2012-03-10 20:11:23 +08:00
## License
2012-05-12 23:02:20 +08:00
MIT (http://www.opensource.org/licenses/mit-license.php)
## Dependencies
* [esprima ](http://esprima.org/ )
* [optimist ](https://github.com/substack/node-optimist )
* [uglify-js ](https://github.com/mishoo/UglifyJS )
* [sprintf ](https://github.com/maritz/node-sprintf )