mirror of https://github.com/webpack/webpack.git
Refactored everything for 0.9
This commit is contained in:
parent
4e42a40595
commit
ee01837d66
713
README.md
713
README.md
|
@ -1,663 +1,85 @@
|
|||
[](http://webpack.github.com)
|
||||
|
||||
As developer you want to reuse existing code.
|
||||
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.
|
||||
[documentation](https://github.com/webpack/docs/wiki)
|
||||
|
||||
The goal of `webpack` is to bundle CommonJs (and AMD) modules into javascript files which can be loaded by `<script>`-tags.
|
||||
Simply concatenating all required files has a disadvantage: many code to download (and execute) on page load.
|
||||
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.
|
||||
This happens mostly transparent to the developer.
|
||||
Dependencies are resolved for you.
|
||||
The result is a smaller initial code download which results in faster page load.
|
||||
# Introduction
|
||||
|
||||
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.
|
||||
webpack is a bundler for modules. The main purpose is to bundle javascript files for useage in browser.
|
||||
|
||||
**TL;DR**
|
||||
|
||||
* bundle [CommonJs](/webpack/webpack/tree/master/examples/commonjs/) and/or [AMD](/webpack/webpack/tree/master/examples/mixed/) modules for browser
|
||||
* reuse server-side code (node.js) on client-side
|
||||
* 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)
|
||||
* loaders can preprocess files
|
||||
* bundles CommonJs and/or AMD modules. (even combined)
|
||||
* can create a single bundle or a bunch of chunks loaded on demand, to reduce initial loading time.
|
||||
* dependencies are resolved while compiling, this makes the runtime very small
|
||||
* loader can preprocess files while compiling, i. e. coffee-script to javascript
|
||||
|
||||
## Quick start guide
|
||||
|
||||
``` javascript
|
||||
var moduleA = require("module/file");
|
||||
var moduleB = require("./relativeFile");
|
||||
var moduleC = require("../stuff/cup.coffee");
|
||||
function getTemplate(name) {
|
||||
return require("./templates/" + name + ".jade");
|
||||
}
|
||||
require("bootstrap/less/bootstrap.less");
|
||||
```
|
||||
|
||||
``` shell
|
||||
npm install webpack -g
|
||||
webpack lib/yourEntryModule.js output/bundle.js
|
||||
```
|
||||
|
||||
## Goals
|
||||
|
||||
* make node.js and browser development similar
|
||||
* minimize code size (mobile connection)
|
||||
* minimize code size on initial download
|
||||
* download code only on demand
|
||||
* require minimal configuration, but offer a maximum
|
||||
* load polyfills for node-specific things if used
|
||||
* offer replacements for node buildin libraries
|
||||
Check the [documentation](https://github.com/webpack/docs/wiki) if you want to know more...
|
||||
|
||||
# Examples
|
||||
|
||||
See [example webapp](http://webpack.github.com/example-app/).
|
||||
Take a look at the `examples` folder.
|
||||
|
||||
More [examples](https://github.com/webpack/webpack/tree/master/examples).
|
||||
# Features
|
||||
|
||||
## Simple Example
|
||||
* loaders are chainable
|
||||
* loaders run in node.js and can do a bunch of stuff
|
||||
* option to name your file with a hash of the content
|
||||
* watch mode
|
||||
* plugin system, extend webpack or build a complete different compiler
|
||||
* interfaces
|
||||
* CLI with arguments
|
||||
* CLI with config file, arguments still possible
|
||||
* usable as library from node.js
|
||||
* usable as grunt plugin
|
||||
* browser replacements
|
||||
* comes with browser replacements for some node.js modules
|
||||
* see also
|
||||
* [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware)
|
||||
* [webpack-dev-server](https://github.com/webpack/webpack-dev-server)
|
||||
* [enhanced-resolve](https://github.com/webpack/enhanced-resolve) and
|
||||
* [enhanced-require](https://github.com/webpack/enhanced-require)
|
||||
|
||||
## A small example what's possible
|
||||
|
||||
``` javascript
|
||||
// a.js
|
||||
var b = require("./b");
|
||||
b.stuff("It works");
|
||||
|
||||
// b.js
|
||||
exports.stuff = function(text) {
|
||||
console.log(text);
|
||||
}
|
||||
```
|
||||
|
||||
are compiled to (reformatted)
|
||||
|
||||
``` 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) {
|
||||
console.log(text)
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## Code Splitting
|
||||
|
||||
### Example
|
||||
|
||||
``` javascript
|
||||
var a = require("a");
|
||||
var b = require("b");
|
||||
require.ensure(["c"], function(require) {
|
||||
require("b").xyz();
|
||||
var d = require("d");
|
||||
var commonjs = require("./commonjs");
|
||||
define(["amd-module", "./file"], function(amdModule, file) {
|
||||
require(["big-module/big/file"], function(big) {
|
||||
// AMD require acts as split point
|
||||
// and "big-module/big/file" is only downloaded when requested
|
||||
var stuff = require("../my/stuff");
|
||||
// dependencies automatically goes in chunk too
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
```
|
||||
File 1: web.js
|
||||
- code of that file
|
||||
- code of module a and dependencies
|
||||
- code of module b and dependencies
|
||||
require("coffee!./cup.coffee");
|
||||
// The loader syntax allows to proprocess files
|
||||
// for common stuff you can bind RegExps to loaders
|
||||
// if you also add ".coffee" to the default extensions
|
||||
// you can write:
|
||||
require("./cup");
|
||||
|
||||
File 2: 1.web.js
|
||||
- code of module c and dependencies (but code is not used)
|
||||
- code of module d and dependencies
|
||||
```
|
||||
function loadTemplate(name) {
|
||||
return require("./templates/" + name ".jade");
|
||||
// dynamic requires are supported
|
||||
// while compiling we figure out what can be requested
|
||||
// here everything in "./templates" that matches /^.*\.jade$/
|
||||
// (can also be in subdirectories)
|
||||
}
|
||||
|
||||
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.
|
||||
require("imports?_=underscore!../loaders/my-ejs-loader!./template.html");
|
||||
// you can chain loaders
|
||||
// you can configure loaders with query parameters
|
||||
// and loaders resolve similar to modules
|
||||
|
||||
See [details](/webpack/webpack/tree/master/examples/code-splitting) for exact output.
|
||||
|
||||
See [more examples](/webpack/webpack/tree/master/examples).
|
||||
|
||||
## 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
|
||||
|
||||
## 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`.
|
||||
`filename.web.js` replaces `filename.js` when required without file extension.
|
||||
|
||||
in options: `alias: { "http": "http-browserify" }`
|
||||
|
||||
in shell: `--alias http=http-browserify`
|
||||
|
||||
## Contexts
|
||||
|
||||
If the required module is not known while compile time we get into a problem.
|
||||
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).
|
||||
The whole directory is included while compiling, so you have access to all files in it.
|
||||
|
||||
### 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);
|
||||
// ...you can combine everything
|
||||
function loadTemplateAsync(name, callback) {
|
||||
require(["bundle?lazy!./templates/" + name + ".jade"], function(templateBundle) {
|
||||
templateBundle(callback);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
In addition to that `webpack` uses the `require.context` function automatically
|
||||
if you use variables or other not parse-able things in the `require` function.
|
||||
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)
|
||||
// which compiles to: return require(123)("./"+templateName)
|
||||
```
|
||||
|
||||
See [details](/webpack/webpack/tree/master/examples/require.context) for complete example.
|
||||
|
||||
When try to store the `require` function in another variable or try to pass it as parameter,
|
||||
`webpack` convert it to a `require.context(".")` to be compatible.
|
||||
There is a warning emitted in this case.
|
||||
|
||||
*Warning: The complete code in the directory are included. So use it carefully.*
|
||||
|
||||
## 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");
|
||||
```
|
||||
|
||||
Multiple loader plugins can be prepended by separating them with `!`.
|
||||
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.
|
||||
|
||||
See [example](/webpack/webpack/tree/master/examples/loader).
|
||||
|
||||
The following loaders are included in webpack:
|
||||
|
||||
* [`raw`](https://github.com/webpack/raw-loader): Loads raw content of a file (as utf-8)
|
||||
* [`json`](https://github.com/webpack/json-loader) (default at `.json`): Loads file as JSON
|
||||
* [`jade`](https://github.com/webpack/jade-loader) (default at `.jade`): Loads jade template and returns a function
|
||||
* [`coffee`](https://github.com/webpack/coffee-loader) (default at `.coffee`): Loads coffee-script like javascript
|
||||
* [`css`](https://github.com/webpack/css-loader): Loads css file with resolved imports and returns css code
|
||||
* [`less`](https://github.com/webpack/less-loader): Loads and compiles a less file and returns css code
|
||||
* [`val`](https://github.com/webpack/val-loader): Excutes code as module and consider exports as javascript code
|
||||
* [`bundle`](https://github.com/webpack/bundle-loader): Wraps request in a `require.ensure` block
|
||||
* [`file`](https://github.com/webpack/file-loader): Emits the file into the output folder and returns the (relative) url (`file/{ext}` for some extensions)
|
||||
* [`style`](https://github.com/webpack/style-loader): Adds result of javascript execution to DOM
|
||||
* [`script`](https://github.com/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.
|
||||
* (`.css` defaults to `style!css` loader, so all css rules are added to DOM)
|
||||
* (`.less` defaults to `style!css!val/cacheable!less` loader, so all less rules are added to DOM)
|
||||
|
||||
See docs for loader in github repo of the loader.
|
||||
|
||||
[Bigger list of loaders](https://github.com/webpack/webpack/wiki/Loaders)
|
||||
|
||||
## 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("enhanced-require")(module);
|
||||
|
||||
// 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`.
|
||||
|
||||
## Limitations
|
||||
|
||||
### `require`-function
|
||||
|
||||
* `require` should not be overwritten, except from polyfill
|
||||
* `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
|
||||
* An indirect call of `require` should access a file in current directory: This throws an exception: `var r = require; r("../file");`
|
||||
|
||||
The following cases could result in **too much code** in result file if used wrong:
|
||||
|
||||
* indirect call of `require`: `var r = require; r("./file");`. It includes the whole directory.
|
||||
* `require.context`. It includes the whole directory.
|
||||
* 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.
|
||||
|
||||
|
||||
### node.js specific modules
|
||||
|
||||
As node.js specific modules like `fs` will not work in browser they are not included (by default) and cause an exception.
|
||||
You should replace them by own modules if you want to use them.
|
||||
For some simple modules are replacements included in `webpack`.
|
||||
Expensive replacements are not needed by everyone, so that are not included by default.
|
||||
You need to specify `--alias [module]=[replacement]` to use them.
|
||||
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.
|
||||
|
||||
Included simple replacements:
|
||||
|
||||
* `assert`: copy of node.js' version, small change
|
||||
* `buffer`: copy of node-browserify's version
|
||||
* `buffer_ieee754`: copy of node-browserify's version
|
||||
* `child_process`: disabled
|
||||
* `events`: copy of node.js' version
|
||||
* `path`: copy of node.js' version
|
||||
* `punycode`: copy of node.js' version, one line removed (http://mths.be/punycode by @mathias)
|
||||
* `querystring`: copy of node.js' version
|
||||
* `string_decoder`: copy of node.js' version
|
||||
* `url`: copy of node.js' version
|
||||
* `util`: copy of node.js' version
|
||||
|
||||
Here is a list of possible useful replacements: (intentionally not by default)
|
||||
|
||||
* `http=http-browserify`
|
||||
* `vm=vm-browserify`
|
||||
* TODO provide some more replacements
|
||||
|
||||
## 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:
|
||||
--min Minimize it with uglifyjs [boolean] [default: false]
|
||||
--filenames Output Filenames Into File [boolean] [default: false]
|
||||
--options Options JSON File [string]
|
||||
--public-prefix Path Prefix For JavaScript Loading [string]
|
||||
--library Stores the exports into this variable [string]
|
||||
--colors Output Stats with colors [boolean] [default: false]
|
||||
--single Disable lazy loading [boolean] [default: false]
|
||||
--json Output Stats as JSON [boolean] [default: false]
|
||||
--by-size Sort modules by size in Stats [boolean] [default: false]
|
||||
--verbose Output dependencies in Stats [boolean] [default: false]
|
||||
--profile Capture timings for modules [boolean] [default: false]
|
||||
--alias Set a alias name for a module. ex. http=http-browserify [string]
|
||||
--debug Prints debug info to output files [boolean] [default: false]
|
||||
--watch Recompiles on changes (except loaders) [boolean] [default: false]
|
||||
--watch-delay Timeout to wait for the last change
|
||||
--workers Use worker processes to be faster (BETA) [boolean] [default: false]
|
||||
--progress Displays a progress while compiling [boolean] [default: false]
|
||||
```
|
||||
|
||||
### Programmatically Usage
|
||||
|
||||
``` javascript
|
||||
webpack(context, moduleName, options, callback)
|
||||
webpack(absoluteModulePath, options, callback)
|
||||
```
|
||||
|
||||
#### `options`
|
||||
|
||||
You can also save this options object in a JSON file and use it with the shell command.
|
||||
|
||||
``` 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
|
||||
|
||||
context: "/home/node/stuff",
|
||||
// default: [context] parameter if Programmatically Usage
|
||||
// default: process.cwd() if Shell Usage
|
||||
// paths in stats and debug sourceUrl are shortened to this base directory
|
||||
|
||||
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
|
||||
|
||||
library: "mylib", // default: null
|
||||
// store the exports of the entrace module in a variable of this name
|
||||
// use this to create a library from webpack
|
||||
|
||||
includeFilenames: true, // default: false
|
||||
// include the filename of each module as comment before the module
|
||||
|
||||
single: false, // default: false
|
||||
// ignore all Code Splitting and emit only a single file
|
||||
// all code is included and should work as with Code Splitting
|
||||
|
||||
minimize: true, // default: false
|
||||
// minimize resources for production use
|
||||
// javascript is minimized with uglify-js2
|
||||
// loaders will minimize other resources
|
||||
|
||||
debug: true, // default: false
|
||||
// put the source of the modules into annotated eval,
|
||||
// which cause a nice debug experience in some dev tools
|
||||
|
||||
watch: true, // default: false
|
||||
// recompiles on changes on module and contexts (currently not on loaders)
|
||||
// unchanged files are cached for greater performance
|
||||
|
||||
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:
|
||||
// -- bundling process --
|
||||
// "bundle" (stats) the bundle is finished
|
||||
// "bundle-invalid" () fired when the bundle gets invalid
|
||||
// [bundle-invalid is only fired in watch mode]
|
||||
// "start-writing" (hash) fired when webpack starts writing
|
||||
// "watch-end" () watch ended because of loader change
|
||||
// -- events for modules --
|
||||
// "module" (module, filename) after a module is loaded
|
||||
// "context-enum" (module, dirname) before a context is enumerated
|
||||
// "context" (module, dirname) after a context is loaded
|
||||
// -- events for progress --
|
||||
// "task" (name?) start of a task
|
||||
// "task-end" (name?) end of a task
|
||||
|
||||
noWrite: true, // default: undefined
|
||||
// if true webpack do not write out any file
|
||||
|
||||
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
|
||||
// see https://github.com/webpack/enhanced-resolve for more
|
||||
|
||||
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
|
||||
|
||||
modulesDirectorys: ["jam", "xyz_modules", "node_modules"],
|
||||
// default: (defaults are NOT included if you define your own)
|
||||
// ["web_modules", "node_modules"];
|
||||
// directories to be searched 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
|
||||
|
||||
packageMains: ["abc", "main"]
|
||||
// defaults: ["webpack", "browserify", "web", "main"]
|
||||
// lookup fields in package.json
|
||||
|
||||
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
|
||||
|
||||
loaderPackageMains: ["loader", "main"]
|
||||
// defaults: ["webpackLoader", "webLoader", "loader", "main"]
|
||||
// lookup fields for loaders in package.json
|
||||
|
||||
loaders: [{
|
||||
test: /\.generator\.js/,
|
||||
exclude: /\.no\.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/separable?cacheable!less"}]
|
||||
// automatically use loaders if filename match RegExp
|
||||
// and no loader is specified.
|
||||
// you can pass a RegExp as string, or multiple RegExps/strings in an array
|
||||
|
||||
postprocess: {
|
||||
normal: [function(filename, callback) {
|
||||
// webpack will not find files including ".exclude."
|
||||
if(/\.exclude\.[^\\\/]*$/.test(filename))
|
||||
return callback(new Error("File is excluded"));
|
||||
callback(null, filename);
|
||||
}],
|
||||
// defaults: []
|
||||
// postprocess resolved filenames by all specified async functions
|
||||
// a postprocessor must call the callback
|
||||
// You must pass a filename instead of a function if you use workers
|
||||
// The filename is required in the worker process.
|
||||
|
||||
context: [],
|
||||
// same as postprocess.normal but for contextes
|
||||
}
|
||||
}
|
||||
|
||||
postLoaders: [{test: /\.export.js$/, loader: "export"}],
|
||||
// default: []
|
||||
// syntax like resolve.loaders
|
||||
// all loaders which matches the file are applied after the
|
||||
// normal loaders. This cannot be overridden in the require call.
|
||||
// You must pass a string instead of a RegExp if you use workers
|
||||
|
||||
preLoaders: [{test: /\.txt$|\.html$/, loader: "normalizeNLs"}],
|
||||
// default: []
|
||||
// syntax like resolve.loaders
|
||||
// all loaders which matches the file are applied before the
|
||||
// normal loaders. This cannot be overridden in the require call.
|
||||
// You must pass a string instead of a RegExp if you use workers
|
||||
|
||||
maxChunks: 5, // (experimental)
|
||||
// default: undefined
|
||||
// limit the maximum number of chunks.
|
||||
// chunks are merged until the required number is reached
|
||||
|
||||
mergeSizeRatio: 2, // (experimental)
|
||||
// default: 0.2
|
||||
// when choosing the merged chunks the maximum of this formular is searched:
|
||||
// sizeSaveByChunkMerging - mergedChunkSize * mergeSizeRatio
|
||||
|
||||
workers: true,
|
||||
// default: false
|
||||
// options: true, false, number > 0, object of type webpack/lib/Workers
|
||||
// Use worker processes to do some work.
|
||||
// This *can* boost performance, but starting these processes has some
|
||||
// overhead (~100-200ms). If loaders are used they need to have the
|
||||
// seperable flag to work in worker process. If they havn't they work in
|
||||
// the main process.
|
||||
// Pushing jobs to worker processes has an addititional overhead of ~100ms.
|
||||
|
||||
closeWorkers: false,
|
||||
// default: true
|
||||
// close the worker processes on webpack exit.
|
||||
|
||||
workersNoResolve: true,
|
||||
// default: false
|
||||
// workers should not be used in the resolving process
|
||||
// This may be useful if you want to have your postprocessors in the main process.
|
||||
|
||||
workerMinLoaders: 2,
|
||||
// default: 0
|
||||
// only process file in seperate process if more or equal loaders applied to the file.
|
||||
|
||||
amd: { jQuery: true },
|
||||
// default: {}
|
||||
// specify the value of require.amd and define.amd
|
||||
|
||||
profile: true,
|
||||
// default: false
|
||||
// capture timings for the build.
|
||||
// they are stored in the stats
|
||||
}
|
||||
```
|
||||
|
||||
#### `callback`
|
||||
|
||||
`function(err, stats)`
|
||||
|
||||
`stats` as json:
|
||||
|
||||
``` javascript
|
||||
{
|
||||
hash: "52bd9213...38d",
|
||||
startTime: 237467691, // in ms since 1.1.1990
|
||||
time: 1234, // in ms
|
||||
chunkCount: 2,
|
||||
modulesCount: 10,
|
||||
modulesIncludingDuplicates: 10,
|
||||
modulesFirstChunk: 3,
|
||||
fileSizes: {
|
||||
"output.js": 1234,
|
||||
"1.output.js": 2345
|
||||
},
|
||||
chunkNameFiles: {
|
||||
"main": "output.js",
|
||||
"namedChunk": "1.output.js"
|
||||
}
|
||||
dependencies: [ "filename", ... ],
|
||||
loaders: [ "filename of loader", ... ]
|
||||
contexts: [ "dirname of context", ... ]
|
||||
warnings: [ "Some warning" ],
|
||||
errors: [ "Some error" ],
|
||||
fileModules: {
|
||||
"output.js": [
|
||||
{
|
||||
id: 0,
|
||||
size: 123,
|
||||
filename: "/home/.../main.js",
|
||||
reasons: [ { type: "main" } ],
|
||||
dependencies: [ "filename", ... ],
|
||||
loaders: [ "filename of loader", ... ]
|
||||
},
|
||||
{ id: 1, size: 234, filename: "...", reasons: [
|
||||
{ type: "require", // or "context"
|
||||
async: true,
|
||||
count: 2,
|
||||
filename: "/home/.../main.js",
|
||||
// additionally: dirname: "..." // for type = "context"
|
||||
}
|
||||
]},
|
||||
...
|
||||
],
|
||||
"1.output.js": [...]
|
||||
},
|
||||
subStats: [...], // stats for embedded webpacks
|
||||
}
|
||||
```
|
||||
|
||||
### with grunt
|
||||
|
||||
see [grunt-webpack](https://github.com/webpack/grunt-webpack).
|
||||
|
||||
|
||||
|
||||
## Bonus features
|
||||
|
||||
### File hash
|
||||
|
||||
You can use `[hash]` in `publicPrefix`, `output`, `outputDirectory`, `outputPostfix` and in the shell parameters.
|
||||
`webpack` will replace it with a hash of your files, when writing.
|
||||
|
||||
### From shell
|
||||
|
||||
Combine the options `--colors --watch --progress` to get a pretty shell compilation.
|
||||
|
||||
### Webpack features in node.js
|
||||
|
||||
see [enhanced-require](https://github.com/webpack/enhanced-require).
|
||||
|
||||
### More
|
||||
|
||||
see [wiki](https://github.com/webpack/webpack/wiki)
|
||||
|
||||
|
||||
|
||||
## Tests
|
||||
|
@ -684,23 +106,24 @@ You are also welcome to correct any spelling mistakes or any language issues, be
|
|||
|
||||
|
||||
|
||||
## Future plans
|
||||
|
||||
see [wiki Ideas](https://github.com/webpack/webpack/wiki/Ideas)
|
||||
|
||||
|
||||
|
||||
## License
|
||||
|
||||
Copyright (c) 2012 Tobias Koppers
|
||||
Copyright (c) 2012-2013 Tobias Koppers
|
||||
|
||||
MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
|
||||
|
||||
|
||||
|
||||
## Dependencies
|
||||
|
||||
* [esprima](http://esprima.org/)
|
||||
* [optimist](https://github.com/substack/node-optimist)
|
||||
* [enhanced-resolve](https://github.com/webpack/enhanced-resolve)
|
||||
* [uglify-js](https://github.com/mishoo/UglifyJS)
|
||||
* [sprintf](https://github.com/maritz/node-sprintf)
|
||||
* [mocha](https://github.com/visionmedia/mocha)
|
||||
* [should](https://github.com/visionmedia/should.js)
|
||||
* [optimist](https://github.com/substack/node-optimist)
|
||||
* [async](https://github.com/caolan/async)
|
||||
* [mkdirp](http://esprima.org/)
|
||||
* [clone](https://github.com/pvorb/node-clone)
|
|
@ -1,5 +0,0 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
module.exports = "(require.modules.c||'')";
|
|
@ -0,0 +1,53 @@
|
|||
module.exports = function(optimist) {
|
||||
optimist
|
||||
|
||||
.string("config").describe("config")
|
||||
|
||||
.string("context").describe("context")
|
||||
|
||||
.string("entry").describe("entry")
|
||||
|
||||
.string("module-bind").describe("module-bind")
|
||||
|
||||
.string("module-bind-post").describe("module-bind-post")
|
||||
|
||||
.string("module-bind-pre").describe("module-bind-pre")
|
||||
|
||||
.string("output-path").describe("output-path")
|
||||
|
||||
.string("output-file").describe("output-file")
|
||||
|
||||
.string("output-chunk-file").describe("output-chunk-file")
|
||||
|
||||
.string("output-public-path").describe("output-public-path")
|
||||
|
||||
.boolean("output-pathinfo").describe("output-pathinfo")
|
||||
|
||||
.string("output-library").describe("output-library")
|
||||
|
||||
.string("output-library-target").describe("output-library-target")
|
||||
|
||||
.boolean("console").describe("console")
|
||||
|
||||
.boolean("cache").describe("cache")
|
||||
|
||||
.boolean("watch").alias("watch", "w").describe("watch")
|
||||
|
||||
.boolean("debug").alias("debug", "d").describe("debug")
|
||||
|
||||
.string("devtool").describe("devtool")
|
||||
|
||||
.boolean("progress").describe("progress")
|
||||
|
||||
.string("resolve-alias").describe("resolve-alias")
|
||||
|
||||
.string("resolve-loader-alias").describe("resolve-loader-alias")
|
||||
|
||||
.describe("optimize-max-chunks")
|
||||
|
||||
.boolean("optimize-minimize").describe("optimize-minimize")
|
||||
|
||||
.string("plugin").describe("plugin")
|
||||
|
||||
.boolean("bail").describe("bail");
|
||||
};
|
|
@ -0,0 +1,256 @@
|
|||
var path = require("path");
|
||||
var resolve = require("enhanced-resolve");
|
||||
|
||||
module.exports = function(optimist, argv, convertOptions) {
|
||||
|
||||
var options = {};
|
||||
|
||||
function ifArg(name, fn, init) {
|
||||
if(Array.isArray(argv[name])) {
|
||||
if(init) init();
|
||||
argv[name].forEach(fn);
|
||||
} else if(typeof argv[name] != "undefined") {
|
||||
if(init) init();
|
||||
fn(argv[name], -1);
|
||||
}
|
||||
}
|
||||
|
||||
function ifArgPair(name, fn, init) {
|
||||
ifArg(name, function(content, idx) {
|
||||
var i = content.indexOf("=");
|
||||
if(i < 0) return fn(null, content, idx);
|
||||
else return fn(content.substr(0, i), content.substr(i+1), idx);
|
||||
}, init);
|
||||
}
|
||||
|
||||
function mapArgToBoolean(name, optionName) {
|
||||
ifArg(name, function(bool) {
|
||||
options[optionName] = bool;
|
||||
});
|
||||
}
|
||||
|
||||
function mapArgToPath(name, optionName) {
|
||||
ifArg(name, function(str) {
|
||||
options[optionName] = path.resolve(str);
|
||||
});
|
||||
}
|
||||
|
||||
function loadPlugin(name) {
|
||||
try {
|
||||
var path = resolve.sync(process.cwd(), name);
|
||||
} catch(e) {
|
||||
console.log("Cannot resolve plugin " + name + ".");
|
||||
process.exit(-1);
|
||||
}
|
||||
try {
|
||||
var Plugin = require(path);
|
||||
} catch(e) {
|
||||
console.log("Cannot load plugin " + name + ". (" + path + ")");
|
||||
throw e;
|
||||
}
|
||||
try {
|
||||
return new Plugin();
|
||||
} catch(e) {
|
||||
console.log("Cannot instantiate plugin " + name + ". (" + path + ")");
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
function ensureObject(parent, name) {
|
||||
if(typeof parent[name] != "object" || parent[name] === null)
|
||||
parent[name] = {};
|
||||
}
|
||||
|
||||
function ensureArray(parent, name) {
|
||||
if(!Array.isArray(parent[name]))
|
||||
parent[name] = [];
|
||||
}
|
||||
|
||||
if(argv.config) {
|
||||
options = require(path.resolve(argv.config));
|
||||
} else {
|
||||
try {
|
||||
options = require(path.resolve("webpack.config.js"));
|
||||
} catch(e) {
|
||||
options = {};
|
||||
}
|
||||
}
|
||||
if(typeof options != "object" || options === null) {
|
||||
console.log("Config did not export a object.");
|
||||
process.exit(-1);
|
||||
}
|
||||
|
||||
mapArgToPath("context", "context");
|
||||
if(!options.context) options.context = process.cwd();
|
||||
|
||||
ifArgPair("entry", function(name, entry) {
|
||||
options.entry[name] = entry;
|
||||
}, function() {
|
||||
ensureObject(options, "entry");
|
||||
});
|
||||
|
||||
ifArgPair("module-bind", function(name, binding) {
|
||||
if(name === null) name = binding;
|
||||
options.module.loaders.push({
|
||||
test: new RegExp("\\." + name.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"),
|
||||
loader: binding
|
||||
});
|
||||
}, function() {
|
||||
ensureObject(options, "module");
|
||||
ensureArray(options.module, "loaders");
|
||||
});
|
||||
|
||||
ifArgPair("module-bind-pre", function(name, binding) {
|
||||
if(name === null) name = binding;
|
||||
options.module.preLoaders.push({
|
||||
test: new RegExp("\\." + name.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"),
|
||||
loader: binding
|
||||
});
|
||||
}, function() {
|
||||
ensureObject(options, "module");
|
||||
ensureArray(options.module, "preLoaders");
|
||||
});
|
||||
|
||||
ifArgPair("module-bind-post", function(name, binding) {
|
||||
if(name === null) name = binding;
|
||||
options.module.postLoaders.push({
|
||||
test: new RegExp("\\." + name.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"),
|
||||
loader: binding
|
||||
});
|
||||
}, function() {
|
||||
ensureObject(options, "module");
|
||||
ensureArray(options.module, "postLoaders");
|
||||
});
|
||||
|
||||
ifArg("output-path", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.path = value;
|
||||
});
|
||||
|
||||
ifArg("output-file", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.filename = value;
|
||||
});
|
||||
|
||||
ifArg("output-chunk-file", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.chunkFilename = value;
|
||||
});
|
||||
|
||||
ifArg("output-named-chunk-file", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.namedChunkFilename = value;
|
||||
});
|
||||
|
||||
ifArg("output-public-path", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.publicPath = value;
|
||||
});
|
||||
|
||||
ifArg("output-pathinfo", function(bool) {
|
||||
ensureObject(options, "output");
|
||||
options.output.pathinfo = bool;
|
||||
});
|
||||
|
||||
ifArg("output-library", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.library = value;
|
||||
});
|
||||
|
||||
ifArg("output-library-target", function(value) {
|
||||
ensureObject(options, "output");
|
||||
options.output.libraryTarget = value;
|
||||
});
|
||||
|
||||
mapArgToBoolean("console", "console");
|
||||
mapArgToBoolean("cache", "cache");
|
||||
mapArgToBoolean("watch", "watch");
|
||||
|
||||
ifArg("watch-delay", function(value) {
|
||||
options.watchDelay = value;
|
||||
});
|
||||
|
||||
mapArgToBoolean("debug", "debug");
|
||||
|
||||
ifArg("progress", function(value) {
|
||||
if(!value) return;
|
||||
var ProgressPlugin = require("../lib/ProgressPlugin");
|
||||
ensureArray(options, "plugins");
|
||||
var chars = 0;
|
||||
options.plugins.push(new ProgressPlugin(function(percentage, msg) {
|
||||
if(percentage < 1) {
|
||||
percentage = Math.floor(percentage * 100);
|
||||
msg = percentage + "% " + msg;
|
||||
if(percentage < 100) msg = " " + msg;
|
||||
if(percentage < 10) msg = " " + msg;
|
||||
}
|
||||
for(var i = 0; i < chars; i++)
|
||||
process.stderr.write("\b");
|
||||
process.stderr.write(msg);
|
||||
chars = msg.length;
|
||||
}));
|
||||
});
|
||||
|
||||
ifArg("devtool", function(value) {
|
||||
options.devtool = value;
|
||||
});
|
||||
|
||||
ifArgPair("resolve-alias", function(name, value) {
|
||||
if(!name) throw new Error("--resolve-alias <string>=<string>");
|
||||
ensureObject(options, "resolve");
|
||||
ensureObject(options.resolve, "alias");
|
||||
options.resolve.alias[name] = value;
|
||||
});
|
||||
|
||||
ifArgPair("resolve-loader-alias", function(name, value) {
|
||||
if(!name) throw new Error("--resolve-loader-alias <string>=<string>");
|
||||
ensureObject(options, "resolveLoader");
|
||||
ensureObject(options.resolveLoader, "alias");
|
||||
options.resolveLoader.alias[name] = value;
|
||||
});
|
||||
|
||||
ifArg("optimize-max-chunks", function(value) {
|
||||
ensureObject(options, "optimize");
|
||||
options.optimize.maxChunks = parseInt(value, 10);
|
||||
});
|
||||
|
||||
ifArg("optimize-minimize", function(bool) {
|
||||
ensureObject(options, "optimize");
|
||||
options.optimize.minimize = bool;
|
||||
});
|
||||
|
||||
ifArg("plugin", function(value) {
|
||||
ensureArray(options, "plugins");
|
||||
options.plugins.push(loadPlugin(value));
|
||||
});
|
||||
|
||||
mapArgToBoolean("bail", "bail");
|
||||
|
||||
if(!options.output || !options.output.filename) {
|
||||
ensureObject(options, "output");
|
||||
if(convertOptions && convertOptions.outputFilename) {
|
||||
options.output.path = path.dirname(convertOptions.outputFilename);
|
||||
options.output.filename = path.basename(convertOptions.outputFilename);
|
||||
} else if(argv._.length > 0) {
|
||||
options.output.filename = argv._.pop();
|
||||
options.output.path = path.dirname(options.output.filename);
|
||||
options.output.filename = path.basename(options.output.filename);
|
||||
} else {
|
||||
optimist.showHelp();
|
||||
process.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
if(argv._.length > 1) {
|
||||
ensureObject(options, "entry");
|
||||
argv._.forEach(function(content) {
|
||||
var i = content.indexOf("=");
|
||||
if(i < 0) throw new Error("Each element must be <string>=<string>.");
|
||||
else return options.entry[content.substr(0, i)] = content.substr(i+1);
|
||||
});
|
||||
} else if(argv._.length == 1) {
|
||||
options.entry = argv._[0];
|
||||
}
|
||||
|
||||
return options;
|
||||
};
|
258
bin/webpack.js
258
bin/webpack.js
|
@ -14,233 +14,91 @@ try {
|
|||
} catch(e) {}
|
||||
var fs = require("fs");
|
||||
var util = require("util");
|
||||
var sprintf = require("sprintf").sprintf;
|
||||
var argv = require("optimist")
|
||||
var optimist = require("optimist")
|
||||
.usage("webpack " + require("../package.json").version + "\n" +
|
||||
"Usage: $0 <input> <output>")
|
||||
"Usage: https://github.com/webpack/docs/wiki/webpack-detailed-usage")
|
||||
|
||||
require("./config-optimist")(optimist);
|
||||
|
||||
.boolean("min")
|
||||
.describe("min", "Minimize it with uglifyjs")
|
||||
.default("min", false)
|
||||
optimist
|
||||
|
||||
.boolean("filenames")
|
||||
.describe("filenames", "Output Filenames Into File")
|
||||
.default("filenames", false)
|
||||
.boolean("json").alias("json", "j").describe("json")
|
||||
|
||||
.boolean("colors").alias("colors", "c").describe("colors")
|
||||
|
||||
.string("options")
|
||||
.describe("options", "Options JSON File")
|
||||
.string("sort-modules-by").describe("sort-modules-by")
|
||||
|
||||
.string("public-prefix")
|
||||
.describe("public-prefix", "Path Prefix For JavaScript Loading")
|
||||
.string("sort-chunks-by").describe("sort-chunks-by")
|
||||
|
||||
.string("library")
|
||||
.describe("library", "Stores the exports into this variable")
|
||||
.string("sort-assets-by").describe("sort-assets-by")
|
||||
|
||||
.boolean("colors")
|
||||
.describe("colors", "Output Stats with colors")
|
||||
.default("colors", false)
|
||||
.boolean("display-chunks").describe("display-chunks")
|
||||
|
||||
.boolean("single")
|
||||
.describe("single", "Disable lazy loading")
|
||||
.default("single", false)
|
||||
.boolean("display-reasons").alias("display-reasons", "verbose").alias("display-reasons", "v").describe("display-reasons");
|
||||
|
||||
var argv = optimist.argv;
|
||||
|
||||
.boolean("json")
|
||||
.describe("json", "Output Stats as JSON")
|
||||
.default("json", false)
|
||||
var options = require("./convert-argv")(optimist, argv);
|
||||
|
||||
.boolean("by-size")
|
||||
.describe("by-size", "Sort modules by size in Stats")
|
||||
.default("by-size", false)
|
||||
|
||||
.boolean("verbose")
|
||||
.describe("verbose", "Output dependencies in Stats")
|
||||
.default("verbose", false)
|
||||
|
||||
.boolean("profile")
|
||||
.describe("profile", "Capture timings for modules")
|
||||
.default("profile", false)
|
||||
|
||||
.string("alias")
|
||||
.describe("alias", "Set a alias name for a module. ex. http=http-browserify")
|
||||
|
||||
.boolean("debug")
|
||||
.describe("debug", "Prints debug info to output files")
|
||||
.default("debug", false)
|
||||
|
||||
.boolean("watch")
|
||||
.describe("watch", "Recompiles on changes (except loaders)")
|
||||
.default("watch", false)
|
||||
|
||||
.describe("watch-delay", "Timeout to wait for the last change")
|
||||
.default("watch", false)
|
||||
|
||||
.boolean("workers")
|
||||
.describe("workers", "Use worker processes to be faster (BETA)")
|
||||
.default("workers", false)
|
||||
|
||||
.boolean("progress")
|
||||
.describe("progress", "Displays a progress while compiling")
|
||||
.default("progress", false)
|
||||
|
||||
.demand(1) // DEPRECATED
|
||||
.argv;
|
||||
|
||||
var input = argv._[0],
|
||||
output = argv._[1];
|
||||
|
||||
var inputFile = input && input.split("!").pop()
|
||||
if (inputFile && inputFile[0] !== '/' && inputFile[1] !== ':') {
|
||||
input = input.split("!");
|
||||
input.pop();
|
||||
input.push(path.join(process.cwd(), inputFile));
|
||||
input = input.join("!");
|
||||
}
|
||||
var outputFile = output && output.split("!").pop();
|
||||
if (output && output[0] !== '/' && input[1] !== ':') {
|
||||
output = output.split("!");
|
||||
output.pop();
|
||||
output.push(path.join(process.cwd(), outputFile));
|
||||
output = output.join("!");
|
||||
function ifArg(name, fn, init) {
|
||||
if(Array.isArray(argv[name])) {
|
||||
if(init) init();
|
||||
argv[name].forEach(fn);
|
||||
} else if(typeof argv[name] != "undefined") {
|
||||
if(init) init();
|
||||
fn(argv[name], -1);
|
||||
}
|
||||
}
|
||||
|
||||
var options = {};
|
||||
|
||||
if(argv.options) {
|
||||
options = require(path.join(process.cwd(), argv.options));
|
||||
}
|
||||
|
||||
if(argv["public-prefix"]) {
|
||||
options.publicPrefix = argv["public-prefix"];
|
||||
}
|
||||
var outputOptions = {
|
||||
modules: true,
|
||||
chunks: false,
|
||||
cached: false,
|
||||
context: options.context
|
||||
};
|
||||
|
||||
if(argv.min) {
|
||||
options.minimize = true;
|
||||
}
|
||||
ifArg("json", function(bool) {
|
||||
outputOptions.json = bool;
|
||||
});
|
||||
|
||||
if(argv.debug) {
|
||||
options.debug = true;
|
||||
}
|
||||
ifArg("colors", function(bool) {
|
||||
outputOptions.colors = bool;
|
||||
});
|
||||
|
||||
if(argv.single) {
|
||||
options.single = true;
|
||||
}
|
||||
ifArg("sort-modules-by", function(value) {
|
||||
outputOptions.modulesSort = value;
|
||||
});
|
||||
|
||||
if(argv.watch) {
|
||||
options.watch = true;
|
||||
}
|
||||
ifArg("sort-chunks-by", function(value) {
|
||||
outputOptions.chunksSort = value;
|
||||
});
|
||||
|
||||
if(argv.workers) {
|
||||
options.workers = true;
|
||||
}
|
||||
ifArg("sort-assets-by", function(value) {
|
||||
outputOptions.assetsSort = value;
|
||||
});
|
||||
|
||||
if(argv.profile) {
|
||||
options.profile = true;
|
||||
}
|
||||
ifArg("display-chunks", function(bool) {
|
||||
outputOptions.modules = !bool;
|
||||
outputOptions.chunks = bool;
|
||||
});
|
||||
|
||||
if(argv["watch-delay"]) {
|
||||
options.watchDelay = argv["watch-delay"];
|
||||
}
|
||||
|
||||
if(argv.filenames) {
|
||||
options.includeFilenames = true;
|
||||
}
|
||||
|
||||
if(argv.library) {
|
||||
options.library = argv.library;
|
||||
}
|
||||
|
||||
if(argv.alias) {
|
||||
if(typeof argv.alias === "string")
|
||||
argv.alias = [argv.alias];
|
||||
options.resolve = options.resolve || {};
|
||||
options.resolve.alias = options.resolve.alias || {};
|
||||
var aliasObj = options.resolve.alias;
|
||||
argv.alias.forEach(function(alias) {
|
||||
alias = alias.split("=");
|
||||
aliasObj[alias[0]] = alias[1];
|
||||
});
|
||||
}
|
||||
ifArg("display-reasons", function(bool) {
|
||||
outputOptions.reasons = bool;
|
||||
});
|
||||
|
||||
var webpack = require("../lib/webpack.js");
|
||||
var formatOutput = require("../lib/formatOutput.js");
|
||||
|
||||
function c(str) {
|
||||
return argv.colors ? str : "";
|
||||
}
|
||||
|
||||
output = output || path.join(process.cwd(), "js", "web.js");
|
||||
if(!options.outputDirectory) options.outputDirectory = path.dirname(output);
|
||||
if(!options.output) options.output = path.basename(output);
|
||||
if(!options.outputPostfix) options.outputPostfix = "." + path.basename(output);
|
||||
if(!options.context) options.context = process.cwd();
|
||||
|
||||
// some listeners for the progress display
|
||||
if(argv.progress) {
|
||||
if(!options.events) options.events = new (require("events").EventEmitter)();
|
||||
var events = options.events;
|
||||
|
||||
var nextUpdate = 0;
|
||||
var sum = 0;
|
||||
var finished = 0;
|
||||
var chars = 0;
|
||||
function print(force) {
|
||||
if(!force && nextUpdate > new Date().getTime()) return;
|
||||
nextUpdate = new Date().getTime() + 100;
|
||||
var msg = "";
|
||||
if(sum > 0) {
|
||||
var precentage = Math.floor(finished*100/sum);
|
||||
msg += "compiling... (" + c("\033[1m\033[33m");
|
||||
msg += sprintf("%4s", finished+"") + "/" + sprintf("%4s", sum+"");
|
||||
msg += " " + sprintf("%4s", precentage+"%");
|
||||
msg += c("\033[39m\033[22m") + ")";
|
||||
for(var i = 0; i < Math.floor(precentage/2); i++)
|
||||
msg += "#";
|
||||
}
|
||||
for(var i = msg.length; i < chars; i++)
|
||||
msg += " ";
|
||||
for(var i = 0; i < chars; i++)
|
||||
process.stderr.write("\b");
|
||||
process.stderr.write(msg);
|
||||
chars = msg.length;
|
||||
}
|
||||
events.on("task", function(name) {
|
||||
sum++;
|
||||
print();
|
||||
});
|
||||
events.on("task-end", function(name) {
|
||||
finished++;
|
||||
if(name) {
|
||||
for(var i = 0; i < chars; i++)
|
||||
process.stderr.write("\b \b");
|
||||
process.stderr.write(name + " " + c("\033[1m\033[32m") + "done" + c("\033[39m\033[22m") + "\n");
|
||||
chars = 0;
|
||||
return print(true);
|
||||
}
|
||||
print();
|
||||
});
|
||||
events.on("bundle", function(name) {
|
||||
sum = 0;
|
||||
finished = 0;
|
||||
for(var i = 0; i < chars; i++)
|
||||
process.stderr.write("\b \b");
|
||||
chars = 0;
|
||||
});
|
||||
}
|
||||
|
||||
// do the stuff
|
||||
webpack(input, options, function(err, stats) {
|
||||
Error.stackTrackLimit = 30;
|
||||
webpack(options, function(err, stats) {
|
||||
if(err) {
|
||||
console.error(err);
|
||||
console.error(err.stack || err);
|
||||
return;
|
||||
}
|
||||
if(argv.json)
|
||||
console.log(JSON.stringify(stats, null, 2));
|
||||
if(outputOptions.json)
|
||||
console.log(JSON.stringify(stats.toJson(outputOptions), null, 2));
|
||||
else {
|
||||
console.log(formatOutput(stats, {
|
||||
colors: argv.colors,
|
||||
"by-size": argv["by-size"],
|
||||
verbose: argv.verbose,
|
||||
context: options.context
|
||||
}));
|
||||
console.log(stats.toString(outputOptions));
|
||||
}
|
||||
});
|
|
@ -1 +0,0 @@
|
|||
module.exports = ".";
|
|
@ -1 +0,0 @@
|
|||
module.exports = "./index.js";
|
|
@ -1,3 +0,0 @@
|
|||
(function() {
|
||||
module.exports = this;
|
||||
}).call(null);
|
|
@ -1,5 +0,0 @@
|
|||
module.exports = function() {
|
||||
this.cacheable();
|
||||
if(!this.options.amd) return "/* empty to return {} */";
|
||||
return "module.exports = " + JSON.stringify(this.options.amd);
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
var amdRequire = require("./__webpack_amd_require");
|
||||
module.exports = function() { throw new Error("define cannot be used indirect"); };
|
||||
/*var amdRequire = require("!!./amd-require.js");
|
||||
module.exports = function(module) {
|
||||
function define(id, dependencies, factory) {
|
||||
if(typeof id != "number") {
|
||||
|
@ -17,4 +18,4 @@ module.exports = function(module) {
|
|||
}
|
||||
define.amd = amdRequire.amd;
|
||||
return define;
|
||||
}
|
||||
}*///
|
|
@ -0,0 +1 @@
|
|||
module.exports = __webpack_amd_options__;
|
|
@ -12,6 +12,6 @@ function amdRequire(chunk, requiresFn, fn) {
|
|||
}
|
||||
for(var name in req)
|
||||
amdRequire[name] = req[name];
|
||||
amdRequire.amd = require("./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js");
|
||||
amdRequire.amd = __WEBPACK_AMD_OPTIONS__;
|
||||
amdRequire.config = function() {/* config is ignored, use webpack options */};
|
||||
module.exports = amdRequire;
|
|
@ -0,0 +1 @@
|
|||
module.exports = function() { return __webpack_require__; };
|
|
@ -0,0 +1,387 @@
|
|||
// Utilities
|
||||
|
||||
class ArrayMap {
|
||||
get: (key: any) => any;
|
||||
set: (key: any, value: any) => ArrayMap;
|
||||
remove: (key: any) => Boolean;
|
||||
clone: () => ArrayMap;
|
||||
}
|
||||
|
||||
class Tabable {
|
||||
static mixin: (pt: ClassPrototype) => void;
|
||||
applyPlugins: (name: String, args...) => void;
|
||||
applyPluginsAsync: (name: String, args..., callback: (err) => void) => void;
|
||||
applyPluginsBailResult: (name: String, args...) => void;
|
||||
addPlugin: (name: String, fn: (...) => any) => void
|
||||
}
|
||||
|
||||
class Plugin {
|
||||
apply: (tabable: Tabable) => void;
|
||||
}
|
||||
|
||||
// Module and Dependency stuff
|
||||
|
||||
class DependenciesBlock {
|
||||
dependencies: Dependency[];
|
||||
blocks: AsyncDependenciesBlock[];
|
||||
variables: Object; // Map<String, String>
|
||||
|
||||
addBlock: (block: AsyncDependenciesBlock) => void;
|
||||
addDependency: (dependency: Dependency) => void;
|
||||
addVariable: (name: String, expression: String) => void;
|
||||
updateHash: (hash: crypto.Hash) => void;
|
||||
}
|
||||
|
||||
class Module extends DependenciesBlock {
|
||||
abstract identifier: () => String;
|
||||
abstract build: (options: Options, callback: (err) => void) => void;
|
||||
abstract source: (template: ModuleTemplate) => Source;
|
||||
abstract size: () => Number;
|
||||
|
||||
separable: () => Boolean;
|
||||
abstract separateBuild: (options: Options, executor: Executor, callback: (err) => void) => void;
|
||||
|
||||
context: String;
|
||||
reasons: ModuleReason[];
|
||||
addReason: (reason: ModuleReason) => void;
|
||||
id: String;
|
||||
chunks: Chunk[];
|
||||
addChunk(chunk: Chunk) => void;
|
||||
}
|
||||
|
||||
class NormalModule extends Module {
|
||||
constructor(public request: String, preLoaders: String[], loaders: String[], postLoaders: String[]);
|
||||
identifier;
|
||||
build;
|
||||
source;
|
||||
size;
|
||||
}
|
||||
|
||||
class ContextModule extends Module {
|
||||
constructor(
|
||||
public request: String,
|
||||
public recursive: Boolean,
|
||||
public regExp: String
|
||||
);
|
||||
identifier;
|
||||
build;
|
||||
source;
|
||||
size;
|
||||
}
|
||||
|
||||
class Dependency {
|
||||
public module: Module;
|
||||
|
||||
public Class: Class;
|
||||
public loc: { line: int, col: int };
|
||||
public optional: Boolean;
|
||||
|
||||
public isEqualResource: (other: Dependency) => Boolean;
|
||||
public updateHash: (hash: crypto.Hash) => void;
|
||||
}
|
||||
|
||||
class ModuleDependency {
|
||||
constructor(public request: String);
|
||||
isEqualResource;
|
||||
}
|
||||
|
||||
class CommonJsRequireDependency extends ModuleDependency {}
|
||||
class AMDRequireDependency extends ModuleDependency {}
|
||||
class AMDDefineDependency extends ModuleDependency {}
|
||||
class RequireEnsureDependency extends ModuleDependency {}
|
||||
class RequireResolveDependency extends ModuleDependency {}
|
||||
|
||||
class ContextDependency {
|
||||
constructor(
|
||||
public request: String,
|
||||
public recursive: Boolean,
|
||||
public regExp: String
|
||||
);
|
||||
isEqual;
|
||||
}
|
||||
|
||||
class CommonJsExpressionRequireDependency extends ContextDependency {}
|
||||
class AMDExpressionRequireDependency extends ContextDependency {}
|
||||
class AMDExpressionDefineDependency extends ContextDependency {}
|
||||
class ExpressionRequireEnsureDependency extends ContextDependency {}
|
||||
class ExpressionRequireResolveDependency extends ContextDependency {}
|
||||
class RequireContextDependency extends ContextDependency {}
|
||||
class RequireExpressionDependency extends ContextDependency {}
|
||||
|
||||
|
||||
class AsyncDependenciesBlock extends DependenciesBlock {
|
||||
constructor(public name: String);
|
||||
public chunk: Chunk;
|
||||
}
|
||||
|
||||
class Chunk {
|
||||
constructor(public name: String);
|
||||
public id: Number;
|
||||
public addModule(module: Module) => Boolean;
|
||||
public addChunk(chunk: Chunk) => void;
|
||||
}
|
||||
|
||||
// Source stuff
|
||||
|
||||
interface Source {
|
||||
source: () => String;
|
||||
map: () => String;
|
||||
origins: () => any; // Map<String, Source>
|
||||
}
|
||||
|
||||
class StringSource implements Source {
|
||||
constructor(str: String);
|
||||
source: () => String;
|
||||
}
|
||||
|
||||
// Compilation stuff
|
||||
|
||||
class Compilation {
|
||||
constructor(public options: CompilationOptions);
|
||||
|
||||
public dependencyFactories: ArrayMap;
|
||||
public moduleTemplate: ModuleTemplate;
|
||||
public chunkTemplate: ChunkTemplate;
|
||||
public mainTemplate: MainTemplate;
|
||||
|
||||
|
||||
public entry: Module;
|
||||
public chunks: Chunk[];
|
||||
public namedChunks: Object; // Map<String, Chunk>
|
||||
public assets: Object; // Map<String, String | Buffer>
|
||||
|
||||
public process: (context: String, entry: Dependency, callback: (err) => void) => void;
|
||||
public getStats: () => Stats;
|
||||
|
||||
protected addModule(module: Module) => Boolean;
|
||||
protected getModule(module: Module) => Module;
|
||||
protected buildModule(module: Module, callback: (err) => void) => void;
|
||||
protected processModuleDependencies(module: Module, callback: (err) => void) => void;
|
||||
}
|
||||
|
||||
interface ModuleFactory {
|
||||
create: (context: String, dependency: Dependency, callback: (err, Module) => void) => void;
|
||||
}
|
||||
|
||||
class NormalModuleFactory {
|
||||
constructor(resolver, moduleOptions);
|
||||
create;
|
||||
}
|
||||
|
||||
class ContextModuleFactory {
|
||||
constructor(resolver, contextOptions);
|
||||
create;
|
||||
}
|
||||
|
||||
// Parser stuff
|
||||
|
||||
class Parser extends Tabable {
|
||||
parse: (source: String) => Object;
|
||||
|
||||
scope: {
|
||||
inTry: Boolean;
|
||||
};
|
||||
state: Object;
|
||||
|
||||
waltStatements: (statements: Statement[]) => void;
|
||||
walkStatement: (statement: Statement) => void;
|
||||
walkSwitchCases: (switchCases: SwitchCase[]) => void;
|
||||
walkCatchClauses: (catchClauses: CatchClause[]) => void;
|
||||
walkVariableDeclarators: (declarators: Declarator[]) => void;
|
||||
walkExpressions: (expressions: Expression[]) => void;
|
||||
walkExpression: (expression: Expression) => void;
|
||||
|
||||
inScope: (params: Expression[], fn: () => void) => void;
|
||||
|
||||
evaluateExpression: (expression: Expression) => EvaluatedExpression;
|
||||
|
||||
// parseStringArray: (expression: Expression) => String[];
|
||||
// parseString: (expression: Expression) => String;
|
||||
// parseCalculatedStringArray: (expression: Expression) => CalculatedString[];
|
||||
// parseCalculatedString: (expression: Expression) => CalculatedString;
|
||||
|
||||
tab "call *": (expr) => void; // * = methodName, i.e. "require", "require.ensure"
|
||||
tab "expression *": (expr) => void; // * =
|
||||
tab "evaluate *": (expr) => void;
|
||||
}
|
||||
|
||||
interface EvaluatedExpression {
|
||||
isString: () => Boolean;
|
||||
isNumber: () => Boolean;
|
||||
isRegExp: () => Boolean;
|
||||
isConditional: () => Boolean;
|
||||
isArray: () => Boolean;
|
||||
isWrapped: () => Boolean;
|
||||
|
||||
range: Number[2];
|
||||
|
||||
// isConditional
|
||||
options: EvaluatedExpression[];
|
||||
|
||||
// isArray
|
||||
items: EvaluatedExpression[];
|
||||
|
||||
// isConstant && isString
|
||||
string: String;
|
||||
|
||||
// isConstant && isNumber
|
||||
number: Number;
|
||||
|
||||
// isConstant && isRegExp
|
||||
regExp: RegExp;
|
||||
|
||||
// !isConstant && isWrapped
|
||||
prefix: EvaluatedExpression;
|
||||
|
||||
// !isConstant && isWrapped
|
||||
postfix: EvaluatedExpression;
|
||||
}
|
||||
|
||||
type CalculatedString {
|
||||
range: Number[];
|
||||
value: String;
|
||||
code: Boolean;
|
||||
}
|
||||
|
||||
// Options stuff
|
||||
|
||||
interface CompilationOptions {
|
||||
|
||||
context: String;
|
||||
entry: String;
|
||||
resolve: ResolveOptions;
|
||||
|
||||
module: {
|
||||
preLoaders: MatchableLoader[];
|
||||
postLoaders: MatchableLoader[];
|
||||
loaders: MatchableLoader[];
|
||||
loader: Object;
|
||||
parse: ParseOptions;
|
||||
};
|
||||
|
||||
optimize: {
|
||||
maxChunks: Number;
|
||||
chunkOverhead: Number;
|
||||
entryChunkMultiplicator: Number;
|
||||
};
|
||||
|
||||
debug: Boolean;
|
||||
devtool: false | "eval" | "sourcemap";
|
||||
minimize: UglifyJs2Options;
|
||||
|
||||
separate: {
|
||||
|
||||
};
|
||||
|
||||
output: {
|
||||
path: String;
|
||||
publicPath: String;
|
||||
filename: String;
|
||||
chunkFilename: String;
|
||||
namedChunkFilename: String;
|
||||
pathinfo: Boolean;
|
||||
jsonpFunction?: String;
|
||||
libraryName?: String;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
interface ResolveOptions {
|
||||
paths: String[];
|
||||
modulesDirectories: String[];
|
||||
|
||||
resourcePaths: String[];
|
||||
resourceModulesDirectories: String[];
|
||||
alias: Object; // Map<String, String>
|
||||
extensions: String[];
|
||||
packageMains: String[];
|
||||
|
||||
loaderPaths: String[];
|
||||
loaderModulesDirectories: String[];
|
||||
loaderAlias: Object; // Map<String, String>
|
||||
loaderPostfixes: String[];
|
||||
loaderExtensions: String[];
|
||||
loaderPackageMains: String[];
|
||||
|
||||
disableLoaders: Boolean;
|
||||
disableResourceQuery: Boolean;
|
||||
disableResourcePureQuery: Boolean;
|
||||
disableLoaderQuery: Boolean;
|
||||
}
|
||||
|
||||
interface MatchableLoader {
|
||||
test: StringOrRegExp | StringOrRegExp[];
|
||||
include?: StringOrRegExp | StringOrRegExp[];
|
||||
exclude?: StringOrRegExp | StringOrRegExp[];
|
||||
loader: String;
|
||||
}
|
||||
|
||||
// Compiler stuff
|
||||
|
||||
interface Resolver {
|
||||
resolveModuleRequest: (context: String, request: String, callback: (err, request) => void) => void;
|
||||
resolveContextRequest: (context: String, request: String, callback: (err, request) => void) => void;
|
||||
resolveLoader: (context: String, request: String, callback: (err, request) => void) => void;
|
||||
}
|
||||
|
||||
interface Executor {
|
||||
static availible: () => Boolean;
|
||||
ready: () => Boolean;
|
||||
execute: (
|
||||
module: String;
|
||||
params: Object[];
|
||||
callback: (err, results...) => void
|
||||
) => void;
|
||||
}
|
||||
|
||||
interface CompilationOptimizer {
|
||||
optimize(compilation: Compilation, callback: (err) => void);
|
||||
}
|
||||
|
||||
interface FileEmitter {
|
||||
emitFile(name: String, content: Buffer | String, callback: (err) => void) => void;
|
||||
}
|
||||
|
||||
class Compiler {
|
||||
constructor(options);
|
||||
|
||||
resolver: Resolver;
|
||||
separateExecutor: Executor;
|
||||
optimizers: CompilationOptimizer[];
|
||||
dependencyTemplates: ArrayMap; // Dependency Class -> DependencyTemplate
|
||||
moduleTemplate: ModuleTemplate;
|
||||
chunkTemplate: ChunkTemplate;
|
||||
mainTemplate: ChunkTemplate;
|
||||
fileEmitter: FileEmitter;
|
||||
|
||||
plugins: CompilationPlugin[];
|
||||
|
||||
run(callback: (err, stats: Stats) => void) => void;
|
||||
}
|
||||
|
||||
// Node specifiy stuff
|
||||
|
||||
class NodeSubProcessExecutor implements Executor {
|
||||
static availible;
|
||||
constructor(count: Number);
|
||||
ready;
|
||||
execute;
|
||||
}
|
||||
|
||||
class NodeFileEmitter implements FileEmitter {
|
||||
constructor(outputPath: String);
|
||||
emitFile;
|
||||
}
|
||||
|
||||
class NodeResolver implements Resolver {
|
||||
constructor(options: ResolveOptions);
|
||||
resolveModuleRequest;
|
||||
resolveContextRequest;
|
||||
resolveLoader;
|
||||
}
|
||||
|
||||
class NodeCompiler {
|
||||
constructor(options);
|
||||
|
||||
resolver: NodeResolver
|
||||
}
|
|
@ -2,52 +2,40 @@
|
|||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
require = require("enhanced-require")(module);
|
||||
|
||||
var cp = require('child_process');
|
||||
var tc = require("./template-common");
|
||||
var formatOutput = require("../lib/formatOutput");
|
||||
var createFilenameShortener = require("../lib/createFilenameShortener");
|
||||
var webpackGraph = require("webpack-graph");
|
||||
var Stats = require("../lib/Stats");
|
||||
// var webpackGraph = require("webpack-graph");
|
||||
var fs = require("fs");
|
||||
var path = require("path");
|
||||
|
||||
var extraArgs = "";
|
||||
if(fs.existsSync(require("path").join(process.cwd(), "webpackOptions.js")))
|
||||
extraArgs += "--options webpackOptions.js ";
|
||||
|
||||
cp.exec("node ../../bin/webpack.js --verbose --min "+extraArgs+" example.js js/output.js", function (error, stdout, stderr) {
|
||||
cp.exec("node ../../bin/webpack.js --display-reasons --display-chunks --optimize-minimize "+extraArgs+" ./example.js js/output.js", function (error, stdout, stderr) {
|
||||
if(stderr)
|
||||
console.log(stderr);
|
||||
if (error !== null)
|
||||
console.log(error);
|
||||
var readme = tc(require("raw!"+require("path").join(process.cwd(), "template.md")), require.context("raw!"+process.cwd()), stdout.replace(/[\r\n]*$/, ""), "min");
|
||||
cp.exec("node ../../bin/webpack.js --filenames --verbose "+extraArgs+" example.js js/output.js --json", function (error, stdout, stderr) {
|
||||
clean(require.contentCache);
|
||||
clean(require.sourceCache);
|
||||
clean(require.cache);
|
||||
var readme = tc(fs.readFileSync(require("path").join(process.cwd(), "template.md"), "utf-8"), process.cwd(), stdout.replace(/[\r\n]*$/, ""), "min");
|
||||
cp.exec("node ../../bin/webpack.js --display-reasons --display-chunks --output-pathinfo "+extraArgs+" ./example.js js/output.js", function (error, stdout, stderr) {
|
||||
console.log(stdout);
|
||||
if(stderr)
|
||||
console.log(stderr);
|
||||
if (error !== null)
|
||||
console.log(error);
|
||||
var stats = JSON.parse(stdout);
|
||||
var formatedStats = formatOutput(stats, {
|
||||
context: process.cwd(),
|
||||
verbose: true
|
||||
});
|
||||
var filenameShortener = createFilenameShortener(process.cwd());
|
||||
readme = tc(readme, require.context("raw!"+process.cwd()), formatedStats.replace(/[\r\n]*$/, ""));
|
||||
// var stats = JSON.parse(stdout);
|
||||
// var formatedStats = Stats.jsonToString(stats, {
|
||||
// context: process.cwd(),
|
||||
// verbose: true
|
||||
// });
|
||||
// var filenameShortener = createFilenameShortener(process.cwd());
|
||||
readme = tc(readme, process.cwd(), stdout.replace(/[\r\n]*$/, ""));
|
||||
readme = readme.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
||||
fs.writeFile("README.md", readme, "utf-8", function() {});
|
||||
fs.writeFile("graph.svg", webpackGraph(stats, {
|
||||
nameShortener: filenameShortener,
|
||||
width: 500,
|
||||
height: 300
|
||||
}), "utf-8", function() {});
|
||||
// fs.writeFile("graph.svg", webpackGraph(stats, {
|
||||
// nameShortener: filenameShortener,
|
||||
// width: 500,
|
||||
// height: 300
|
||||
// }), "utf-8", function() {});
|
||||
});
|
||||
});
|
||||
|
||||
function clean(obj) {
|
||||
for(var name in obj) {
|
||||
delete obj[name];
|
||||
}
|
||||
}
|
|
@ -17,178 +17,139 @@ getTemplate("b", function(b) {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(document, undefined) {
|
||||
/******/ return function(modules) {
|
||||
/******/ var installedModules = {}, installedChunks = {0:1};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback(require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+chunkId+modules.a;
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ window[modules.b] = function(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i](require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ }
|
||||
/******/})(document)
|
||||
/******/({a:".output.js",b:"webpackJsonp",c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+""+chunkId+".output.js";
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ var installedChunks = {0:1};
|
||||
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i].call(null, require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(require,console) {
|
||||
function getTemplate(templateName, callback) {
|
||||
require(1, function() { return [require(/*! ../require.context/templates */4)("./"+templateName)]}, function(tmpl) {
|
||||
callback(tmpl());
|
||||
});
|
||||
}
|
||||
getTemplate("a", function(a) {
|
||||
console.log(a);
|
||||
});
|
||||
getTemplate("b", function(b) {
|
||||
console.log(b);
|
||||
});
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_require */2),require(/*! __webpack_console */1)))
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_console.js !**/
|
||||
|
||||
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
|
||||
module.exports = console;
|
||||
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
|
||||
if(!console[name])
|
||||
console[name] = function() {};
|
||||
var times = {};
|
||||
if(!console.time)
|
||||
console.time = function(label) {
|
||||
times[label] = Date.now();
|
||||
};
|
||||
if(!console.timeEnd)
|
||||
console.timeEnd = function() {
|
||||
var duration = Date.now() - times[label];
|
||||
console.log('%s: %dms', label, duration);
|
||||
};
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_amd_require.js !**/
|
||||
|
||||
var req = require.valueOf();
|
||||
function amdRequire(chunk, requiresFn, fn) {
|
||||
if(!requiresFn) {
|
||||
// commonjs
|
||||
return req(chunk);
|
||||
function getTemplate(templateName, callback) {
|
||||
require.e/* require */(1, function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [require(/*! ../require.context/templates */ 1)("./"+templateName)]; (function(tmpl) {
|
||||
callback(tmpl());
|
||||
}.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));});
|
||||
}
|
||||
req.e(chunk, function() {
|
||||
var modules = requiresFn();
|
||||
if(fn)
|
||||
return fn.apply(null, modules);
|
||||
getTemplate("a", function(a) {
|
||||
console.log(a);
|
||||
});
|
||||
getTemplate("b", function(b) {
|
||||
console.log(b);
|
||||
});
|
||||
}
|
||||
for(var name in req)
|
||||
amdRequire[name] = req[name];
|
||||
amdRequire.amd = require(/*! ./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js */3);
|
||||
amdRequire.config = function() {/* config is ignored, use webpack options */};
|
||||
module.exports = amdRequire;
|
||||
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js !**/
|
||||
|
||||
/* empty to return {} */
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/1.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(1,{
|
||||
/******/4: function(module, exports, require) {
|
||||
webpackJsonp(1, {
|
||||
|
||||
/**! (webpack)\examples\require.context\templates !**/
|
||||
/***/ 1:
|
||||
/*!********************************************!*\
|
||||
!*** ./require.context/templates ^\.\/.*$ ***!
|
||||
\********************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/***/ var map = {"./a.js":5,"./b.js":6,"./c.js":7};
|
||||
/***/ exports = module.exports = function(name) {
|
||||
/***/ return require(exports.id(name) || name)
|
||||
/***/ };
|
||||
/***/ exports.id = function(name) {
|
||||
/***/ return map[name] || map[name+".js"];
|
||||
/***/ };
|
||||
/***/ exports.keys = function() {
|
||||
/***/ return Object.keys(map);
|
||||
/***/ };
|
||||
var map = {
|
||||
"./a.js": 2,
|
||||
"./a": 2,
|
||||
"./b.js": 3,
|
||||
"./b": 3,
|
||||
"./c.js": 4,
|
||||
"./c": 4
|
||||
};
|
||||
module.exports = function webpackContext(req) {
|
||||
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
|
||||
};
|
||||
module.exports.keys = function webpackContextKeys() {
|
||||
return Object.keys(map);
|
||||
};
|
||||
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/5: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\a.js !**/
|
||||
/***/ 2:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/a.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/6: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\b.js !**/
|
||||
/***/ 3:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/b.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/7: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\c.js !**/
|
||||
/***/ 4:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/c.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
/***/ }
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -196,69 +157,49 @@ module.exports = function() {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: bf0ce807e0d159bd6a3739abefcc2e57
|
||||
Compile Time: 45ms
|
||||
Chunks: 2
|
||||
Modules: 8
|
||||
Modules including duplicates: 8
|
||||
Modules first chunk: 4
|
||||
main output.js: 3870 chars/bytes
|
||||
1.output.js: 1110 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 295 .\example.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_console.js
|
||||
require (2x) from .\example.js
|
||||
2 502 (webpack)\buildin\__webpack_amd_require.js
|
||||
require (1x) from .\example.js
|
||||
3 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_require.js
|
||||
1.output.js
|
||||
4 322 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\example.js
|
||||
5 80 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\example.js
|
||||
6 80 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\example.js
|
||||
7 80 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\example.js
|
||||
Hash: f1fb37f49e400b26b20b56805a789ef3
|
||||
Time: 47ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2403 0 main
|
||||
1.output.js 1427 1
|
||||
chunk {0} output.js (main) 251
|
||||
[0] ./example.js 251 [built] {0}
|
||||
chunk {1} 1.output.js 457 {0}
|
||||
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
|
||||
amd require context ../require.context/templates [0] ./example.js 2:1-4:3
|
||||
[2] ./require.context/templates/a.js 80 [built] {1}
|
||||
context element ./a [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./a.js [1] ./require.context/templates ^\.\/.*$
|
||||
[3] ./require.context/templates/b.js 80 [built] {1}
|
||||
context element ./b [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./b.js [1] ./require.context/templates ^\.\/.*$
|
||||
[4] ./require.context/templates/c.js 80 [built] {1}
|
||||
context element ./c [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./c.js [1] ./require.context/templates ^\.\/.*$
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: 1340b9e7d018a9c04cbe2e165e1d6f22
|
||||
Compile Time: 288ms
|
||||
Chunks: 2
|
||||
Modules: 8
|
||||
Modules including duplicates: 8
|
||||
Modules first chunk: 4
|
||||
main output.js: 1405 chars/bytes
|
||||
1.output.js: 456 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 186 .\example.js
|
||||
main
|
||||
1 403 (webpack)\buildin\__webpack_console.js
|
||||
require (2x) from .\example.js
|
||||
2 271 (webpack)\buildin\__webpack_amd_require.js
|
||||
require (1x) from .\example.js
|
||||
3 0 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_require.js
|
||||
1.output.js
|
||||
4 213 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\example.js
|
||||
5 73 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\example.js
|
||||
6 73 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\example.js
|
||||
7 73 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\example.js
|
||||
Hash: f1fb37f49e400b26b20b56805a789ef3
|
||||
Time: 122ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 855 0 main
|
||||
1.output.js 494 1
|
||||
chunk {0} output.js (main) 251
|
||||
[0] ./example.js 251 [built] {0}
|
||||
chunk {1} 1.output.js 457 {0}
|
||||
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
|
||||
amd require context ../require.context/templates [0] ./example.js 2:1-4:3
|
||||
[2] ./require.context/templates/a.js 80 [built] {1}
|
||||
context element ./a [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./a.js [1] ./require.context/templates ^\.\/.*$
|
||||
[3] ./require.context/templates/b.js 80 [built] {1}
|
||||
context element ./b [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./b.js [1] ./require.context/templates ^\.\/.*$
|
||||
[4] ./require.context/templates/c.js 80 [built] {1}
|
||||
context element ./c [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./c.js [1] ./require.context/templates ^\.\/.*$
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
|
|
@ -17,145 +17,139 @@ getTemplate("b", function(b) {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(document, undefined) {
|
||||
/******/ return function(modules) {
|
||||
/******/ var installedModules = {}, installedChunks = {0:1};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback(require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+chunkId+modules.a;
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ window[modules.b] = function(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i](require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ }
|
||||
/******/})(document)
|
||||
/******/({a:".output.js",b:"webpackJsonp",c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+""+chunkId+".output.js";
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ var installedChunks = {0:1};
|
||||
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i].call(null, require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
|
||||
function getTemplate(templateName, callback) {
|
||||
require.e(1, function(require) {
|
||||
callback(require(/*! ../require.context/templates */2)("./"+templateName)());
|
||||
function getTemplate(templateName, callback) {
|
||||
require.e/*nsure*/(1, function(require) {
|
||||
callback(require(/*! ../require.context/templates */ 1)("./"+templateName)());
|
||||
});
|
||||
}
|
||||
getTemplate("a", function(a) {
|
||||
console.log(a);
|
||||
});
|
||||
getTemplate("b", function(b) {
|
||||
console.log(b);
|
||||
});
|
||||
}
|
||||
getTemplate("a", function(a) {
|
||||
console.log(a);
|
||||
});
|
||||
getTemplate("b", function(b) {
|
||||
console.log(b);
|
||||
});
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/**! (webpack)\buildin\__webpack_console.js !**/
|
||||
|
||||
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
|
||||
module.exports = console;
|
||||
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
|
||||
if(!console[name])
|
||||
console[name] = function() {};
|
||||
var times = {};
|
||||
if(!console.time)
|
||||
console.time = function(label) {
|
||||
times[label] = Date.now();
|
||||
};
|
||||
if(!console.timeEnd)
|
||||
console.timeEnd = function() {
|
||||
var duration = Date.now() - times[label];
|
||||
console.log('%s: %dms', label, duration);
|
||||
};
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/1.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(1,{
|
||||
/******/2: function(module, exports, require) {
|
||||
webpackJsonp(1, {
|
||||
|
||||
/**! (webpack)\examples\require.context\templates !**/
|
||||
/***/ 1:
|
||||
/*!********************************************!*\
|
||||
!*** ./require.context/templates ^\.\/.*$ ***!
|
||||
\********************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/***/ var map = {"./a.js":3,"./b.js":4,"./c.js":5};
|
||||
/***/ exports = module.exports = function(name) {
|
||||
/***/ return require(exports.id(name) || name)
|
||||
/***/ };
|
||||
/***/ exports.id = function(name) {
|
||||
/***/ return map[name] || map[name+".js"];
|
||||
/***/ };
|
||||
/***/ exports.keys = function() {
|
||||
/***/ return Object.keys(map);
|
||||
/***/ };
|
||||
var map = {
|
||||
"./a.js": 2,
|
||||
"./a": 2,
|
||||
"./b.js": 3,
|
||||
"./b": 3,
|
||||
"./c.js": 4,
|
||||
"./c": 4
|
||||
};
|
||||
module.exports = function webpackContext(req) {
|
||||
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
|
||||
};
|
||||
module.exports.keys = function webpackContextKeys() {
|
||||
return Object.keys(map);
|
||||
};
|
||||
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\a.js !**/
|
||||
/***/ 2:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/a.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/4: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\b.js !**/
|
||||
/***/ 3:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/b.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/5: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\c.js !**/
|
||||
/***/ 4:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/c.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
/***/ }
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -163,61 +157,49 @@ module.exports = function() {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: 559a2edfadb9eaf3802f27ba76f9acac
|
||||
Compile Time: 38ms
|
||||
Chunks: 2
|
||||
Modules: 6
|
||||
Modules including duplicates: 6
|
||||
Modules first chunk: 2
|
||||
main output.js: 2966 chars/bytes
|
||||
1.output.js: 1110 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 271 .\example.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_console.js
|
||||
require (2x) from .\example.js
|
||||
1.output.js
|
||||
2 322 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\example.js
|
||||
3 80 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\example.js
|
||||
4 80 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\example.js
|
||||
5 80 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\example.js
|
||||
Hash: 8001dd58ca639f6177eeb7302f24a770
|
||||
Time: 38ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2291 0 main
|
||||
1.output.js 1427 1
|
||||
chunk {0} output.js (main) 266
|
||||
[0] ./example.js 266 [built] {0}
|
||||
chunk {1} 1.output.js 457 {0}
|
||||
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
|
||||
cjs require context ../require.context/templates [0] ./example.js 3:11-64
|
||||
[2] ./require.context/templates/a.js 80 [built] {1}
|
||||
context element ./a [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./a.js [1] ./require.context/templates ^\.\/.*$
|
||||
[3] ./require.context/templates/b.js 80 [built] {1}
|
||||
context element ./b [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./b.js [1] ./require.context/templates ^\.\/.*$
|
||||
[4] ./require.context/templates/c.js 80 [built] {1}
|
||||
context element ./c [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./c.js [1] ./require.context/templates ^\.\/.*$
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: fb0c194fd339c5e291b48da7893f9db5
|
||||
Compile Time: 267ms
|
||||
Chunks: 2
|
||||
Modules: 6
|
||||
Modules including duplicates: 6
|
||||
Modules first chunk: 2
|
||||
main output.js: 1154 chars/bytes
|
||||
1.output.js: 456 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 160 .\example.js
|
||||
main
|
||||
1 403 (webpack)\buildin\__webpack_console.js
|
||||
require (2x) from .\example.js
|
||||
1.output.js
|
||||
2 213 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\example.js
|
||||
3 73 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\example.js
|
||||
4 73 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\example.js
|
||||
5 73 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\example.js
|
||||
Hash: 8001dd58ca639f6177eeb7302f24a770
|
||||
Time: 121ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 816 0 main
|
||||
1.output.js 494 1
|
||||
chunk {0} output.js (main) 266
|
||||
[0] ./example.js 266 [built] {0}
|
||||
chunk {1} 1.output.js 457 {0}
|
||||
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
|
||||
cjs require context ../require.context/templates [0] ./example.js 3:11-64
|
||||
[2] ./require.context/templates/a.js 80 [built] {1}
|
||||
context element ./a [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./a.js [1] ./require.context/templates ^\.\/.*$
|
||||
[3] ./require.context/templates/b.js 80 [built] {1}
|
||||
context element ./b [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./b.js [1] ./require.context/templates ^\.\/.*$
|
||||
[4] ./require.context/templates/c.js 80 [built] {1}
|
||||
context element ./c [1] ./require.context/templates ^\.\/.*$
|
||||
context element ./c.js [1] ./require.context/templates ^\.\/.*$
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
|
|
@ -16,119 +16,104 @@ module.exports = "It works";
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(document, undefined) {
|
||||
/******/ return function(modules) {
|
||||
/******/ var installedModules = {}, installedChunks = {0:1};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback(require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+chunkId+modules.a;
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ window[modules.b] = function(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i](require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ }
|
||||
/******/})(document)
|
||||
/******/({a:".output.js",b:"webpackJsonp",c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+""+chunkId+".output.js";
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ var installedChunks = {0:1};
|
||||
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i].call(null, require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
|
||||
require(/*! bundle!./file.js */2)(function(fileJsExports) {
|
||||
console.log(fileJsExports);
|
||||
});
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
|
||||
require(/*! bundle!./file.js */ 1)(function(fileJsExports) {
|
||||
console.log(fileJsExports);
|
||||
});
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\buildin\__webpack_console.js !**/
|
||||
/***/ 1:
|
||||
/*!***********************************************************************************************************!*\
|
||||
!*** C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js ***!
|
||||
\***********************************************************************************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
|
||||
module.exports = console;
|
||||
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
|
||||
if(!console[name])
|
||||
console[name] = function() {};
|
||||
var times = {};
|
||||
if(!console.time)
|
||||
console.time = function(label) {
|
||||
times[label] = Date.now();
|
||||
};
|
||||
if(!console.timeEnd)
|
||||
console.timeEnd = function() {
|
||||
var duration = Date.now() - times[label];
|
||||
console.log('%s: %dms', label, duration);
|
||||
};
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\~\bundle-loader!.\file.js !**/
|
||||
|
||||
var cbs = [],
|
||||
data;
|
||||
module.exports = function(cb) {
|
||||
if(cbs) cbs.push(cb);
|
||||
else cb(data);
|
||||
}
|
||||
require.e(1, function(require) {
|
||||
data = require(/*! !.\file.js */3);
|
||||
var callbacks = cbs;
|
||||
cbs = null;
|
||||
for(var i = 0, l = callbacks.length; i < l; i++) {
|
||||
callbacks[i](data);
|
||||
var cbs = [],
|
||||
data;
|
||||
module.exports = function(cb) {
|
||||
if(cbs) cbs.push(cb);
|
||||
else cb(data);
|
||||
}
|
||||
});
|
||||
require.e/*nsure*/(1, function(require) {
|
||||
data = require(/*! !./file.js */ 2);
|
||||
var callbacks = cbs;
|
||||
cbs = null;
|
||||
for(var i = 0, l = callbacks.length; i < l; i++) {
|
||||
callbacks[i](data);
|
||||
}
|
||||
});
|
||||
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/1.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(1,{
|
||||
/******/3: function(module, exports, require) {
|
||||
webpackJsonp(1, {
|
||||
|
||||
/**! .\file.js !**/
|
||||
/***/ 2:
|
||||
/*!*****************!*\
|
||||
!*** ./file.js ***!
|
||||
\*****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = "It works";
|
||||
module.exports = "It works";
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
/***/ }
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -136,53 +121,35 @@ module.exports = "It works";
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: 578af2d2eeef37e82cc9e8248511201d
|
||||
Compile Time: 53ms
|
||||
Chunks: 2
|
||||
Modules: 4
|
||||
Modules including duplicates: 4
|
||||
Modules first chunk: 3
|
||||
main output.js: 3303 chars/bytes
|
||||
1.output.js: 145 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 92 .\example.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_console.js
|
||||
require (1x) from .\example.js
|
||||
2 398 (webpack)\~\bundle-loader!.\file.js
|
||||
require (1x) from .\example.js
|
||||
1.output.js
|
||||
3 28 .\file.js
|
||||
async require (1x) from .\file.js
|
||||
Hash: cc24cfb25787184810a9e9dd0e4c4999
|
||||
Time: 56ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2802 0 main
|
||||
1.output.js 182 1
|
||||
chunk {0} output.js (main) 508
|
||||
[0] ./example.js 86 [built] {0}
|
||||
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 422 [built] {0}
|
||||
cjs require bundle!./file.js [0] ./example.js 1:0-27
|
||||
chunk {1} 1.output.js 28 {0}
|
||||
[2] ./file.js 28 [built] {1}
|
||||
cjs require !!.\file.js [1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 8:8-171
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: 5e7ee4f471c7ea9d20a78d163e3645da
|
||||
Compile Time: 254ms
|
||||
Chunks: 2
|
||||
Modules: 4
|
||||
Modules including duplicates: 4
|
||||
Modules first chunk: 3
|
||||
main output.js: 1221 chars/bytes
|
||||
1.output.js: 54 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 40 .\example.js
|
||||
main
|
||||
1 403 (webpack)\buildin\__webpack_console.js
|
||||
require (1x) from .\example.js
|
||||
2 165 (webpack)\~\bundle-loader!.\file.js
|
||||
require (1x) from .\example.js
|
||||
1.output.js
|
||||
3 26 .\file.js
|
||||
async require (1x) from .\file.js
|
||||
Hash: cc24cfb25787184810a9e9dd0e4c4999
|
||||
Time: 127ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 877 0 main
|
||||
1.output.js 54 1
|
||||
chunk {0} output.js (main) 508
|
||||
[0] ./example.js 86 [built] {0}
|
||||
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 422 [built] {0}
|
||||
cjs require bundle!./file.js [0] ./example.js 1:0-27
|
||||
chunk {1} 1.output.js 28 {0}
|
||||
[2] ./file.js 28 [built] {1}
|
||||
cjs require !!.\file.js [1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 8:8-171
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
|
|
@ -13,101 +13,114 @@ require.ensure(["c"], function(require) {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(document, undefined) {
|
||||
/******/ return function(modules) {
|
||||
/******/ var installedModules = {}, installedChunks = {0:1};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback(require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+chunkId+modules.a;
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ window[modules.b] = function(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i](require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ }
|
||||
/******/})(document)
|
||||
/******/({a:".output.js",b:"webpackJsonp",c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+""+chunkId+".output.js";
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ var installedChunks = {0:1};
|
||||
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i].call(null, require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var a = require(/*! a */2);
|
||||
var b = require(/*! b */1);
|
||||
require.e(1, function(require) {
|
||||
require(/*! b */1).xyz();
|
||||
var d = require(/*! d */4);
|
||||
});
|
||||
var a = require(/*! a */ 2);
|
||||
var b = require(/*! b */ 1);
|
||||
require.e/*nsure*/(1, function(require) {
|
||||
require(/*! b */ 1).xyz();
|
||||
var d = require(/*! d */ 4);
|
||||
});
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\~\b.js !**/
|
||||
/***/ 1:
|
||||
/*!****************!*\
|
||||
!*** ./~/b.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module b
|
||||
// module b
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\~\a.js !**/
|
||||
/***/ 2:
|
||||
/*!****************!*\
|
||||
!*** ./~/a.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module a
|
||||
// module a
|
||||
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/1.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(1,{
|
||||
/******/3: function(module, exports, require) {
|
||||
webpackJsonp(1, {
|
||||
|
||||
/**! .\~\c.js !**/
|
||||
/***/ 3:
|
||||
/*!****************!*\
|
||||
!*** ./~/c.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module c
|
||||
// module c
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/4: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\~\d.js !**/
|
||||
/***/ 4:
|
||||
/*!****************!*\
|
||||
!*** ./~/d.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module d
|
||||
// module d
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
/***/ }
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
Minimized
|
||||
|
@ -121,57 +134,45 @@ webpackJsonp(1,{3:function(){},4:function(){}});
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: f9f9457a3d5544cebb5ce4117187a471
|
||||
Compile Time: 47ms
|
||||
Chunks: 2
|
||||
Modules: 5
|
||||
Modules including duplicates: 5
|
||||
Modules first chunk: 3
|
||||
main output.js: 2286 chars/bytes
|
||||
1.output.js: 229 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 154 .\example.js
|
||||
main
|
||||
1 11 .\~\b.js
|
||||
require (2x) from .\example.js
|
||||
2 11 .\~\a.js
|
||||
require (1x) from .\example.js
|
||||
1.output.js
|
||||
3 11 .\~\c.js
|
||||
async require (1x) from .\example.js
|
||||
4 11 .\~\d.js
|
||||
async require (1x) from .\example.js
|
||||
Hash: e3da5eef20b37553da43a1d3e38f42f5
|
||||
Time: 39ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2456 0 main
|
||||
1.output.js 304 1
|
||||
chunk {0} output.js (main) 161
|
||||
[0] ./example.js 139 [built] {0}
|
||||
[1] ./~/b.js 11 [built] {0}
|
||||
cjs require b [0] ./example.js 2:8-20
|
||||
cjs require b [0] ./example.js 4:4-16
|
||||
[2] ./~/a.js 11 [built] {0}
|
||||
cjs require a [0] ./example.js 1:8-20
|
||||
chunk {1} 1.output.js 22 {0}
|
||||
[3] ./~/c.js 11 [built] {1}
|
||||
require.ensure item c [0] ./example.js 3:0-6:2
|
||||
[4] ./~/d.js 11 [built] {1}
|
||||
cjs require d [0] ./example.js 5:12-24
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: b4b348db91689f6fb88a039e9d987a96
|
||||
Compile Time: 203ms
|
||||
Chunks: 2
|
||||
Modules: 5
|
||||
Modules including duplicates: 5
|
||||
Modules first chunk: 3
|
||||
main output.js: 759 chars/bytes
|
||||
1.output.js: 48 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 72 .\example.js
|
||||
main
|
||||
1 0 .\~\b.js
|
||||
require (2x) from .\example.js
|
||||
2 0 .\~\a.js
|
||||
require (1x) from .\example.js
|
||||
1.output.js
|
||||
3 0 .\~\c.js
|
||||
async require (1x) from .\example.js
|
||||
4 0 .\~\d.js
|
||||
async require (1x) from .\example.js
|
||||
Hash: e3da5eef20b37553da43a1d3e38f42f5
|
||||
Time: 107ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 768 0 main
|
||||
1.output.js 48 1
|
||||
chunk {0} output.js (main) 161
|
||||
[0] ./example.js 139 [built] {0}
|
||||
[1] ./~/b.js 11 [built] {0}
|
||||
cjs require b [0] ./example.js 2:8-20
|
||||
cjs require b [0] ./example.js 4:4-16
|
||||
[2] ./~/a.js 11 [built] {0}
|
||||
cjs require a [0] ./example.js 1:8-20
|
||||
chunk {1} 1.output.js 22 {0}
|
||||
[3] ./~/c.js 11 [built] {1}
|
||||
require.ensure item c [0] ./example.js 3:0-6:2
|
||||
[4] ./~/d.js 11 [built] {1}
|
||||
cjs require d [0] ./example.js 5:12-24
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
|
|
@ -26,96 +26,41 @@ module.exports = 42
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ callback(require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/})
|
||||
/******/({c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ callback.call(null, require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
|
||||
console.log(require(/*! ./cup1.coffee */3));
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
|
||||
console.log(require((function webpackMissingModule() { throw new Error("Cannot find module \"./cup1.coffee\""); }())));
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/**! (webpack)\buildin\__webpack_console.js !**/
|
||||
|
||||
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
|
||||
module.exports = console;
|
||||
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
|
||||
if(!console[name])
|
||||
console[name] = function() {};
|
||||
var times = {};
|
||||
if(!console.time)
|
||||
console.time = function(label) {
|
||||
times[label] = Date.now();
|
||||
};
|
||||
if(!console.timeEnd)
|
||||
console.timeEnd = function() {
|
||||
var duration = Date.now() - times[label];
|
||||
console.log('%s: %dms', label, duration);
|
||||
};
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\~\coffee-loader!.\cup2.coffee !**/
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
|
||||
(function() {
|
||||
|
||||
console.log("yeah coffee-script");
|
||||
|
||||
module.exports = 42;
|
||||
|
||||
}).call(this);
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\~\coffee-loader!.\cup1.coffee !**/
|
||||
|
||||
(function() {
|
||||
|
||||
module.exports = {
|
||||
cool: "stuff",
|
||||
answer: 42,
|
||||
external: require(/*! ./cup2.coffee */2),
|
||||
again: require(/*! ./cup2.coffee */2)
|
||||
};
|
||||
|
||||
}).call(this);
|
||||
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -123,49 +68,39 @@ console.timeEnd = function() {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: 9dcd6efedf6b645ea544a56aa1edd41e
|
||||
Compile Time: 141ms
|
||||
Chunks: 1
|
||||
Modules: 4
|
||||
Modules including duplicates: 4
|
||||
Modules first chunk: 4
|
||||
main output.js: 2366 chars/bytes
|
||||
Hash: a64a4902a56f0ef88c27e073807e4374
|
||||
Time: 19ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 1150 0 main
|
||||
chunk {0} output.js (main) 38
|
||||
[0] ./example.js 38 [built] {0}
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 44 .\example.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_console.js
|
||||
require (1x) from .\example.js
|
||||
require (1x) from .\cup2.coffee
|
||||
2 92 (webpack)\~\coffee-loader!.\cup2.coffee
|
||||
require (2x) from .\cup1.coffee
|
||||
3 180 (webpack)\~\coffee-loader!.\cup1.coffee
|
||||
require (1x) from .\example.js
|
||||
ERROR in .\cup1.coffee
|
||||
Module parse failed: .\cup1.coffee Line 2: Unexpected token :
|
||||
module.exports =
|
||||
cool: "stuff"
|
||||
answer: 42
|
||||
external: require "./cup2.coffee"
|
||||
again: require "./cup2.coffee"
|
||||
@ ./example.js 1:12-36
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: f87b323b005d7bd0a92f3f7cde2344aa
|
||||
Compile Time: 328ms
|
||||
Chunks: 1
|
||||
Modules: 4
|
||||
Modules including duplicates: 4
|
||||
Modules first chunk: 4
|
||||
main output.js: 884 chars/bytes
|
||||
Hash: a64a4902a56f0ef88c27e073807e4374
|
||||
Time: 54ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 403 0 main
|
||||
chunk {0} output.js (main) 38
|
||||
[0] ./example.js 38 [built] {0}
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 24 .\example.js
|
||||
main
|
||||
1 403 (webpack)\buildin\__webpack_console.js
|
||||
require (1x) from .\example.js
|
||||
require (1x) from .\cup2.coffee
|
||||
2 77 (webpack)\~\coffee-loader!.\cup2.coffee
|
||||
require (2x) from .\cup1.coffee
|
||||
3 102 (webpack)\~\coffee-loader!.\cup1.coffee
|
||||
require (1x) from .\example.js
|
||||
ERROR in .\cup1.coffee
|
||||
Module parse failed: .\cup1.coffee Line 2: Unexpected token :
|
||||
module.exports =
|
||||
cool: "stuff"
|
||||
answer: 42
|
||||
external: require "./cup2.coffee"
|
||||
again: require "./cup2.coffee"
|
||||
@ ./example.js 1:12-36
|
||||
```
|
|
@ -31,64 +31,72 @@ exports.add = function() {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ callback(require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/})
|
||||
/******/({c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ callback.call(null, require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var inc = require(/*! ./increment */1).increment;
|
||||
var a = 1;
|
||||
inc(a); // 2
|
||||
var inc = require(/*! ./increment */ 1).increment;
|
||||
var a = 1;
|
||||
inc(a); // 2
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\increment.js !**/
|
||||
/***/ 1:
|
||||
/*!**********************!*\
|
||||
!*** ./increment.js ***!
|
||||
\**********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var add = require(/*! ./math */2).add;
|
||||
exports.increment = function(val) {
|
||||
return add(val, 1);
|
||||
};
|
||||
var add = require(/*! ./math */ 2).add;
|
||||
exports.increment = function(val) {
|
||||
return add(val, 1);
|
||||
};
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\math.js !**/
|
||||
/***/ 2:
|
||||
/*!*****************!*\
|
||||
!*** ./math.js ***!
|
||||
\*****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
exports.add = function() {
|
||||
var sum = 0, i = 0, args = arguments, l = args.length;
|
||||
while (i < l) {
|
||||
sum += args[i++];
|
||||
}
|
||||
return sum;
|
||||
};
|
||||
exports.add = function() {
|
||||
var sum = 0, i = 0, args = arguments, l = args.length;
|
||||
while (i < l) {
|
||||
sum += args[i++];
|
||||
}
|
||||
return sum;
|
||||
};
|
||||
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -96,43 +104,29 @@ exports.add = function() {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: 6db0166b9d91e61d78ba00dd6df13b79
|
||||
Compile Time: 22ms
|
||||
Chunks: 1
|
||||
Modules: 3
|
||||
Modules including duplicates: 3
|
||||
Modules first chunk: 3
|
||||
main output.js: 1414 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 73 .\example.js
|
||||
main
|
||||
1 101 .\increment.js
|
||||
require (1x) from .\example.js
|
||||
2 156 .\math.js
|
||||
require (1x) from .\increment.js
|
||||
Hash: ed0d146781bfd63a8c38eb49000feb94
|
||||
Time: 31ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 1657 0 main
|
||||
chunk {0} output.js (main) 318
|
||||
[0] ./example.js 67 [built] {0}
|
||||
[1] ./increment.js 95 [built] {0}
|
||||
cjs require ./increment [0] ./example.js 1:10-32
|
||||
[2] ./math.js 156 [built] {0}
|
||||
cjs require ./math [1] ./increment.js 1:10-27
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: 5bb0d64ae4ed4d0462683c11c6455963
|
||||
Compile Time: 170ms
|
||||
Chunks: 1
|
||||
Modules: 3
|
||||
Modules including duplicates: 3
|
||||
Modules first chunk: 3
|
||||
main output.js: 504 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 40 .\example.js
|
||||
main
|
||||
1 70 .\increment.js
|
||||
require (1x) from .\example.js
|
||||
2 87 .\math.js
|
||||
require (1x) from .\increment.js
|
||||
Hash: ed0d146781bfd63a8c38eb49000feb94
|
||||
Time: 77ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 524 0 main
|
||||
chunk {0} output.js (main) 318
|
||||
[0] ./example.js 67 [built] {0}
|
||||
[1] ./increment.js 95 [built] {0}
|
||||
cjs require ./increment [0] ./example.js 1:10-32
|
||||
[2] ./math.js 156 [built] {0}
|
||||
cjs require ./math [1] ./increment.js 1:10-27
|
||||
```
|
|
@ -37,153 +37,103 @@ module.exports = function(content) {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ callback(require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/})
|
||||
/******/({c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ callback.call(null, require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(module,console) {
|
||||
// Polyfill require for node.js usage of loaders
|
||||
require = require(/*! enhanced-require */7)(module);
|
||||
/* WEBPACK VAR INJECTION */(function(module) {// Polyfill require for node.js usage of loaders
|
||||
require = require(/*! enhanced-require */ 3)(module);
|
||||
|
||||
// use our loader
|
||||
console.dir(require(/*! ./loader!./file */ 4));
|
||||
|
||||
// use buildin json loader
|
||||
console.dir(require((function webpackMissingModule() { throw new Error("Cannot find module \"./test.json\""); }()))); // default by extension
|
||||
console.dir(require(/*! json!./test.json */ 1)); // manual
|
||||
/* WEBPACK VAR INJECTION */}(require(/*! (webpack)/buildin/module.js */ 2)(module)))
|
||||
|
||||
// use our loader
|
||||
console.dir(require(/*! ./loader!./file */6));
|
||||
/***/ },
|
||||
|
||||
// use buildin json loader
|
||||
console.dir(require(/*! ./test.json */2)); // default by extension
|
||||
console.dir(require(/*! json!./test.json */2)); // manual
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_module */4)(module),require(/*! __webpack_console */1)))
|
||||
/***/ 1:
|
||||
/*!***********************************************************************************************************!*\
|
||||
!*** C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/json-loader!./test.json ***!
|
||||
\***********************************************************************************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_console.js !**/
|
||||
|
||||
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
|
||||
module.exports = console;
|
||||
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
|
||||
if(!console[name])
|
||||
console[name] = function() {};
|
||||
var times = {};
|
||||
if(!console.time)
|
||||
console.time = function(label) {
|
||||
times[label] = Date.now();
|
||||
};
|
||||
if(!console.timeEnd)
|
||||
console.timeEnd = function() {
|
||||
var duration = Date.now() - times[label];
|
||||
console.log('%s: %dms', label, duration);
|
||||
};
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\~\json-loader!.\test.json !**/
|
||||
|
||||
module.exports = {
|
||||
"foobar": 1234
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_amd_require.js !**/
|
||||
|
||||
var req = require.valueOf();
|
||||
function amdRequire(chunk, requiresFn, fn) {
|
||||
if(!requiresFn) {
|
||||
// commonjs
|
||||
return req(chunk);
|
||||
module.exports = {
|
||||
"foobar": 1234
|
||||
}
|
||||
req.e(chunk, function() {
|
||||
var modules = requiresFn();
|
||||
if(fn)
|
||||
return fn.apply(null, modules);
|
||||
});
|
||||
}
|
||||
for(var name in req)
|
||||
amdRequire[name] = req[name];
|
||||
amdRequire.amd = require(/*! ./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js */5);
|
||||
amdRequire.config = function() {/* config is ignored, use webpack options */};
|
||||
module.exports = amdRequire;
|
||||
|
||||
/***/ },
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/4: function(module, exports, require) {
|
||||
/***/ 2:
|
||||
/*!***********************************!*\
|
||||
!*** (webpack)/buildin/module.js ***!
|
||||
\***********************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_module.js !**/
|
||||
|
||||
module.exports = function(module) {
|
||||
if(!module.webpackPolyfill) {
|
||||
module.deprecate = function() {};
|
||||
module.paths = [];
|
||||
// module.parent = undefined by default
|
||||
module.children = [];
|
||||
module.webpackPolyfill = 1;
|
||||
module.exports = function(module) {
|
||||
if(!module.webpackPolyfill) {
|
||||
module.deprecate = function() {};
|
||||
module.paths = [];
|
||||
// module.parent = undefined by default
|
||||
module.children = [];
|
||||
module.webpackPolyfill = 1;
|
||||
}
|
||||
return module;
|
||||
}
|
||||
return module;
|
||||
}
|
||||
|
||||
|
||||
/***/ },
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/5: function(module, exports, require) {
|
||||
/***/ 3:
|
||||
/*!*******************************************!*\
|
||||
!*** (webpack)/buildin/return-require.js ***!
|
||||
\*******************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js !**/
|
||||
module.exports = function() { return require; };
|
||||
|
||||
/* empty to return {} */
|
||||
/***/ },
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/6: function(module, exports, require) {
|
||||
/***/ 4:
|
||||
/*!*****************************!*\
|
||||
!*** ./loader.js!./file.js ***!
|
||||
\*****************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/**! .\loader.js!.\file.js !**/
|
||||
exports.answer = 42;
|
||||
exports.foo = "bar";
|
||||
|
||||
exports.answer = 42;
|
||||
exports.foo = "bar";
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/7: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\~\enhanced-require\lib\require.webpack.js !**/
|
||||
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
module.exports = function() {
|
||||
return require(/*! __webpack_amd_require */3);
|
||||
}
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# Console output
|
||||
|
@ -201,32 +151,25 @@ Prints in node.js (`node example.js`) and in browser:
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: ca21531724184f0e1ca4cf691ca027d1
|
||||
Compile Time: 68ms
|
||||
Chunks: 1
|
||||
Modules: 8
|
||||
Modules including duplicates: 8
|
||||
Modules first chunk: 8
|
||||
main output.js: 3837 chars/bytes
|
||||
Hash: be1bfb66ba06ce71b31bcddbcf2f9965
|
||||
Time: 58ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2922 0 main
|
||||
chunk {0} output.js (main) 674
|
||||
[0] ./example.js 296 [built] {0}
|
||||
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/json-loader!./test.json 36 [built] {0}
|
||||
cjs require json!./test.json [0] ./example.js 9:12-39
|
||||
[2] (webpack)/buildin/module.js 241 [built] {0}
|
||||
cjs require module [0] ./example.js 1:0-132
|
||||
[3] (webpack)/buildin/return-require.js 60 [built] {0}
|
||||
cjs require enhanced-require [0] ./example.js 2:10-37
|
||||
[4] ./loader.js!./file.js 41 [not cacheable] [built] {0}
|
||||
cjs require ./loader!./file [0] ./example.js 5:12-38
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 320 .\example.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_console.js
|
||||
require (3x) from .\example.js
|
||||
2 36 (webpack)\~\json-loader!.\test.json
|
||||
require (1x) from .\example.js
|
||||
require (1x) from .\example.js
|
||||
3 502 (webpack)\buildin\__webpack_amd_require.js
|
||||
require (1x) from (webpack)\~\enhanced-require\lib\require.webpack.js
|
||||
4 241 (webpack)\buildin\__webpack_module.js
|
||||
require (1x) from .\example.js
|
||||
5 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_require.js
|
||||
6 41 .\loader.js!.\file.js
|
||||
require (1x) from .\example.js
|
||||
7 179 (webpack)\~\enhanced-require\lib\require.webpack.js
|
||||
require (1x) from .\example.js
|
||||
ERROR in .\test.json
|
||||
Module parse failed: .\test.json Line 2: Unexpected token :
|
||||
{
|
||||
"foobar": 1234
|
||||
}
|
||||
@ ./example.js 8:12-34
|
||||
```
|
|
@ -51,224 +51,168 @@ require(
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(document, undefined) {
|
||||
/******/ return function(modules) {
|
||||
/******/ var installedModules = {}, installedChunks = {0:1};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback(require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+chunkId+modules.a;
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ window[modules.b] = function(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i](require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ }
|
||||
/******/})(document)
|
||||
/******/({a:".output.js",b:"webpackJsonp",c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+""+chunkId+".output.js";
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ var installedChunks = {0:1};
|
||||
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i].call(null, require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(require) {
|
||||
// CommonJs-style requires
|
||||
var commonjs1 = require(/*! ./commonjs */2);
|
||||
var amd1 = require(/*! ./amd */1);
|
||||
// CommonJs-style requires
|
||||
var commonjs1 = require(/*! ./commonjs */ 2);
|
||||
var amd1 = require(/*! ./amd */ 1);
|
||||
|
||||
// AMD-style requires (with all webpack features)
|
||||
require.e/* require */(1, function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [
|
||||
(require(/*! ./commonjs */ 2)), (require(/*! ./amd */ 1)),
|
||||
require(/*! ../require.context/templates */ 3)("./"+amd1+".js"),
|
||||
Math.random() < 0.5 ? (require(/*! ./commonjs */ 2)) : (require(/*! ./amd */ 1))]; (function(commonjs2, amd2, template, randModule) {
|
||||
// Do something with it...
|
||||
}.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));});
|
||||
|
||||
// AMD-style requires (with all webpack features)
|
||||
require(1, function() { return [
|
||||
require(/*! ./commonjs */2), require(/*! ./amd */1),
|
||||
require(/*! ../require.context/templates */6)("./"+amd1+".js"),
|
||||
Math.random() < 0.5 ? require(/*! ./commonjs */2) : require(/*! ./amd */1)]},
|
||||
function(commonjs2, amd2, template, randModule) {
|
||||
// Do something with it...
|
||||
}
|
||||
);
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_require */3)))
|
||||
/***/ },
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ 1:
|
||||
/*!****************!*\
|
||||
!*** ./amd.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/**! .\amd.js !**/
|
||||
// AMD Module Format
|
||||
{var __WEBPACK_AMD_DEFINE_ARRAY__ = [(require(/*! ./commonjs */ 2))]; var __WEBPACK_AMD_DEFINE_RESULT__ = (function(commonjs1) {
|
||||
// but you can use CommonJs-style requires:
|
||||
var commonjs2 = require(/*! ./commonjs */ 2);
|
||||
// Do something...
|
||||
return 456;
|
||||
}.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)); if(__WEBPACK_AMD_DEFINE_RESULT__ !== undefined) module.exports = __WEBPACK_AMD_DEFINE_RESULT__;};
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(define) {
|
||||
// AMD Module Format
|
||||
define(
|
||||
/*! app/amd */0,
|
||||
[require(/*! ./commonjs */2)],
|
||||
function(commonjs1) {
|
||||
// but you can use CommonJs-style requires:
|
||||
var commonjs2 = require(/*! ./commonjs */2);
|
||||
// Do something...
|
||||
return 456;
|
||||
}
|
||||
);
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_define */4)(module)))
|
||||
/***/ },
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
/***/ 2:
|
||||
/*!*********************!*\
|
||||
!*** ./commonjs.js ***!
|
||||
\*********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/**! .\commonjs.js !**/
|
||||
// CommonJs Module Format
|
||||
module.exports = 123;
|
||||
|
||||
// but you can use amd.style requires
|
||||
require.e/* require */(0/* empty */, function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [(require(/*! ./amd */ 1))]; (function(amd1) {
|
||||
var amd2 = require(/*! ./amd */ 1);
|
||||
}.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));});
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(require) {
|
||||
// CommonJs Module Format
|
||||
module.exports = 123;
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
// but you can use amd.style requires
|
||||
require(
|
||||
0, function() { return [require(/*! ./amd */1)]},
|
||||
function(amd1) {
|
||||
var amd2 = require(/*! ./amd */1);
|
||||
}
|
||||
);
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_require */3)))
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_amd_require.js !**/
|
||||
|
||||
var req = require.valueOf();
|
||||
function amdRequire(chunk, requiresFn, fn) {
|
||||
if(!requiresFn) {
|
||||
// commonjs
|
||||
return req(chunk);
|
||||
}
|
||||
req.e(chunk, function() {
|
||||
var modules = requiresFn();
|
||||
if(fn)
|
||||
return fn.apply(null, modules);
|
||||
});
|
||||
}
|
||||
for(var name in req)
|
||||
amdRequire[name] = req[name];
|
||||
amdRequire.amd = require(/*! ./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js */5);
|
||||
amdRequire.config = function() {/* config is ignored, use webpack options */};
|
||||
module.exports = amdRequire;
|
||||
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/4: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_amd_define.js !**/
|
||||
|
||||
var amdRequire = require(/*! ./__webpack_amd_require */3);
|
||||
module.exports = function(module) {
|
||||
function define(id, dependencies, factory) {
|
||||
if(typeof id != "number") {
|
||||
factory = dependencies;
|
||||
dependencies = id;
|
||||
id = null;
|
||||
}
|
||||
if(!factory) {
|
||||
factory = dependencies;
|
||||
dependencies = [amdRequire, module.exports, module];
|
||||
}
|
||||
var result = typeof factory == "function" ? factory.apply(null, dependencies) : factory;
|
||||
if(result !== undefined)
|
||||
module.exports = result;
|
||||
return module.exports;
|
||||
}
|
||||
define.amd = amdRequire.amd;
|
||||
return define;
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/5: function(module, exports, require) {
|
||||
|
||||
/**! (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js !**/
|
||||
|
||||
/* empty to return {} */
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/1.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(1,{
|
||||
/******/6: function(module, exports, require) {
|
||||
webpackJsonp(1, {
|
||||
|
||||
/**! (webpack)\examples\require.context\templates !**/
|
||||
/***/ 3:
|
||||
/*!************************************************!*\
|
||||
!*** ./require.context/templates ^\.\/.*\.js$ ***!
|
||||
\************************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/***/ var map = {"./a.js":7,"./b.js":8,"./c.js":9};
|
||||
/***/ exports = module.exports = function(name) {
|
||||
/***/ return require(exports.id(name) || name)
|
||||
/***/ };
|
||||
/***/ exports.id = function(name) {
|
||||
/***/ return map[name] || map[name+".js"];
|
||||
/***/ };
|
||||
/***/ exports.keys = function() {
|
||||
/***/ return Object.keys(map);
|
||||
/***/ };
|
||||
var map = {
|
||||
"./a.js": 4,
|
||||
"./b.js": 5,
|
||||
"./c.js": 6
|
||||
};
|
||||
module.exports = function webpackContext(req) {
|
||||
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
|
||||
};
|
||||
module.exports.keys = function webpackContextKeys() {
|
||||
return Object.keys(map);
|
||||
};
|
||||
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/7: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\a.js !**/
|
||||
/***/ 4:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/a.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/8: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\b.js !**/
|
||||
/***/ 5:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/b.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/9: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\examples\require.context\templates\c.js !**/
|
||||
/***/ 6:
|
||||
/*!****************************************!*\
|
||||
!*** ./require.context/templates/c.js ***!
|
||||
\****************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
/***/ }
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -276,43 +220,34 @@ module.exports = function() {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: 2f3233c2358d4ea85d495d5649412ac0
|
||||
Compile Time: 165ms
|
||||
Chunks: 2
|
||||
Modules: 10
|
||||
Modules including duplicates: 10
|
||||
Modules first chunk: 6
|
||||
main output.js: 5001 chars/bytes
|
||||
1.output.js: 1110 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 474 .\example.js
|
||||
main
|
||||
1 235 .\amd.js
|
||||
require (3x) from .\example.js
|
||||
async require (2x) from .\commonjs.js
|
||||
2 207 .\commonjs.js
|
||||
require (3x) from .\example.js
|
||||
require (2x) from .\amd.js
|
||||
3 502 (webpack)\buildin\__webpack_amd_require.js
|
||||
require (1x) from .\example.js
|
||||
require (1x) from .\commonjs.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_define.js
|
||||
4 563 (webpack)\buildin\__webpack_amd_define.js
|
||||
require (1x) from .\amd.js
|
||||
5 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_require.js
|
||||
1.output.js
|
||||
6 322 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\example.js
|
||||
7 80 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\example.js
|
||||
8 80 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\example.js
|
||||
9 80 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\example.js
|
||||
Hash: 578635659acd728459ebbd30abf93f14
|
||||
Time: 49ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 3621 0 main
|
||||
1.output.js 1403 1
|
||||
chunk {0} output.js (main) 728
|
||||
[0] ./example.js 358 [built] {0}
|
||||
[1] ./amd.js 208 [built] {0}
|
||||
amd require ./amd [2] ./commonjs.js 5:0-10:1
|
||||
cjs require ./amd [2] ./commonjs.js 8:13-29
|
||||
cjs require ./amd [0] ./example.js 3:11-27
|
||||
amd require ./amd [0] ./example.js 6:0-13:1
|
||||
amd require ./amd [0] ./example.js 6:0-13:1
|
||||
[2] ./commonjs.js 162 [built] {0}
|
||||
cjs require ./commonjs [0] ./example.js 2:16-37
|
||||
amd require ./commonjs [0] ./example.js 6:0-13:1
|
||||
amd require ./commonjs [0] ./example.js 6:0-13:1
|
||||
amd require ./commonjs [1] ./amd.js 2:0-11:1
|
||||
cjs require ./commonjs [1] ./amd.js 7:18-39
|
||||
chunk {1} 1.output.js 433 {0}
|
||||
[3] ./require.context/templates ^\.\/.*\.js$ 193 [built] {1}
|
||||
amd require context ../require.context/templates [0] ./example.js 6:0-13:1
|
||||
[4] ./require.context/templates/a.js 80 [built] {1}
|
||||
context element ./a.js [3] ./require.context/templates ^\.\/.*\.js$
|
||||
[5] ./require.context/templates/b.js 80 [built] {1}
|
||||
context element ./b.js [3] ./require.context/templates ^\.\/.*\.js$
|
||||
[6] ./require.context/templates/c.js 80 [built] {1}
|
||||
context element ./c.js [3] ./require.context/templates ^\.\/.*\.js$
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
|
|
@ -27,137 +27,146 @@ require.ensure(["b"], function(require) {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(document, undefined) {
|
||||
/******/ return function(modules) {
|
||||
/******/ var installedModules = {}, installedChunks = {0:1};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback(require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+chunkId+modules.a;
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ window[modules.b] = function(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i](require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ }
|
||||
/******/})(document)
|
||||
/******/({a:".output.js",b:"webpackJsonp",c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
|
||||
/******/ if(installedChunks[chunkId] !== undefined)
|
||||
/******/ installedChunks[chunkId].push(callback);
|
||||
/******/ else {
|
||||
/******/ installedChunks[chunkId] = [callback];
|
||||
/******/ var head = document.getElementsByTagName('head')[0];
|
||||
/******/ var script = document.createElement('script');
|
||||
/******/ script.type = 'text/javascript';
|
||||
/******/ script.charset = 'utf-8';
|
||||
/******/ script.src = modules.c+""+chunkId+".output.js";
|
||||
/******/ head.appendChild(script);
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ var installedChunks = {0:1};
|
||||
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
|
||||
/******/ for(var moduleId in moreModules)
|
||||
/******/ modules[moduleId] = moreModules[moduleId];
|
||||
/******/ var callbacks = installedChunks[chunkId];
|
||||
/******/ installedChunks[chunkId] = 1;
|
||||
/******/ for(var i = 0; i < callbacks.length; i++)
|
||||
/******/ callbacks[i].call(null, require);
|
||||
/******/ };
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var a = require(/*! a */1);
|
||||
var a = require(/*! a */ 3);
|
||||
|
||||
require.e/*nsure*/(2, function(require) {
|
||||
// a named chuck
|
||||
var c = require(/*! c */ 4);
|
||||
}, /*! my own chuck */ 0);
|
||||
|
||||
require.e/*nsure*/(1, function(require) {
|
||||
// another chuck with the same name
|
||||
var d = require(/*! d */ 2);
|
||||
}, /*! my own chuck */ 0);
|
||||
|
||||
require.e/*nsure*/(0/* empty */, function(require) {
|
||||
// the same again
|
||||
}, /*! my own chuck */ 0);
|
||||
|
||||
require.e/*nsure*/(1/* duplicate */, function(require) {
|
||||
// chuck without name
|
||||
var d = require(/*! d */ 2);
|
||||
});
|
||||
|
||||
require.e(2, function(require) {
|
||||
// a named chuck
|
||||
var c = require(/*! c */4);
|
||||
}, /*! my own chuck */0);
|
||||
/***/ },
|
||||
|
||||
require.e(2, function(require) {
|
||||
// another chuck with the same name
|
||||
var d = require(/*! d */3);
|
||||
}, /*! my own chuck */0);
|
||||
/***/ 3:
|
||||
/*!****************!*\
|
||||
!*** ./~/a.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
require.e(2, function(require) {
|
||||
// the same again
|
||||
}, /*! my own chuck */0);
|
||||
// module a
|
||||
|
||||
require.e(1, function(require) {
|
||||
// chuck without name
|
||||
var d = require(/*! d */3);
|
||||
});
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
|
||||
/**! .\~\a.js !**/
|
||||
|
||||
// module a
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/1.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(1,{
|
||||
/******/2: function(module, exports, require) {
|
||||
webpackJsonp(1, {
|
||||
|
||||
/**! .\~\b.js !**/
|
||||
/***/ 1:
|
||||
/*!****************!*\
|
||||
!*** ./~/b.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module b
|
||||
// module b
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\~\d.js !**/
|
||||
/***/ 2:
|
||||
/*!****************!*\
|
||||
!*** ./~/d.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module d
|
||||
// module d
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
/***/ }
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
# js/2.output.js
|
||||
|
||||
``` javascript
|
||||
/******/webpackJsonp(2,{
|
||||
/******/2: function(module, exports, require) {
|
||||
webpackJsonp(2, {
|
||||
|
||||
/**! .\~\b.js !**/
|
||||
/***/ 1:
|
||||
/*!****************!*\
|
||||
!*** ./~/b.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module b
|
||||
// module b
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\~\d.js !**/
|
||||
/***/ 4:
|
||||
/*!****************!*\
|
||||
!*** ./~/c.js ***!
|
||||
\****************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// module d
|
||||
// module c
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/4: function(module, exports, require) {
|
||||
/***/ }
|
||||
|
||||
/**! .\~\c.js !**/
|
||||
|
||||
// module c
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -165,33 +174,29 @@ require.e(1, function(require) {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: 28f68bf80483c70750a9e7d6fa895c7d
|
||||
Compile Time: 54ms
|
||||
Chunks: 3
|
||||
Modules: 5
|
||||
Modules including duplicates: 7
|
||||
Modules first chunk: 2
|
||||
main output.js: 2459 chars/bytes
|
||||
1.output.js: 229 chars/bytes
|
||||
my own chuck 2.output.js: 331 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 429 .\example.js
|
||||
main
|
||||
1 11 .\~\a.js
|
||||
require (1x) from .\example.js
|
||||
1.output.js
|
||||
2 11 .\~\b.js
|
||||
async require (3x) from .\example.js
|
||||
3 11 .\~\d.js
|
||||
async require (2x) from .\example.js
|
||||
2.output.js
|
||||
2 11 .\~\b.js
|
||||
async require (3x) from .\example.js
|
||||
3 11 .\~\d.js
|
||||
async require (2x) from .\example.js
|
||||
4 11 .\~\c.js
|
||||
async require (1x) from .\example.js
|
||||
Hash: 7ac2e7d0ae14244993a1334d177f915d
|
||||
Time: 57ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2659 0 main
|
||||
1.output.js 304 1 my own chuck
|
||||
2.output.js 304 2 my own chuck
|
||||
chunk {0} output.js (main) 431
|
||||
[0] ./example.js 420 [built] {0}
|
||||
[3] ./~/a.js 11 [built] {0}
|
||||
cjs require a [0] ./example.js 1:8-20
|
||||
chunk {1} 1.output.js (my own chuck) 22 {0}
|
||||
[1] ./~/b.js 11 [built] {1} {2}
|
||||
require.ensure item b [0] ./example.js 3:0-6:18
|
||||
require.ensure item b [0] ./example.js 8:0-11:18
|
||||
require.ensure item b [0] ./example.js 17:0-20:2
|
||||
[2] ./~/d.js 11 [built] {1}
|
||||
cjs require d [0] ./example.js 10:9-21
|
||||
cjs require d [0] ./example.js 19:9-21
|
||||
chunk {2} 2.output.js (my own chuck) 22 {0}
|
||||
[1] ./~/b.js 11 [built] {1} {2}
|
||||
require.ensure item b [0] ./example.js 3:0-6:18
|
||||
require.ensure item b [0] ./example.js 8:0-11:18
|
||||
require.ensure item b [0] ./example.js 17:0-20:2
|
||||
[4] ./~/c.js 11 [built] {2}
|
||||
cjs require c [0] ./example.js 5:9-21
|
||||
```
|
||||
|
|
|
@ -25,112 +25,105 @@ module.exports = function() {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ callback(require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/})
|
||||
/******/({c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ callback.call(null, require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
|
||||
function getTemplate(templateName) {
|
||||
return require(/*! ./templates */2)("./"+templateName);
|
||||
}
|
||||
console.log(getTemplate("a"));
|
||||
console.log(getTemplate("b"));
|
||||
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
|
||||
function getTemplate(templateName) {
|
||||
return require(/*! ./templates */ 4)("./"+templateName);
|
||||
}
|
||||
console.log(getTemplate("a"));
|
||||
console.log(getTemplate("b"));
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\buildin\__webpack_console.js !**/
|
||||
/***/ 1:
|
||||
/*!************************!*\
|
||||
!*** ./templates/a.js ***!
|
||||
\************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
|
||||
module.exports = console;
|
||||
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
|
||||
if(!console[name])
|
||||
console[name] = function() {};
|
||||
var times = {};
|
||||
if(!console.time)
|
||||
console.time = function(label) {
|
||||
times[label] = Date.now();
|
||||
};
|
||||
if(!console.timeEnd)
|
||||
console.timeEnd = function() {
|
||||
var duration = Date.now() - times[label];
|
||||
console.log('%s: %dms', label, duration);
|
||||
};
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/2: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\templates !**/
|
||||
/***/ 2:
|
||||
/*!************************!*\
|
||||
!*** ./templates/b.js ***!
|
||||
\************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
/***/ var map = {"./a.js":3,"./b.js":4,"./c.js":5};
|
||||
/***/ exports = module.exports = function(name) {
|
||||
/***/ return require(exports.id(name) || name)
|
||||
/***/ };
|
||||
/***/ exports.id = function(name) {
|
||||
/***/ return map[name] || map[name+".js"];
|
||||
/***/ };
|
||||
/***/ exports.keys = function() {
|
||||
/***/ return Object.keys(map);
|
||||
/***/ };
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/3: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\templates\a.js !**/
|
||||
/***/ 3:
|
||||
/*!************************!*\
|
||||
!*** ./templates/c.js ***!
|
||||
\************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template A";
|
||||
}
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/4: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! .\templates\b.js !**/
|
||||
/***/ 4:
|
||||
/*!****************************!*\
|
||||
!*** ./templates ^\.\/.*$ ***!
|
||||
\****************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template B";
|
||||
}
|
||||
var map = {
|
||||
"./a.js": 1,
|
||||
"./a": 1,
|
||||
"./b.js": 2,
|
||||
"./b": 2,
|
||||
"./c.js": 3,
|
||||
"./c": 3
|
||||
};
|
||||
module.exports = function webpackContext(req) {
|
||||
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
|
||||
};
|
||||
module.exports.keys = function webpackContextKeys() {
|
||||
return Object.keys(map);
|
||||
};
|
||||
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/5: function(module, exports, require) {
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/**! .\templates\c.js !**/
|
||||
|
||||
module.exports = function() {
|
||||
return "This text was generated by template C";
|
||||
}
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -138,57 +131,45 @@ module.exports = function() {
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: f37d726cac8a8a4caa9c51bfa3479bc0
|
||||
Compile Time: 31ms
|
||||
Chunks: 1
|
||||
Modules: 6
|
||||
Modules including duplicates: 6
|
||||
Modules first chunk: 6
|
||||
main output.js: 2772 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 157 .\example.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_console.js
|
||||
require (2x) from .\example.js
|
||||
2 322 [context] .\templates
|
||||
context from .\example.js
|
||||
3 80 .\templates\a.js
|
||||
context from .\example.js
|
||||
4 80 .\templates\b.js
|
||||
context from .\example.js
|
||||
5 80 .\templates\c.js
|
||||
context from .\example.js
|
||||
Hash: 1fe0d041cafa3e29d3084946180e73a8
|
||||
Time: 32ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 2408 0 main
|
||||
chunk {0} output.js (main) 603
|
||||
[0] ./example.js 146 [built] {0}
|
||||
[1] ./templates/a.js 80 [built] {0}
|
||||
context element ./a [4] ./templates ^\.\/.*$
|
||||
context element ./a.js [4] ./templates ^\.\/.*$
|
||||
[2] ./templates/b.js 80 [built] {0}
|
||||
context element ./b [4] ./templates ^\.\/.*$
|
||||
context element ./b.js [4] ./templates ^\.\/.*$
|
||||
[3] ./templates/c.js 80 [built] {0}
|
||||
context element ./c [4] ./templates ^\.\/.*$
|
||||
context element ./c.js [4] ./templates ^\.\/.*$
|
||||
[4] ./templates ^\.\/.*$ 217 [built] {0}
|
||||
cjs require context ./templates [0] ./example.js 2:8-44
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: 12af6de63ffb3550246208db321a2c56
|
||||
Compile Time: 239ms
|
||||
Chunks: 1
|
||||
Modules: 6
|
||||
Modules including duplicates: 6
|
||||
Modules first chunk: 6
|
||||
main output.js: 1162 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 110 .\example.js
|
||||
main
|
||||
1 403 (webpack)\buildin\__webpack_console.js
|
||||
require (2x) from .\example.js
|
||||
2 213 [context] .\templates
|
||||
context from .\example.js
|
||||
3 73 .\templates\a.js
|
||||
context from .\example.js
|
||||
4 73 .\templates\b.js
|
||||
context from .\example.js
|
||||
5 73 .\templates\c.js
|
||||
context from .\example.js
|
||||
Hash: 1fe0d041cafa3e29d3084946180e73a8
|
||||
Time: 84ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 873 0 main
|
||||
chunk {0} output.js (main) 603
|
||||
[0] ./example.js 146 [built] {0}
|
||||
[1] ./templates/a.js 80 [built] {0}
|
||||
context element ./a [4] ./templates ^\.\/.*$
|
||||
context element ./a.js [4] ./templates ^\.\/.*$
|
||||
[2] ./templates/b.js 80 [built] {0}
|
||||
context element ./b [4] ./templates ^\.\/.*$
|
||||
context element ./b.js [4] ./templates ^\.\/.*$
|
||||
[3] ./templates/c.js 80 [built] {0}
|
||||
context element ./c [4] ./templates ^\.\/.*$
|
||||
context element ./c.js [4] ./templates ^\.\/.*$
|
||||
[4] ./templates ^\.\/.*$ 217 [built] {0}
|
||||
cjs require context ./templates [0] ./example.js 2:8-44
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
|
|
@ -26,57 +26,63 @@ module.exports = Math.random();
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ callback(require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/})
|
||||
/******/({c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ callback.call(null, require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var a = require(/*! ./a */1);
|
||||
var a = require(/*! ./a */ 1);
|
||||
|
||||
// get module id
|
||||
var aId = /*require.resolve*/(/*! ./a.js */ 1);
|
||||
|
||||
// clear module in require.cache
|
||||
delete require.cache[aId];
|
||||
|
||||
// require module again, it should be reexecuted
|
||||
var a2 = require(/*! ./a */ 1);
|
||||
|
||||
// vertify it
|
||||
if(a == a2) throw new Error("Cache clear failed :(");
|
||||
|
||||
// get module id
|
||||
var aId = (/*! ./a.js */1);
|
||||
/***/ },
|
||||
|
||||
// clear module in require.cache
|
||||
delete require.cache[aId];
|
||||
/***/ 1:
|
||||
/*!**************!*\
|
||||
!*** ./a.js ***!
|
||||
\**************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
// require module again, it should be reexecuted
|
||||
var a2 = require(/*! ./a */1);
|
||||
module.exports = Math.random();
|
||||
|
||||
// vertify it
|
||||
if(a == a2) throw new Error("Cache clear failed :(");
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
|
||||
/**! .\a.js !**/
|
||||
|
||||
module.exports = Math.random();
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# Info
|
||||
|
@ -84,41 +90,29 @@ module.exports = Math.random();
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: df30902a418a948159ac2acfb6d7aad0
|
||||
Compile Time: 21ms
|
||||
Chunks: 1
|
||||
Modules: 2
|
||||
Modules including duplicates: 2
|
||||
Modules first chunk: 2
|
||||
main output.js: 1301 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 286 .\example.js
|
||||
main
|
||||
1 31 .\a.js
|
||||
require (2x) from .\example.js
|
||||
require (1x) from .\example.js
|
||||
Hash: 36093810c3120b88e12bd57e8b271458
|
||||
Time: 28ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 1507 0 main
|
||||
chunk {0} output.js (main) 314
|
||||
[0] ./example.js 283 [built] {0}
|
||||
[1] ./a.js 31 [built] {0}
|
||||
require.resolve ./a.js [0] ./example.js 4:10-35
|
||||
cjs require ./a [0] ./example.js 1:8-22
|
||||
cjs require ./a [0] ./example.js 10:9-23
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: 3e7997ad1d37f38ab08fa290b9b2f638
|
||||
Compile Time: 157ms
|
||||
Chunks: 1
|
||||
Modules: 2
|
||||
Modules including duplicates: 2
|
||||
Modules first chunk: 2
|
||||
main output.js: 431 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 113 .\example.js
|
||||
main
|
||||
1 29 .\a.js
|
||||
require (2x) from .\example.js
|
||||
require (1x) from .\example.js
|
||||
Hash: 36093810c3120b88e12bd57e8b271458
|
||||
Time: 71ms
|
||||
Asset Size Chunks Chunk Names
|
||||
output.js 451 0 main
|
||||
chunk {0} output.js (main) 314
|
||||
[0] ./example.js 283 [built] {0}
|
||||
[1] ./a.js 31 [built] {0}
|
||||
require.resolve ./a.js [0] ./example.js 4:10-35
|
||||
cjs require ./a [0] ./example.js 1:8-22
|
||||
cjs require ./a [0] ./example.js 10:9-23
|
||||
```
|
||||
|
|
|
@ -2,11 +2,10 @@
|
|||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
require = require("enhanced-require")(module);
|
||||
|
||||
var fs = require("fs");
|
||||
var path = require("path");
|
||||
|
||||
module.exports = function(template, filesReq, stdout, prefix) {
|
||||
module.exports = function(template, baseDir, stdout, prefix) {
|
||||
|
||||
var regexp = new RegExp("\\{\\{" + (prefix ? prefix+":" : "") + "([^:\\}]+)\\}\\}", "g")
|
||||
var cwd = process.cwd();
|
||||
|
@ -17,7 +16,7 @@ module.exports = function(template, filesReq, stdout, prefix) {
|
|||
match = match.substr(2 + (prefix ? prefix.length+1 : 0), match.length - 4 - (prefix ? prefix.length+1 : 0));
|
||||
if(match === "stdout")
|
||||
return stdout;
|
||||
return filesReq("./" + match);
|
||||
return fs.readFileSync(path.join(baseDir, match), "utf-8");
|
||||
}).replace(cwd, ".");
|
||||
|
||||
}
|
|
@ -25,52 +25,58 @@ onmessage = function(event) {
|
|||
# js/output.js
|
||||
|
||||
``` javascript
|
||||
/******/(function(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId](module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function(chunkId, callback) {
|
||||
/******/ callback(require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/})
|
||||
/******/({c:"",
|
||||
/******/0: function(module, exports, require) {
|
||||
/******/ (function webpackBootstrap(modules) {
|
||||
/******/ var installedModules = {};
|
||||
/******/ function require(moduleId) {
|
||||
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
|
||||
/******/ if(installedModules[moduleId])
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ exports: {},
|
||||
/******/ id: moduleId,
|
||||
/******/ loaded: false
|
||||
/******/ };
|
||||
/******/ modules[moduleId].call(null, module, module.exports, require);
|
||||
/******/ module.loaded = true;
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/ require.e = function requireEnsure(chunkId, callback) {
|
||||
/******/ callback.call(null, require);
|
||||
/******/ };
|
||||
/******/ require.modules = modules;
|
||||
/******/ require.cache = installedModules;
|
||||
/******/ return require(0);
|
||||
/******/ })({
|
||||
/******/ c: "",
|
||||
|
||||
/**! .\example.js !**/
|
||||
/***/ 0:
|
||||
/*!********************!*\
|
||||
!*** ./example.js ***!
|
||||
\********************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
var Worker = require(/*! worker!./worker */1);
|
||||
var worker = new Worker;
|
||||
worker.postMessage("b");
|
||||
worker.onmessage = function(event) {
|
||||
var templateB = event.data; // "This text was generated by template B"
|
||||
}
|
||||
var Worker = require(/*! worker!./worker */ 1);
|
||||
var worker = new Worker;
|
||||
worker.postMessage("b");
|
||||
worker.onmessage = function(event) {
|
||||
var templateB = event.data; // "This text was generated by template B"
|
||||
}
|
||||
|
||||
/******/},
|
||||
/******/
|
||||
/******/1: function(module, exports, require) {
|
||||
/***/ },
|
||||
|
||||
/**! (webpack)\~\worker-loader!.\worker.js !**/
|
||||
/***/ 1:
|
||||
/*!*************************************************************************************************************!*\
|
||||
!*** C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/worker-loader!./worker.js ***!
|
||||
\*************************************************************************************************************/
|
||||
/***/ function(module, exports, require) {
|
||||
|
||||
module.exports = function() {
|
||||
return new Worker((require.modules.c||'') + "hash.worker.js");
|
||||
}
|
||||
module.exports = function() {
|
||||
return new Worker(require.modules.c + "ee96caf8cd75d7dfea98abc0dabcc23d.worker.js");
|
||||
};
|
||||
|
||||
/***/ }
|
||||
/******/ })
|
||||
|
||||
/******/}
|
||||
/******/})
|
||||
```
|
||||
|
||||
# js/[hash].worker.js
|
||||
|
@ -162,97 +168,43 @@ module.exports = amdRequire;
|
|||
## Uncompressed
|
||||
|
||||
```
|
||||
Hash: a017658b60f538eb1b15676e358061da
|
||||
Compile Time: 70ms
|
||||
Chunks: 1
|
||||
Modules: 2
|
||||
Modules including duplicates: 2
|
||||
Modules first chunk: 2
|
||||
main output.js: 1318 chars/bytes
|
||||
1.hash.worker.js: 1110 chars/bytes
|
||||
hash.worker.js: 2496 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 207 .\example.js
|
||||
main
|
||||
1 96 (webpack)\~\worker-loader!.\worker.js
|
||||
require (1x) from .\example.js
|
||||
Embedded Stats
|
||||
.\worker.js
|
||||
Hash: 5287351eed0ecaf472b73b4bca2c6807
|
||||
Compile Time: 28ms
|
||||
Chunks: 2
|
||||
Modules: 7
|
||||
Modules including duplicates: 7
|
||||
Modules first chunk: 3
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
hash.worker.js
|
||||
0 206 .\worker.js
|
||||
main
|
||||
1 502 (webpack)\buildin\__webpack_amd_require.js
|
||||
require (1x) from .\worker.js
|
||||
2 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_require.js
|
||||
1.hash.worker.js
|
||||
3 322 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\worker.js
|
||||
4 80 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\worker.js
|
||||
5 80 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\worker.js
|
||||
6 80 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\worker.js
|
||||
Hash: 1cc98da1fc32c4cce0b59747baf7d03e
|
||||
Time: 72ms
|
||||
Asset Size Chunks Chunk Names
|
||||
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1701
|
||||
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1424
|
||||
output.js 1774 0 main
|
||||
chunk {0} output.js (main) 325
|
||||
[0] ./example.js 201 [built] {0}
|
||||
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/worker-loader!./worker.js 124 [not cacheable] [built] {0}
|
||||
cjs require worker!./worker [0] ./example.js 1:13-39
|
||||
Child worker:
|
||||
Hash: ee96caf8cd75d7dfea98abc0dabcc23d
|
||||
Asset Size Chunks Chunk Names
|
||||
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1701 0 main
|
||||
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1424 1
|
||||
chunk {0} ee96caf8cd75d7dfea98abc0dabcc23d.worker.js (main) 162
|
||||
chunk {1} [i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 457 {0}
|
||||
```
|
||||
|
||||
## Minimized (uglify-js, no zip)
|
||||
|
||||
```
|
||||
Hash: b00ed9ef0ffbad2cdb698fc88413d6c7
|
||||
Compile Time: 310ms
|
||||
Chunks: 1
|
||||
Modules: 2
|
||||
Modules including duplicates: 2
|
||||
Modules first chunk: 2
|
||||
main output.js: 468 chars/bytes
|
||||
1.hash.worker.js: 456 chars/bytes
|
||||
hash.worker.js: 804 chars/bytes
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
output.js
|
||||
0 101 .\example.js
|
||||
main
|
||||
1 87 (webpack)\~\worker-loader!.\worker.js
|
||||
require (1x) from .\example.js
|
||||
Embedded Stats
|
||||
.\worker.js
|
||||
Hash: 59734387e963771414968c9e4f9bcbeb
|
||||
Compile Time: 233ms
|
||||
Chunks: 2
|
||||
Modules: 7
|
||||
Modules including duplicates: 7
|
||||
Modules first chunk: 3
|
||||
|
||||
<id> <size> <filename>
|
||||
<reason> from <filename>
|
||||
hash.worker.js
|
||||
0 115 .\worker.js
|
||||
main
|
||||
1 271 (webpack)\buildin\__webpack_amd_require.js
|
||||
require (1x) from .\worker.js
|
||||
2 0 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
|
||||
require (1x) from (webpack)\buildin\__webpack_amd_require.js
|
||||
1.hash.worker.js
|
||||
3 213 [context] (webpack)\examples\require.context\templates
|
||||
async context from .\worker.js
|
||||
4 73 (webpack)\examples\require.context\templates\a.js
|
||||
async context from .\worker.js
|
||||
5 73 (webpack)\examples\require.context\templates\b.js
|
||||
async context from .\worker.js
|
||||
6 73 (webpack)\examples\require.context\templates\c.js
|
||||
async context from .\worker.js
|
||||
Hash: 1cc98da1fc32c4cce0b59747baf7d03e
|
||||
Time: 168ms
|
||||
Asset Size Chunks Chunk Names
|
||||
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 586
|
||||
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 492
|
||||
output.js 510 0 main
|
||||
chunk {0} output.js (main) 325
|
||||
[0] ./example.js 201 [built] {0}
|
||||
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/worker-loader!./worker.js 124 [not cacheable] [built] {0}
|
||||
cjs require worker!./worker [0] ./example.js 1:13-39
|
||||
Child worker:
|
||||
Hash: ee96caf8cd75d7dfea98abc0dabcc23d
|
||||
Asset Size Chunks Chunk Names
|
||||
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 586 0 main
|
||||
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 492 1
|
||||
chunk {0} ee96caf8cd75d7dfea98abc0dabcc23d.worker.js (main) 162
|
||||
chunk {1} [i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 457 {0}
|
||||
```
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ConstDependency = require("./dependencies/ConstDependency");
|
||||
|
||||
function APIPlugin() {
|
||||
}
|
||||
module.exports = APIPlugin;
|
||||
|
||||
var REPLACEMENTS = {
|
||||
__webpack_public_path__: "require.modules.c",
|
||||
__webpack_require__: "require",
|
||||
__webpack_modules__: "require.modules",
|
||||
__webpack_chunk_load__: "require.e",
|
||||
};
|
||||
var IGNORES = [
|
||||
"call require.valueOf",
|
||||
];
|
||||
APIPlugin.prototype.apply = function(compiler) {
|
||||
Object.keys(REPLACEMENTS).forEach(function(key) {
|
||||
compiler.parser.plugin("expression "+key, function(expr) {
|
||||
var dep = new ConstDependency(REPLACEMENTS[key], expr.range);
|
||||
dep.loc = expr.loc;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
});
|
||||
});
|
||||
IGNORES.forEach(function(key) {
|
||||
compiler.parser.plugin(key, function(expr) {
|
||||
return true;
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function AbstractPlugin(plugins) {
|
||||
this._plugins = plugins || {};
|
||||
}
|
||||
module.exports = AbstractPlugin;
|
||||
|
||||
AbstractPlugin.create = function(plugins) {
|
||||
function Plugin() {
|
||||
AbstractPlugin.call(this, plugins)
|
||||
}
|
||||
Plugin.prototype = Object.create(AbstractPlugin.prototype);
|
||||
return Plugin;
|
||||
}
|
||||
|
||||
AbstractPlugin.prototype.apply = function(object) {
|
||||
for(var name in this._plugins) {
|
||||
object.plugin(name, this._plugins[name]);
|
||||
}
|
||||
};
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function ArrayMap() {
|
||||
this.keys = [];
|
||||
this.values = [];
|
||||
}
|
||||
module.exports = ArrayMap;
|
||||
|
||||
ArrayMap.prototype.get = function(key) {
|
||||
for(var i = 0; i < this.keys.length; i++) {
|
||||
if(this.keys[i] === key) {
|
||||
return this.values[i];
|
||||
}
|
||||
}
|
||||
return;
|
||||
};
|
||||
|
||||
ArrayMap.prototype.set = function(key, value) {
|
||||
for(var i = 0; i < this.keys.length; i++) {
|
||||
if(this.keys[i] === key) {
|
||||
this.values[i] = value;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
this.keys.push(key);
|
||||
this.values.push(value);
|
||||
return this;
|
||||
};
|
||||
|
||||
ArrayMap.prototype.remove = function(key, value) {
|
||||
for(var i = 0; i < this.keys.length; i++) {
|
||||
if(this.keys[i] === key) {
|
||||
this.keys.splice(i, 1);
|
||||
this.values.splice(i, 1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
ArrayMap.prototype.clone = function() {
|
||||
var newMap = new ArrayMap();
|
||||
for(var i = 0; i < this.keys.length; i++) {
|
||||
newMap.keys.push(this.keys[i]);
|
||||
newMap.values.push(this.values[i]);
|
||||
}
|
||||
return newMap;
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var DependenciesBlock = require("./DependenciesBlock");
|
||||
|
||||
function AsyncDependenciesBlock(name) {
|
||||
DependenciesBlock.call(this);
|
||||
this.name = name;
|
||||
this.chunk = null;
|
||||
}
|
||||
module.exports = AsyncDependenciesBlock;
|
||||
|
||||
AsyncDependenciesBlock.prototype = Object.create(DependenciesBlock.prototype);
|
||||
|
||||
AsyncDependenciesBlock.prototype.updateHash = function updateHash(hash) {
|
||||
hash.update(this.name || "");
|
||||
DependenciesBlock.prototype.updateHash.call(this, hash);
|
||||
};
|
||||
|
||||
AsyncDependenciesBlock.prototype.disconnect = function() {
|
||||
this.chunk = null;
|
||||
DependenciesBlock.prototype.disconnect.call(this);
|
||||
};
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function BasicEvaluatedExpression() {
|
||||
this.range = null;
|
||||
}
|
||||
module.exports = BasicEvaluatedExpression;
|
||||
|
||||
BasicEvaluatedExpression.prototype.isString = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "string");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.isNumber = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "number");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.isBoolean = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "bool");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.isRegExp = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "regExp");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.isConditional = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "options");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.isArray = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "items");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.isWrapped = function() {
|
||||
return Object.prototype.hasOwnProperty.call(this, "prefix");
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setString = function(str) {
|
||||
if(str === null)
|
||||
delete this.string;
|
||||
else
|
||||
this.string = str;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setNumber = function(num) {
|
||||
if(num === null)
|
||||
delete this.number;
|
||||
else
|
||||
this.number = num;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setBoolean = function(bool) {
|
||||
if(bool === null)
|
||||
delete this.bool;
|
||||
else
|
||||
this.bool = bool;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setRegExp = function(regExp) {
|
||||
if(regExp === null)
|
||||
delete this.regExp;
|
||||
else
|
||||
this.regExp = regExp;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setWrapped = function(prefix, postfix) {
|
||||
this.prefix = prefix;
|
||||
this.postfix = postfix;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.unsetWrapped = function() {
|
||||
delete this.prefix;
|
||||
delete this.postfix;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setOptions = function(options) {
|
||||
if(options === null)
|
||||
delete this.options;
|
||||
else
|
||||
this.options = options;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setItems = function(items) {
|
||||
if(items === null)
|
||||
delete this.items;
|
||||
else
|
||||
this.items = items;
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.addOptions = function(options) {
|
||||
if(!this.options) this.options = [];
|
||||
options.forEach(function(item) {
|
||||
this.options.push(item);
|
||||
}, this);
|
||||
return this;
|
||||
};
|
||||
BasicEvaluatedExpression.prototype.setRange = function(range) {
|
||||
this.range = range;
|
||||
return this;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var async = require("async");
|
||||
|
||||
function CachePlugin(cache) {
|
||||
this.cache = cache || {};
|
||||
}
|
||||
module.exports = CachePlugin;
|
||||
|
||||
CachePlugin.prototype.apply = function(compiler) {
|
||||
compiler.plugin("compilation", function(compilation) {
|
||||
compilation.cache = this.cache;
|
||||
}.bind(this));
|
||||
compiler.plugin("run", function(compiler, callback) {
|
||||
if(!compiler._lastCompilationFileDependencies) return callback();
|
||||
var fs = compiler.inputFileSystem;
|
||||
fileTs = compiler.fileTimestamps = {};
|
||||
async.forEach(compiler._lastCompilationFileDependencies, function(file, callback) {
|
||||
fs.stat(file, function(err, stat) {
|
||||
if(err) return callback(err);
|
||||
|
||||
fileTs[file] = stat.mtime || Infinity;
|
||||
callback();
|
||||
});
|
||||
}, callback);
|
||||
}.bind(this));
|
||||
compiler.plugin("after-compile", function(compilation, callback) {
|
||||
compilation.compiler._lastCompilationFileDependencies = compilation.fileDependencies;
|
||||
compilation.compiler._lastCompilationContextDependencies = compilation.contextDependencies;
|
||||
callback();
|
||||
}.bind(this));
|
||||
};
|
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function Chunk(name) {
|
||||
this.id = null;
|
||||
this.name = name;
|
||||
this.modules = [];
|
||||
this.chunks = [];
|
||||
this.parents = [];
|
||||
this.blocks = [];
|
||||
}
|
||||
module.exports = Chunk;
|
||||
|
||||
Chunk.prototype.addModule = function(module) {
|
||||
if(this.modules.indexOf(module) >= 0) return false;
|
||||
this.modules.push(module);
|
||||
return true;
|
||||
};
|
||||
|
||||
Chunk.prototype.removeModule = function(module) {
|
||||
var idx = this.modules.indexOf(module);
|
||||
if(idx >= 0) {
|
||||
this.modules.splice(idx, 1);
|
||||
module.removeChunk(this);
|
||||
}
|
||||
};
|
||||
|
||||
Chunk.prototype.addChunk = function(chunk) {
|
||||
if(this.chunks.indexOf(chunk) >= 0) return false;
|
||||
this.chunks.push(chunk);
|
||||
return true;
|
||||
};
|
||||
|
||||
Chunk.prototype.removeChunk = function(chunk) {
|
||||
var idx = this.chunks.indexOf(chunk);
|
||||
if(idx >= 0) {
|
||||
this.chunks.splice(idx, 1);
|
||||
chunk.removeParent(this);
|
||||
}
|
||||
};
|
||||
|
||||
Chunk.prototype.addParent = function(chunk) {
|
||||
if(this.parents.indexOf(chunk) >= 0) return false;
|
||||
this.parents.push(chunk);
|
||||
return true;
|
||||
};
|
||||
|
||||
Chunk.prototype.removeParent = function(chunk) {
|
||||
var idx = this.parents.indexOf(chunk);
|
||||
if(idx >= 0) {
|
||||
this.parents.splice(idx, 1);
|
||||
chunk.removeChunk(this);
|
||||
}
|
||||
};
|
||||
|
||||
Chunk.prototype.addBlock = function(block) {
|
||||
if(this.blocks.indexOf(block) >= 0) return false;
|
||||
this.blocks.push(block);
|
||||
return true;
|
||||
};
|
||||
|
||||
Chunk.prototype.remove = function(reason) {
|
||||
// console.log("remove " + this.toString());
|
||||
this.modules.slice().forEach(function(m) {
|
||||
m.removeChunk(this);
|
||||
}, this);
|
||||
this.parents.forEach(function(c) {
|
||||
var idx = c.chunks.indexOf(this);
|
||||
if(idx >= 0)
|
||||
c.chunks.splice(idx, 1);
|
||||
this.chunks.forEach(function(cc) {
|
||||
cc.addParent(c);
|
||||
});
|
||||
}, this);
|
||||
this.chunks.forEach(function(c) {
|
||||
var idx = c.parents.indexOf(this);
|
||||
if(idx >= 0)
|
||||
c.parents.splice(idx, 1);
|
||||
this.parents.forEach(function(cc) {
|
||||
cc.addChunk(c);
|
||||
});
|
||||
}, this);
|
||||
this.blocks.forEach(function(b) {
|
||||
b.chunk = null;
|
||||
b.chunkReason = reason;
|
||||
}, this);
|
||||
};
|
||||
|
||||
Chunk.prototype.integrate = function(other, reason) {
|
||||
// console.log("integrate " + other.toString() + " into " + this.toString());
|
||||
var otherModules = other.modules.slice();
|
||||
otherModules.forEach(function(m) {
|
||||
m.removeChunk(other);
|
||||
m.addChunk(this);
|
||||
this.addModule(m);
|
||||
}, this);
|
||||
other.modules.length = 0;
|
||||
other.parents.forEach(function(c) {
|
||||
var idx = c.chunks.indexOf(other);
|
||||
if(idx >= 0)
|
||||
c.chunks.splice(idx, 1);
|
||||
if(c !== this && this.addParent(c))
|
||||
c.addChunk(this);
|
||||
}, this);
|
||||
other.parents.length = 0;
|
||||
other.chunks.forEach(function(c) {
|
||||
var idx = c.parents.indexOf(other);
|
||||
if(idx >= 0)
|
||||
c.parents.splice(idx, 1);
|
||||
if(c !== this && this.addChunk(c))
|
||||
c.addParent(this);
|
||||
}, this);
|
||||
other.chunks.length = 0;
|
||||
other.blocks.forEach(function(b) {
|
||||
b.chunk = this;
|
||||
b.chunkReason = reason;
|
||||
this.addBlock(b);
|
||||
}, this);
|
||||
other.blocks.length = 0;
|
||||
};
|
||||
|
||||
Chunk.prototype.isEmpty = function() {
|
||||
return (this.modules.length == 0);
|
||||
};
|
||||
|
||||
Chunk.prototype.updateHash = function(hash) {
|
||||
hash.update(this.id + "");
|
||||
this.modules.forEach(function(m) {
|
||||
m.updateHash(hash);
|
||||
});
|
||||
};
|
||||
|
||||
Chunk.prototype.toString = function() {
|
||||
return "Chunk[" + this.modules.join() + "]";
|
||||
};
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var WrapSource = require("./WrapSource");
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function CommonJsMainTemplateDecorator(mainTemplate) {
|
||||
this.mainTemplate = mainTemplate;
|
||||
}
|
||||
module.exports = CommonJsMainTemplateDecorator;
|
||||
CommonJsMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
|
||||
var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates);
|
||||
var prefix = "module.exports =\n";
|
||||
return new WrapSource(new RawSource(prefix), source, new RawSource(""));
|
||||
};
|
||||
CommonJsMainTemplateDecorator.prototype.updateHash = function(hash) {
|
||||
hash.update("common-js");
|
||||
this.mainTemplate.updateHash(hash);
|
||||
};
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var path = require("path");
|
||||
|
||||
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
|
||||
|
||||
function CompatibilityPlugin() {
|
||||
}
|
||||
module.exports = CompatibilityPlugin;
|
||||
|
||||
CompatibilityPlugin.prototype.apply = function(compiler) {
|
||||
compiler.resolvers.normal.apply(
|
||||
new ModuleAliasPlugin({
|
||||
"enhanced-require": path.join(__dirname, "..", "buildin", "return-require.js")
|
||||
})
|
||||
);
|
||||
};
|
|
@ -0,0 +1,490 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var async = require("async");
|
||||
|
||||
var Tapable = require("tapable");
|
||||
var Parser = require("./Parser");
|
||||
var Dependency = require("./Dependency");
|
||||
var EntryModuleNotFoundError = require("./EntryModuleNotFoundError");
|
||||
var ModuleNotFoundError = require("./ModuleNotFoundError");
|
||||
var Module = require("./Module");
|
||||
var ArrayMap = require("./ArrayMap");
|
||||
var Chunk = require("./Chunk");
|
||||
var Stats = require("./Stats");
|
||||
|
||||
function Compilation(compiler) {
|
||||
Tapable.call(this);
|
||||
this.compiler = compiler;
|
||||
this.mainTemplate = compiler.mainTemplate;
|
||||
this.chunkTemplate = compiler.chunkTemplate;
|
||||
this.moduleTemplate = compiler.moduleTemplate;
|
||||
this.options = compiler.options;
|
||||
this.resolvers = compiler.resolvers;
|
||||
this.inputFileSystem = compiler.inputFileSystem;
|
||||
var options = compiler.options;
|
||||
this.outputOptions = options && options.output;
|
||||
this.bail = options && options.bail;
|
||||
this.entries = [];
|
||||
this.chunks = [];
|
||||
this.namedChunks = {};
|
||||
this.modules = [];
|
||||
this._modules = {};
|
||||
this.cache = null;
|
||||
this.assets = {};
|
||||
this.errors = [];
|
||||
this.warnings = [];
|
||||
this.children = [];
|
||||
this.dependencyFactories = new ArrayMap();
|
||||
this.dependencyTemplates = new ArrayMap();
|
||||
}
|
||||
module.exports = Compilation;
|
||||
|
||||
Compilation.prototype = Object.create(Tapable.prototype);
|
||||
Compilation.prototype.addModule = function(module) {
|
||||
var identifier = module.identifier();
|
||||
if(this._modules[identifier]) return false;
|
||||
if(this.cache && this.cache[identifier]) {
|
||||
var cacheModule = this.cache[identifier];
|
||||
|
||||
var rebuild = true;
|
||||
if(!cacheModule.error && cacheModule.cacheable && this.fileTimestamps && this.contextTimestamps) {
|
||||
rebuild = cacheModule.needRebuild(this.fileTimestamps, this.contextTimestamps);
|
||||
}
|
||||
|
||||
if(!rebuild) {
|
||||
cacheModule.disconnect();
|
||||
this._modules[identifier] = cacheModule;
|
||||
this.modules.push(cacheModule);
|
||||
return cacheModule;
|
||||
}
|
||||
}
|
||||
this._modules[identifier] = module;
|
||||
if(this.cache) this.cache[identifier] = module;
|
||||
this.modules.push(module);
|
||||
return true;
|
||||
};
|
||||
|
||||
Compilation.prototype.getModule = function(module) {
|
||||
var identifier = module.identifier();
|
||||
return this._modules[identifier];
|
||||
};
|
||||
|
||||
Compilation.prototype.buildModule = function(module, callback) {
|
||||
this.applyPlugins("build-module", module);
|
||||
module.build(this.options, this, this.resolvers.normal, this.inputFileSystem, function(err) {
|
||||
if(err) {
|
||||
this.applyPlugins("failed-module", module);
|
||||
return callback(err);
|
||||
}
|
||||
this.applyPlugins("succeed-module", module);
|
||||
return callback();
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Compilation.prototype.processModuleDependencies = function(module, callback) {
|
||||
var errorAndCallback = this.bail ? function errorAndCallback(err) {
|
||||
callback(err);
|
||||
} : function errorAndCallback(err) {
|
||||
this.errors.push(err);
|
||||
callback();
|
||||
}.bind(this);
|
||||
|
||||
var dependencies = [];
|
||||
function addDependency(dep) {
|
||||
for(var i = 0; i < dependencies.length; i++) {
|
||||
if(dep.isEqualResource(dependencies[i][0]))
|
||||
return dependencies[i].push(dep);
|
||||
}
|
||||
dependencies.push([dep]);
|
||||
}
|
||||
function addDependenciesBlock(block) {
|
||||
block.dependencies.forEach(addDependency);
|
||||
block.blocks.forEach(addDependenciesBlock);
|
||||
block.variables.forEach(function(v) {
|
||||
v.dependencies.forEach(addDependency);
|
||||
});
|
||||
}
|
||||
addDependenciesBlock(module);
|
||||
var factories = [];
|
||||
for(var i = 0; i < dependencies.length; i++) {
|
||||
var factory = this.dependencyFactories.get(dependencies[i][0].Class);
|
||||
if(!factory)
|
||||
return callback(new Error("No module factory availible for dependency type: " + dependencies[i][0].Class.name));
|
||||
factories[i] = [factory, dependencies[i]];
|
||||
}
|
||||
async.forEach(factories, function(item, callback) {
|
||||
var dependencies = item[1];
|
||||
var errorAndCallback = function errorAndCallback(err) {
|
||||
err.dependencies = dependencies;
|
||||
err.origin = module;
|
||||
this.errors.push(err);
|
||||
callback();
|
||||
}.bind(this);
|
||||
var warningAndCallback = function warningAndCallback(err) {
|
||||
err.dependencies = dependencies;
|
||||
err.origin = module;
|
||||
this.warnings.push(err);
|
||||
callback();
|
||||
}.bind(this);
|
||||
|
||||
var factory = item[0];
|
||||
factory.create(module.context, dependencies[0], function(err, dependantModule) {
|
||||
function isOptional() {
|
||||
return dependencies.filter(function(d) { return !d.optional }).length > 0;
|
||||
}
|
||||
function errorOrWarningAndCallback(err) {
|
||||
if(isOptional())
|
||||
return errorAndCallback(err);
|
||||
else
|
||||
return warningAndCallback(err);
|
||||
}
|
||||
if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err));
|
||||
if(!dependantModule) return callback();
|
||||
|
||||
var newModule = this.addModule(dependantModule);
|
||||
|
||||
if(!newModule) {
|
||||
dependantModule = this.getModule(dependantModule);
|
||||
|
||||
dependencies.forEach(function(dep) {
|
||||
dep.module = dependantModule;
|
||||
dependantModule.addReason(module, dep);
|
||||
});
|
||||
|
||||
return callback();
|
||||
}
|
||||
|
||||
if(newModule instanceof Module) { // from cache
|
||||
dependantModule = newModule;
|
||||
|
||||
dependencies.forEach(function(dep) {
|
||||
dep.module = dependantModule;
|
||||
dependantModule.addReason(module, dep);
|
||||
});
|
||||
|
||||
return this.processModuleDependencies(dependantModule, callback);
|
||||
}
|
||||
|
||||
this.buildModule(dependantModule, function(err) {
|
||||
if(err) return errorOrWarningAndCallback(err);
|
||||
|
||||
dependencies.forEach(function(dep) {
|
||||
dep.module = dependantModule;
|
||||
dependantModule.addReason(module, dep);
|
||||
});
|
||||
|
||||
this.processModuleDependencies(dependantModule, callback);
|
||||
}.bind(this));
|
||||
|
||||
}.bind(this));
|
||||
}.bind(this), function(err) {
|
||||
if(err) callback(err);
|
||||
|
||||
return callback();
|
||||
});
|
||||
};
|
||||
|
||||
Compilation.prototype.addEntry = function process(context, entry, name, callback) {
|
||||
var errorAndCallback = this.bail ? function errorAndCallback(err) {
|
||||
callback(err);
|
||||
} : function errorAndCallback(err) {
|
||||
err.dependencies = [entry];
|
||||
this.errors.push(err);
|
||||
callback();
|
||||
}.bind(this);
|
||||
|
||||
if(!(entry instanceof Dependency))
|
||||
return callback(new Error("Parameter 'entry' must be a Dependency"));
|
||||
|
||||
var moduleFactory = this.dependencyFactories.get(entry.Class);
|
||||
if(!moduleFactory)
|
||||
return callback(new Error("No dependency factory availible for this entry dependency type: " + entry.Class.name));
|
||||
|
||||
moduleFactory.create(context, entry, function(err, module) {
|
||||
if(err) return errorAndCallback(new EntryModuleNotFoundError(err));
|
||||
|
||||
var result = this.addModule(module);
|
||||
if(!result) {
|
||||
return callback(new Error("Entry module is already added"));
|
||||
}
|
||||
|
||||
if(result instanceof Module) {
|
||||
module = result;
|
||||
}
|
||||
|
||||
this.entries.push(module);
|
||||
module.id = 0;
|
||||
|
||||
if(result instanceof Module) {
|
||||
entryReady.call(this);
|
||||
} else {
|
||||
this.buildModule(module, function(err) {
|
||||
if(err) return errorAndCallback(err);
|
||||
|
||||
entryReady.call(this);
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
function entryReady() {
|
||||
this.processModuleDependencies(module, function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
var chunk = this.addChunk(name);
|
||||
chunk.id = 0;
|
||||
chunk.entry = true;
|
||||
chunk.addModule(module);
|
||||
module.addChunk(chunk);
|
||||
this.processDependenciesBlockForChunk(module, chunk);
|
||||
return callback();
|
||||
}.bind(this));
|
||||
}
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Compilation.prototype.seal = function seal(callback) {
|
||||
this.applyPlugins("seal");
|
||||
this.applyPlugins("optimize");
|
||||
this.applyPlugins("optimize-modules", this.modules);
|
||||
this.applyPlugins("after-optimize-modules", this.modules);
|
||||
this.applyPlugins("optimize-chunks", this.chunks);
|
||||
this.applyPlugins("after-optimize-chunks", this.chunks);
|
||||
this.applyModuleIds();
|
||||
this.applyChunkIds();
|
||||
this.sortItems();
|
||||
this.createChunkAssets();
|
||||
this.summarizeDependencies();
|
||||
this.applyPluginsAsync("optimize-chunk-assets", this.chunks, function(err) {
|
||||
if(err) return callback(err);
|
||||
this.applyPluginsAsync("optimize-assets", this.assets, function(err) {
|
||||
if(err) return callback(err);
|
||||
this.applyPlugins("after-optimize-assets", this.assets);
|
||||
return callback();
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Compilation.prototype.addChunk = function addChunk(name) {
|
||||
if(name) {
|
||||
if(Object.prototype.hasOwnProperty(this.namedChunks, name))
|
||||
return this.namedChunks[name];
|
||||
}
|
||||
var chunk = new Chunk(name);
|
||||
this.chunks.push(chunk);
|
||||
if(name) {
|
||||
this.namedChunks[name] = chunk;
|
||||
}
|
||||
return chunk;
|
||||
};
|
||||
|
||||
Compilation.prototype.processDependenciesBlockForChunk = function processDependenciesBlockForChunk(block, chunk) {
|
||||
block.blocks.forEach(function(b) {
|
||||
var c;
|
||||
if(!b.chunk) {
|
||||
c = this.addChunk(b.chunkName);
|
||||
b.chunk = c;
|
||||
c.addBlock(b);
|
||||
} else {
|
||||
c = b.chunk;
|
||||
}
|
||||
chunk.addChunk(c);
|
||||
c.addParent(chunk);
|
||||
this.processDependenciesBlockForChunk(b, c);
|
||||
}, this);
|
||||
function iteratorDependency(d) {
|
||||
if(!d.module) return;
|
||||
if(d.module.error) {
|
||||
d.module = null;
|
||||
return;
|
||||
}
|
||||
if(chunk.addModule(d.module)) {
|
||||
d.module.addChunk(chunk);
|
||||
this.processDependenciesBlockForChunk(d.module, chunk);
|
||||
}
|
||||
}
|
||||
block.dependencies.forEach(iteratorDependency, this);
|
||||
block.variables.forEach(function(v) {
|
||||
v.dependencies.forEach(iteratorDependency, this);
|
||||
}, this);
|
||||
};
|
||||
|
||||
Compilation.prototype.applyModuleIds = function applyModuleIds() {
|
||||
var i = 0;
|
||||
function entryChunks(m) {
|
||||
return m.chunks.filter(function(c) {
|
||||
return c.entry;
|
||||
}).length;
|
||||
}
|
||||
function occursInEntry(m) {
|
||||
return m.reasons.map(function(r) {
|
||||
if(!r.module) return 0;
|
||||
return entryChunks(r.module);
|
||||
}).reduce(function(a, b) { return a+b; }, 0) + entryChunks(m);
|
||||
}
|
||||
function occurs(m) {
|
||||
return m.reasons.map(function(r) {
|
||||
if(!r.module) return 0;
|
||||
return r.module.chunks.length;
|
||||
}).reduce(function(a, b) { return a+b; }, 0) + m.chunks.length;
|
||||
}
|
||||
this.modules.sort(function(a, b) {
|
||||
var aEntryOccurs = occursInEntry(a);
|
||||
var bEntryOccurs = occursInEntry(b);
|
||||
if(aEntryOccurs > bEntryOccurs) return -1;
|
||||
if(aEntryOccurs < bEntryOccurs) return 1;
|
||||
var aOccurs = occurs(a);
|
||||
var bOccurs = occurs(b);
|
||||
if(aOccurs > bOccurs) return -1;
|
||||
if(aOccurs < bOccurs) return 1;
|
||||
if(a.identifier() > b.identifier()) return 1;
|
||||
if(a.identifier() < b.identifier()) return -1;
|
||||
return 0;
|
||||
});
|
||||
this.modules.forEach(function(module) {
|
||||
if(module.id === null)
|
||||
module.id = ++i;
|
||||
});
|
||||
};
|
||||
|
||||
Compilation.prototype.applyChunkIds = function applyChunkIds() {
|
||||
var i = 0;
|
||||
function occursInEntry(c) {
|
||||
return c.parents.filter(function(p) {
|
||||
return p.entry;
|
||||
}).length;
|
||||
}
|
||||
function occurs(c) {
|
||||
return c.blocks.length;
|
||||
}
|
||||
this.chunks.forEach(function(c) {
|
||||
c.modules.sort(function(a, b) {
|
||||
if(a.identifier() > b.identifier()) return 1;
|
||||
if(a.identifier() < b.identifier()) return -1;
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
this.chunks.sort(function(a, b) {
|
||||
var aEntryOccurs = occursInEntry(a);
|
||||
var bEntryOccurs = occursInEntry(b);
|
||||
if(aEntryOccurs > bEntryOccurs) return -1;
|
||||
if(aEntryOccurs < bEntryOccurs) return 1;
|
||||
var aOccurs = occurs(a);
|
||||
var bOccurs = occurs(b);
|
||||
if(aOccurs > bOccurs) return -1;
|
||||
if(aOccurs < bOccurs) return 1;
|
||||
if(a.modules.length > b.modules.length) return -1;
|
||||
if(a.modules.length < b.modules.length) return 1;
|
||||
for(var i = 0; i < a.modules.length; i++) {
|
||||
if(a.modules[i].identifier() > b.modules[i].identifier()) return -1;
|
||||
if(a.modules[i].identifier() < b.modules[i].identifier()) return 1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
this.chunks.forEach(function(chunk) {
|
||||
if(chunk.id === null)
|
||||
chunk.id = ++i;
|
||||
});
|
||||
};
|
||||
|
||||
Compilation.prototype.sortItems = function sortItems() {
|
||||
function byId(a, b) {
|
||||
return a.id - b.id;
|
||||
}
|
||||
this.chunks.sort(byId);
|
||||
this.modules.sort(byId);
|
||||
this.modules.forEach(function(module) {
|
||||
module.chunks.sort(byId);
|
||||
});
|
||||
this.chunks.forEach(function(chunk) {
|
||||
chunk.modules.sort(byId);
|
||||
});
|
||||
};
|
||||
|
||||
Compilation.prototype.summarizeDependencies = function summarizeDependencies() {
|
||||
function filterDups(array) {
|
||||
var newArray = [];
|
||||
for(var i = 0; i < array.length; i++) {
|
||||
if(i == 0 || array[i-1] != array[i])
|
||||
newArray.push(array[i]);
|
||||
}
|
||||
return newArray;
|
||||
}
|
||||
this.fileDependencies = [];
|
||||
this.contextDependencies = [];
|
||||
this.children.forEach(function(child) {
|
||||
this.fileDependencies = this.fileDependencies.concat(child.fileDependencies);
|
||||
this.contextDependencies = this.contextDependencies.concat(child.contextDependencies);
|
||||
}.bind(this));
|
||||
this.modules.forEach(function(module) {
|
||||
if(module.fileDependencies) {
|
||||
module.fileDependencies.forEach(function(item) {
|
||||
this.fileDependencies.push(item);
|
||||
}, this);
|
||||
}
|
||||
if(module.contextDependencies) {
|
||||
module.contextDependencies.forEach(function(item) {
|
||||
this.contextDependencies.push(item);
|
||||
}, this);
|
||||
}
|
||||
}, this);
|
||||
this.fileDependencies.sort();
|
||||
this.fileDependencies = filterDups(this.fileDependencies);
|
||||
this.contextDependencies.sort();
|
||||
this.contextDependencies = filterDups(this.contextDependencies);
|
||||
};
|
||||
|
||||
var REGEXP_ID = /\[id\]/g;
|
||||
var REGEXP_NAME = /\[name\]/g;
|
||||
var REGEXP_HASH = /\[hash\]/g;
|
||||
Compilation.prototype.createChunkAssets = function createChunkAssets() {
|
||||
var outputOptions = this.outputOptions || {};
|
||||
var filename = outputOptions.filename || "bundle.js";
|
||||
var chunkFilename = outputOptions.chunkFilename || "[id]." + filename.replace(REGEXP_NAME, "");
|
||||
var namedChunkFilename = outputOptions.namedChunkFilename || null;
|
||||
var hash = new (require("crypto").Hash)("md5");
|
||||
this.mainTemplate.updateHash(hash);
|
||||
this.chunkTemplate.updateHash(hash);
|
||||
this.moduleTemplate.updateHash(hash);
|
||||
var i, chunk;
|
||||
for(i = 0; i < this.modules.length; i++) {
|
||||
var module = this.modules[i];
|
||||
if(module.assets) {
|
||||
Object.keys(module.assets).forEach(function(name) {
|
||||
this.assets[name] = module.assets[name];
|
||||
}, this);
|
||||
}
|
||||
}
|
||||
for(i = 0; i < this.chunks.length; i++) {
|
||||
var chunk = this.chunks[i];
|
||||
chunk.updateHash(hash);
|
||||
}
|
||||
this.hash = hash = hash.digest("hex");
|
||||
for(i = 0; i < this.chunks.length; i++) {
|
||||
chunk = this.chunks[i];
|
||||
chunk.files = [];
|
||||
var source;
|
||||
var file;
|
||||
if(chunk.entry) {
|
||||
source = this.mainTemplate.render(hash, chunk, this.moduleTemplate, this.dependencyTemplates);
|
||||
this.assets[file = filename.replace(REGEXP_HASH, hash).replace(REGEXP_ID, chunk.id).replace(REGEXP_NAME, chunk.name || "")] = source;
|
||||
chunk.files.push(file);
|
||||
} else {
|
||||
source = this.chunkTemplate.render(chunk, this.moduleTemplate, this.dependencyTemplates);
|
||||
this.assets[file = chunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_ID, chunk.id)] = source;
|
||||
chunk.files.push(file);
|
||||
}
|
||||
if(namedChunkFilename && chunk.name) {
|
||||
this.assets[file = namedChunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_ID, chunk.id).replace(REGEXP_NAME, chunk.name || "")] = source;
|
||||
chunk.files.push(file);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Compilation.prototype.getStats = function() {
|
||||
return new Stats(this);
|
||||
};
|
||||
|
||||
Compilation.prototype.createChildCompiler = function(name, outputOptions) {
|
||||
return this.compiler.createChildCompiler(this, name, outputOptions);
|
||||
};
|
|
@ -0,0 +1,282 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var clone = require("clone");
|
||||
var Tapable = require("tapable");
|
||||
|
||||
var Cache = require("./Cache");
|
||||
|
||||
var Compilation = require("./Compilation");
|
||||
var Parser = require("./Parser");
|
||||
var Resolver = require("enhanced-resolve/lib/Resolver");
|
||||
|
||||
var NormalModuleFactory = require("./NormalModuleFactory");
|
||||
var ContextModuleFactory = require("./ContextModuleFactory");
|
||||
var NullFactory = require("./NullFactory");
|
||||
|
||||
var ModuleDependency = require("./dependencies/ModuleDependency");
|
||||
var SingleEntryDependency = require("./dependencies/SingleEntryDependency");
|
||||
var CommonJsRequireDependency = require("./dependencies/CommonJsRequireDependency");
|
||||
var RequireResolveDependency = require("./dependencies/RequireResolveDependency");
|
||||
var RequireResolveHeaderDependency = require("./dependencies/RequireResolveHeaderDependency");
|
||||
var RequireEnsureDependency = require("./dependencies/RequireEnsureDependency");
|
||||
var RequireEnsureItemDependency = require("./dependencies/RequireEnsureItemDependency");
|
||||
|
||||
function Watching(compiler, handler, watchDelay) {
|
||||
this.startTime = null;
|
||||
this.running = false;
|
||||
this.invalid = false;
|
||||
this.error = null;
|
||||
this.stats = null;
|
||||
this.handler = handler;
|
||||
this.watchDelay = watchDelay;
|
||||
this.compiler = compiler;
|
||||
this._go();
|
||||
}
|
||||
|
||||
Watching.prototype._go = function() {
|
||||
this.startTime = new Date().getTime();
|
||||
this.running = true;
|
||||
this.invalid = false;
|
||||
this.compiler.applyPluginsAsync("watch-run", this, function(err) {
|
||||
this.compiler.compile(function(err, compilation) {
|
||||
if(err) return this._done(err);
|
||||
if(this.invalid) return this._done();
|
||||
|
||||
this.compiler.emitAssets(compilation, function(err) {
|
||||
if(err) return this._done(err);
|
||||
|
||||
return this._done(null, compilation);
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Watching.prototype._done = function(err, compilation) {
|
||||
this.running = false;
|
||||
if(this.invalid) return this._go();
|
||||
this.error = err || null;
|
||||
this.stats = compilation ? compilation.getStats() : null;
|
||||
if(this.stats) {
|
||||
this.stats.startTime = this.startTime;
|
||||
this.stats.endTime = new Date().getTime();
|
||||
}
|
||||
if(this.stats)
|
||||
this.compiler.applyPlugins("done", this.stats);
|
||||
else
|
||||
this.compiler.applyPlugins("failed", this.error);
|
||||
this.handler(this.error, this.stats);
|
||||
if(!this.error)
|
||||
this.watch(compilation.fileDependencies, compilation.contextDependencies);
|
||||
};
|
||||
|
||||
Watching.prototype.watch = function(files, dirs) {
|
||||
this.watcher = this.compiler.watchFileSystem.watch(files, dirs, this.startTime, this.watchDelay, function(err, modified, fileTimestamps, contextTimestamps) {
|
||||
this.watcher = null;
|
||||
if(err) return this.handler(err);
|
||||
|
||||
this.compiler.fileTimestamps = fileTimestamps;
|
||||
this.compiler.contextTimestamps = contextTimestamps;
|
||||
this.invalidate();
|
||||
}.bind(this), function() {
|
||||
this.compiler.applyPlugins("invalid");
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Watching.prototype.invalidate = function() {
|
||||
if(this.watcher) this.watcher.close();
|
||||
if(this.running) {
|
||||
this.invalid = true;
|
||||
return false;
|
||||
} else {
|
||||
this._go();
|
||||
}
|
||||
};
|
||||
|
||||
function Compiler() {
|
||||
Tapable.call(this);
|
||||
this.mainTemplate = this.chunkTemplate = this.moduleTemplate = null;
|
||||
|
||||
this.outputPath = "";
|
||||
this.outputFileSystem = null;
|
||||
this.inputFileSystem = null;
|
||||
this.separateExecutor = null;
|
||||
|
||||
this.fileTimestamps = {};
|
||||
this.contextTimestamps = {};
|
||||
|
||||
this.resolvers = {
|
||||
normal: new Resolver(null),
|
||||
loader: new Resolver(null),
|
||||
context: new Resolver(null)
|
||||
};
|
||||
this.parser = new Parser();
|
||||
|
||||
this.options = {};
|
||||
}
|
||||
module.exports = Compiler;
|
||||
|
||||
Compiler.prototype = Object.create(Tapable.prototype);
|
||||
|
||||
Compiler.Watching = Watching;
|
||||
Compiler.prototype.watch = function(watchDelay, handler) {
|
||||
this.fileTimestamps = {};
|
||||
this.contextTimestamps = {};
|
||||
var watching = new Watching(this, handler, watchDelay || 0);
|
||||
return watching;
|
||||
};
|
||||
|
||||
Compiler.prototype.run = function(callback) {
|
||||
var startTime = new Date().getTime();
|
||||
this.applyPluginsAsync("run", this, function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
this.compile(function(err, compilation) {
|
||||
if(err) return callback(err);
|
||||
|
||||
this.emitAssets(compilation, function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
var stats = compilation.getStats();
|
||||
stats.startTime = startTime;
|
||||
stats.endTime = new Date().getTime();
|
||||
this.applyPlugins("done", stats);
|
||||
return callback(null, stats);
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Compiler.prototype.runAsChild = function(callback) {
|
||||
this.compile(function(err, compilation) {
|
||||
if(err) return callback(err);
|
||||
|
||||
this.parentCompilation.children.push(compilation);
|
||||
Object.keys(compilation.assets).forEach(function(name) {
|
||||
this.parentCompilation.assets[name] = compilation.assets[name];
|
||||
}.bind(this));
|
||||
|
||||
var entries = compilation.chunks.filter(function(chunk) {
|
||||
return chunk.entry;
|
||||
});
|
||||
return callback(null, entries, compilation);
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
Compiler.prototype.emitAssets = function(compilation, callback) {
|
||||
this.applyPluginsAsync("emit", compilation, function(err) {
|
||||
this.outputFileSystem.mkdirp(this.outputPath, emitFiles.bind(this));
|
||||
}.bind(this));
|
||||
|
||||
function emitFiles(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
require("async").forEach(Object.keys(compilation.assets), function(file, callback) {
|
||||
|
||||
if(file.indexOf("/")) {
|
||||
var idx = file.lastIndexOf("/");
|
||||
var dir = file.substr(0, idx);
|
||||
this.outputFileSystem.mkdirp(this.outputFileSystem.join(this.outputPath, dir), writeOut.bind(this));
|
||||
} else writeOut.call(this);
|
||||
function writeOut(err) {
|
||||
if(err) return callback(err);
|
||||
var content = compilation.assets[file].source();
|
||||
if(!Buffer.isBuffer(content))
|
||||
content = new Buffer(content, "utf-8");
|
||||
this.outputFileSystem.writeFile(this.outputFileSystem.join(this.outputPath, file), content, callback);
|
||||
};
|
||||
|
||||
}.bind(this), function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
afterEmit.call(this);
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
function afterEmit() {
|
||||
this.applyPluginsAsync("after-emit", compilation, function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
return callback();
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Compiler.prototype.createChildCompiler = function(compilation, compilerName, outputOptions) {
|
||||
var childCompiler = new Compiler();
|
||||
for(var name in this._plugins) {
|
||||
if(["make", "compile", "emit", "after-emit", "done"].indexOf(name) < 0)
|
||||
childCompiler._plugins[name] = this._plugins[name].slice();
|
||||
}
|
||||
childCompiler.name = compilerName;
|
||||
childCompiler.mainTemplate = this.mainTemplate;
|
||||
childCompiler.chunkTemplate = this.chunkTemplate;
|
||||
childCompiler.moduleTemplate = this.moduleTemplate;
|
||||
childCompiler.outputPath = this.outputPath;
|
||||
childCompiler.inputFileSystem = this.inputFileSystem;
|
||||
childCompiler.outputFileSystem = null;
|
||||
childCompiler.resolvers = this.resolvers;
|
||||
childCompiler.parser = this.parser;
|
||||
childCompiler.fileTimestamps = this.fileTimestamps;
|
||||
childCompiler.contextTimestamps = this.contextTimestamps;
|
||||
childCompiler.options = clone(this.options);
|
||||
for(var name in outputOptions) {
|
||||
childCompiler.options.output[name] = outputOptions[name];
|
||||
}
|
||||
childCompiler.parentCompilation = compilation;
|
||||
return childCompiler;
|
||||
};
|
||||
|
||||
Compiler.prototype.createCompilation = function() {
|
||||
return new Compilation(this);
|
||||
};
|
||||
|
||||
Compiler.prototype.newCompilation = function(params) {
|
||||
var compilation = this.createCompilation();
|
||||
compilation.fileTimestamps = this.fileTimestamps;
|
||||
compilation.contextTimestamps = this.contextTimestamps;
|
||||
compilation.name = this.name;
|
||||
this.applyPlugins("compilation", compilation, params);
|
||||
return compilation;
|
||||
};
|
||||
|
||||
Compiler.prototype.createNormalModuleFactory = function() {
|
||||
var normalModuleFactory = new NormalModuleFactory(this.resolvers, this.parser, this.options.module || {});
|
||||
this.applyPlugins("normal-module-factory", normalModuleFactory);
|
||||
return normalModuleFactory;
|
||||
};
|
||||
|
||||
Compiler.prototype.createContextModuleFactory = function() {
|
||||
var contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem);
|
||||
this.applyPlugins("context-module-factory", contextModuleFactory);
|
||||
return contextModuleFactory;
|
||||
};
|
||||
|
||||
Compiler.prototype.newCompilationParams = function() {
|
||||
var params = {
|
||||
normalModuleFactory: this.createNormalModuleFactory(),
|
||||
contextModuleFactory: this.createContextModuleFactory()
|
||||
};
|
||||
return params;
|
||||
}
|
||||
|
||||
Compiler.prototype.compile = function(callback) {
|
||||
var params = this.newCompilationParams();
|
||||
this.applyPlugins("compile", params);
|
||||
|
||||
var compilation = this.newCompilation(params);
|
||||
|
||||
this.applyPluginsAsync("make", compilation, function(err) {
|
||||
compilation.seal(function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
this.applyPluginsAsync("after-compile", compilation, function(err) {
|
||||
if(err) return callback(err);
|
||||
|
||||
return callback(null, compilation);
|
||||
});
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
};
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var path = require("path");
|
||||
|
||||
function ConsolePlugin() {
|
||||
}
|
||||
module.exports = ConsolePlugin;
|
||||
ConsolePlugin.prototype.apply = function(compiler) {
|
||||
function addParsedVariable(name, expression) {
|
||||
if(!this.state.current.addVariable) return false;
|
||||
var deps = [];
|
||||
this.parse(expression, {current: {
|
||||
addDependency: function(dep) {
|
||||
deps.push(dep);
|
||||
}
|
||||
}});
|
||||
this.state.current.addVariable(name, expression, deps);
|
||||
return true;
|
||||
}
|
||||
function ignore() { return true; }
|
||||
compiler.parser.plugin("expression console", function(expr) {
|
||||
return addParsedVariable.call(this, "console", "require(" + JSON.stringify(path.join(__dirname, "..", "..", "buildin", "console.js")) + ")");
|
||||
});
|
||||
};
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ConstDependency = require("./dependencies/ConstDependency");
|
||||
|
||||
var NullFactory = require("./NullFactory");
|
||||
|
||||
function ConstPlugin() {
|
||||
}
|
||||
module.exports = ConstPlugin;
|
||||
|
||||
ConstPlugin.prototype.apply = function(compiler) {
|
||||
compiler.plugin("compilation", function(compilation, params) {
|
||||
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
|
||||
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
|
||||
});
|
||||
compiler.parser.plugin("statement if", function(statement) {
|
||||
var param = this.evaluateExpression(statement.test);
|
||||
if(param.isBoolean()) {
|
||||
this.state.current.addDependency(new ConstDependency(param.bool + "", param.range));
|
||||
return param.bool;
|
||||
}
|
||||
});
|
||||
};
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var Module = require("./Module");
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function ContextModule(resolveDependencies, context, recursive, regExp, addon) {
|
||||
Module.call(this);
|
||||
this.resolveDependencies = resolveDependencies;
|
||||
this.context = context;
|
||||
this.recursive = recursive;
|
||||
this.regExp = regExp;
|
||||
this.addon = addon;
|
||||
this.cacheable = true;
|
||||
this.contextDependencies = [context];
|
||||
this.built = false;
|
||||
}
|
||||
module.exports = ContextModule;
|
||||
|
||||
ContextModule.prototype = Object.create(Module.prototype);
|
||||
|
||||
ContextModule.prototype.identifier = function() {
|
||||
var identifier = "";
|
||||
identifier += this.context + " ";
|
||||
if(!this.recursive)
|
||||
identifier += "nonrecursive ";
|
||||
if(this.addon)
|
||||
identifier += this.addon;
|
||||
if(this.regExp)
|
||||
identifier += this.regExp;
|
||||
return identifier.replace(/ $/, "");
|
||||
};
|
||||
|
||||
function prettyRegExp(str) {
|
||||
return str.substring(1, str.length - 1);
|
||||
}
|
||||
|
||||
ContextModule.prototype.readableIdentifier = function(requestShortener) {
|
||||
var identifier = "";
|
||||
identifier += requestShortener.shorten(this.context) + " ";
|
||||
if(!this.recursive)
|
||||
identifier += "nonrecursive ";
|
||||
if(this.addon)
|
||||
identifier += this.addon;
|
||||
if(this.regExp)
|
||||
identifier += prettyRegExp(this.regExp + "");
|
||||
return identifier.replace(/ $/, "");
|
||||
};
|
||||
|
||||
ContextModule.prototype.needRebuild = function(fileTimestamps, contextTimestamps) {
|
||||
var ts = contextTimestamps[this.context];
|
||||
if(!ts) return true;
|
||||
return ts > this.builtTime;
|
||||
};
|
||||
|
||||
ContextModule.prototype.build = function(options, compilation, resolver, fs, callback) {
|
||||
this.built = true;
|
||||
this.builtTime = new Date().getTime();
|
||||
var addon = this.addon;
|
||||
this.resolveDependencies(fs, this.context, this.recursive, this.regExp, function(err, dependencies) {
|
||||
if(err) return callback(err);
|
||||
dependencies.forEach(function(dep) {
|
||||
dep.userRequest = dep.request;
|
||||
dep.request = addon + dep.userRequest;
|
||||
});
|
||||
this.dependencies = dependencies;
|
||||
callback();
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
ContextModule.prototype.source = function(dependencyTemplates, outputOptions, requestShortener) {
|
||||
var map = {};
|
||||
this.dependencies.forEach(function(dep) {
|
||||
if(dep.module)
|
||||
map[dep.userRequest] = dep.module.id
|
||||
});
|
||||
var str = [
|
||||
"var map = ", JSON.stringify(map, null, "\t"), ";\n",
|
||||
"module.exports = function webpackContext(req) {\n",
|
||||
"\treturn require(map[req] || (function() { throw new Error(\"Cannot find module \" + req + \".\") }()));\n",
|
||||
"};\n",
|
||||
"module.exports.keys = function webpackContextKeys() {\n",
|
||||
"\treturn Object.keys(map);\n",
|
||||
"};\n",
|
||||
];
|
||||
return new RawSource(str.join(""));
|
||||
};
|
||||
|
||||
ContextModule.prototype.size = function() {
|
||||
return this.dependencies.map(function(dep) {
|
||||
return dep.userRequest.length + 5;
|
||||
}).reduce(function(a, b) { return a+b; }, 160);
|
||||
};
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var async = require("async");
|
||||
var path = require("path");
|
||||
|
||||
var Tapable = require("tapable");
|
||||
var ContextModule = require("./ContextModule");
|
||||
var ContextElementDependency = require("./dependencies/ContextElementDependency");
|
||||
|
||||
function ContextModuleFactory(resolvers) {
|
||||
Tapable.call(this);
|
||||
this.resolvers = resolvers;
|
||||
}
|
||||
module.exports = ContextModuleFactory;
|
||||
|
||||
ContextModuleFactory.prototype = Object.create(Tapable.prototype);
|
||||
ContextModuleFactory.prototype.create = function(context, dependency, callback) {
|
||||
this.applyPluginsAsyncWaterfall("before-resolve", {
|
||||
context: context,
|
||||
request: dependency.request,
|
||||
recursive: dependency.recursive,
|
||||
regExp: dependency.regExp
|
||||
}, function(err, result) {
|
||||
if(err) return callback(err);
|
||||
|
||||
var context = result.context;
|
||||
var request = result.request;
|
||||
var recursive = result.recursive;
|
||||
var regExp = result.regExp;
|
||||
|
||||
var loaders, resource;
|
||||
var idx = request.lastIndexOf("!");
|
||||
if(idx >= 0) {
|
||||
loaders = request.substr(0, idx+1);
|
||||
resource = request.substr(idx+1);
|
||||
} else {
|
||||
loaders = "";
|
||||
resource = request;
|
||||
}
|
||||
|
||||
this.resolvers.context.resolve(context, resource, function(err, resource) {
|
||||
if(err) return callback(err);
|
||||
|
||||
this.applyPluginsAsyncWaterfall("after-resolve", {
|
||||
loaders: loaders,
|
||||
resource: resource,
|
||||
recursive: recursive,
|
||||
regExp: regExp
|
||||
}, function(err, result) {
|
||||
if(err) return callback(err);
|
||||
|
||||
return callback(null, new ContextModule(this.resolveDependencies.bind(this), result.resource, result.recursive, result.regExp, result.loaders));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
};
|
||||
ContextModuleFactory.prototype.resolveDependencies = function resolveDependencies(fs, resource, recursive, regExp, callback) {
|
||||
(function addDirectory(directory, callback) {
|
||||
fs.readdir(directory, function(err, files) {
|
||||
if(!files || files.length == 0) return callback();
|
||||
async.map(files, function(seqment, callback) {
|
||||
|
||||
var subResource = path.join(directory, seqment)
|
||||
|
||||
fs.stat(subResource, function(err, stat) {
|
||||
if(err) return callback(err);
|
||||
|
||||
if(stat.isDirectory()) {
|
||||
|
||||
if(!recursive) return callback();
|
||||
addDirectory.call(this, subResource, callback);
|
||||
|
||||
} else if(stat.isFile()) {
|
||||
|
||||
var obj = {
|
||||
context: resource,
|
||||
request: "." + subResource.substr(resource.length).replace(/\\/g, "/")
|
||||
};
|
||||
this.applyPluginsAsyncWaterfall("alternatives", [obj], function(err, alternatives) {
|
||||
alternatives = alternatives.filter(function(obj) {
|
||||
return regExp.test(obj.request);
|
||||
}).map(function(obj) {
|
||||
var dep = new ContextElementDependency(obj.request);
|
||||
dep.optional = true;
|
||||
return dep;
|
||||
});
|
||||
callback(null, alternatives);
|
||||
});
|
||||
|
||||
} else callback();
|
||||
|
||||
}.bind(this));
|
||||
|
||||
}.bind(this), function(err, result) {
|
||||
if(err) return callback(err);
|
||||
|
||||
if(!result) return callback();
|
||||
|
||||
callback(null, result.filter(function(i) { return !!i; }).reduce(function(a, i) {
|
||||
return a.concat(i);
|
||||
}, []));
|
||||
});
|
||||
}.bind(this));
|
||||
}.call(this, resource, callback));
|
||||
};
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var DependenciesBlockVariable = require("./DependenciesBlockVariable");
|
||||
|
||||
function DependenciesBlock() {
|
||||
this.dependencies = [];
|
||||
this.blocks = [];
|
||||
this.variables = [];
|
||||
}
|
||||
module.exports = DependenciesBlock;
|
||||
|
||||
DependenciesBlock.prototype.addBlock = function(block) {
|
||||
this.blocks.push(block);
|
||||
}
|
||||
|
||||
DependenciesBlock.prototype.addVariable = function(name, expression, dependencies) {
|
||||
for(var i = 0; i < this.variables.length; i++) {
|
||||
var v = this.variables[i];
|
||||
if(v.name == name && v.expression == expression) return;
|
||||
}
|
||||
this.variables.push(new DependenciesBlockVariable(name, expression, dependencies));
|
||||
}
|
||||
|
||||
DependenciesBlock.prototype.addDependency = function(dependency) {
|
||||
this.dependencies.push(dependency);
|
||||
}
|
||||
|
||||
DependenciesBlock.prototype.updateHash = function(hash) {
|
||||
this.dependencies.forEach(function(d) {
|
||||
d.updateHash(hash);
|
||||
});
|
||||
this.blocks.forEach(function(b) {
|
||||
b.updateHash(hash);
|
||||
});
|
||||
this.variables.forEach(function(v) {
|
||||
v.updateHash(hash);
|
||||
});
|
||||
};
|
||||
|
||||
DependenciesBlock.prototype.disconnect = function() {
|
||||
function disconnect(i) {
|
||||
i.disconnect();
|
||||
}
|
||||
this.dependencies.forEach(disconnect);
|
||||
this.blocks.forEach(disconnect);
|
||||
this.variables.forEach(disconnect);
|
||||
};
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ReplaceSource = require("./ReplaceSource");
|
||||
var StringSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function DependenciesBlockVariable(name, expression, dependencies) {
|
||||
this.name = name;
|
||||
this.expression = expression;
|
||||
this.dependencies = dependencies || [];
|
||||
}
|
||||
module.exports = DependenciesBlockVariable;
|
||||
|
||||
DependenciesBlockVariable.prototype.updateHash = function(hash) {
|
||||
hash.update(this.name);
|
||||
hash.update(this.expression);
|
||||
this.dependencies.forEach(function(d) {
|
||||
d.updateHash(hash);
|
||||
});
|
||||
};
|
||||
|
||||
DependenciesBlockVariable.prototype.expressionSource = function(dependencyTemplates, outputOptions, requestShortener) {
|
||||
var source = new ReplaceSource(new StringSource(this.expression));
|
||||
this.dependencies.forEach(function(dep) {
|
||||
var template = dependencyTemplates.get(dep.Class);
|
||||
if(!template) throw new Error("No template for dependency: " + dep.Class.name);
|
||||
template.apply(dep, source, outputOptions, requestShortener);
|
||||
});
|
||||
return source;
|
||||
};
|
||||
|
||||
DependenciesBlockVariable.prototype.disconnect = function() {
|
||||
this.dependencies.forEach(function(d) {
|
||||
d.disconnect();
|
||||
});
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function Dependency() {
|
||||
this.module = null;
|
||||
this.Class = Dependency;
|
||||
}
|
||||
module.exports = Dependency;
|
||||
|
||||
Dependency.prototype.isEqualResource = function(other) {
|
||||
return false;
|
||||
};
|
||||
|
||||
Dependency.prototype.updateHash = function(hash) {
|
||||
hash.update((this.module && this.module.id) + "");
|
||||
};
|
||||
|
||||
Dependency.prototype.disconnect = function() {
|
||||
this.module = null;
|
||||
};
|
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function EntryModuleNotFoundError(err) {
|
||||
Error.call(this);
|
||||
Error.captureStackTrace(this, EntryModuleNotFoundError);
|
||||
this.name = "EntryModuleNotFoundError";
|
||||
this.message = "Entry module not found: " + err;
|
||||
this.error = err;
|
||||
}
|
||||
module.exports = EntryModuleNotFoundError;
|
||||
|
||||
EntryModuleNotFoundError.prototype = Object.create(Error.prototype);
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var EvalDevToolModuleTemplateDecorator = require("./EvalDevToolModuleTemplateDecorator");
|
||||
|
||||
function EvalDevToolModulePlugin() {
|
||||
}
|
||||
module.exports = EvalDevToolModulePlugin;
|
||||
EvalDevToolModulePlugin.prototype.apply = function(compiler) {
|
||||
compiler.plugin("compilation", function(compilation) {
|
||||
console.log("eval tool");
|
||||
compilation.moduleTemplate = new EvalDevToolModuleTemplateDecorator(compilation.moduleTemplate);
|
||||
});
|
||||
};
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function EvalDevToolModuleTemplateDecorator(moduleTemplate) {
|
||||
this.moduleTemplate = moduleTemplate;
|
||||
}
|
||||
module.exports = EvalDevToolModuleTemplateDecorator;
|
||||
|
||||
EvalDevToolModuleTemplateDecorator.prototype.render = function(module, dependencyTemplates) {
|
||||
var fakeModule = {
|
||||
source: function(dependencyTemplates, outputOptions, requestShortener) {
|
||||
var source = module.source(dependencyTemplates, outputOptions, requestShortener);
|
||||
var content = source.source();
|
||||
var footer = ["\n",
|
||||
"// WEBPACK FOOTER",
|
||||
"// module.id = " + module.id,
|
||||
"// module.readableIdentifier = " + module.readableIdentifier(requestShortener),
|
||||
"//@ sourceURL=webpack-module:///" + encodeURI(module.readableIdentifier(requestShortener) + "(" + module.id + ")").replace(/%2F/g, "/").replace(/%20/g, "_").replace(/%5E/g, "^").replace(/%5C/g, "\\").replace(/\?/, "%3F").replace(/^\//, "")
|
||||
].join("\n");
|
||||
return new RawSource("eval(" + JSON.stringify(content + footer) + ");" );
|
||||
},
|
||||
identifier: function() { return module.identifier() },
|
||||
readableIdentifier: function(rs) { return module.readableIdentifier(rs) },
|
||||
id: module.id
|
||||
};
|
||||
return this.moduleTemplate.render(fakeModule, dependencyTemplates);
|
||||
};
|
||||
|
||||
EvalDevToolModuleTemplateDecorator.prototype.updateHash = function(hash) {
|
||||
hash.update("1");
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var FunctionModuleTemplate = require("./FunctionModuleTemplate");
|
||||
var RequestShortener = require("./RequestShortener");
|
||||
|
||||
function FunctionModulePlugin(context, options) {
|
||||
this.context = context;
|
||||
this.options = options;
|
||||
}
|
||||
module.exports = FunctionModulePlugin;
|
||||
FunctionModulePlugin.prototype.apply = function(compiler) {
|
||||
compiler.moduleTemplate = new FunctionModuleTemplate(this.options, new RequestShortener(this.context));
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function FunctionModuleTemplate(outputOptions, requestShortener) {
|
||||
this.outputOptions = outputOptions || {};
|
||||
this.requestShortener = requestShortener;
|
||||
}
|
||||
module.exports = FunctionModuleTemplate;
|
||||
|
||||
FunctionModuleTemplate.prototype.render = function(module, dependencyTemplates) {
|
||||
var buf = [];
|
||||
if(this.outputOptions.pathinfo) {
|
||||
var req = module.readableIdentifier(this.requestShortener);
|
||||
buf.push("/*!****" + req.replace(/./g, "*") + "****!*\\\n");
|
||||
buf.push(" !*** " + req.replace(/\*\//g, "*_/") + " ***!\n");
|
||||
buf.push(" \\****" + req.replace(/./g, "*") + "****/\n");
|
||||
}
|
||||
buf.push("/***/ function(module, exports, require) {\n\n");
|
||||
var source = module.source(dependencyTemplates, this.outputOptions, this.requestShortener);
|
||||
buf.push("\t" + source.source().replace(/\r?\n/g, "\n\t"));
|
||||
buf.push("\n\n/***/ }");
|
||||
return new RawSource(buf.join(""));
|
||||
};
|
||||
|
||||
FunctionModuleTemplate.prototype.updateHash = function(hash) {
|
||||
hash.update("1");
|
||||
};
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function JsonpChunkTemplate(outputOptions) {
|
||||
this.outputOptions = outputOptions || {};
|
||||
}
|
||||
module.exports = JsonpChunkTemplate;
|
||||
|
||||
JsonpChunkTemplate.prototype.render = function(chunk, moduleTemplate, dependencyTemplates) {
|
||||
var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || ""));
|
||||
var buf = [];
|
||||
buf.push(jsonpFunction + "(" + chunk.id + ", {\n");
|
||||
chunk.modules.forEach(function(module, idx) {
|
||||
if(idx != 0) buf.push(",\n");
|
||||
buf.push("\n/***/ " + module.id + ":\n");
|
||||
var source = moduleTemplate.render(module, dependencyTemplates);
|
||||
buf.push(source.source());
|
||||
});
|
||||
buf.push("\n\n})");
|
||||
return new RawSource(buf.join(""));
|
||||
};
|
||||
|
||||
JsonpChunkTemplate.prototype.updateHash = function(hash) {
|
||||
hash.update("jsonp");
|
||||
hash.update("1");
|
||||
hash.update(this.outputOptions.jsonpFunction + "");
|
||||
hash.update(this.outputOptions.library + "");
|
||||
};
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var StringSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function JsonpMainTemplate(outputOptions) {
|
||||
this.outputOptions = outputOptions || {};
|
||||
}
|
||||
module.exports = JsonpMainTemplate;
|
||||
|
||||
var REGEXP_HASH = /\[hash\]/i;
|
||||
var REGEXP_NAME = /\[name\]/g;
|
||||
var REGEXP_ID = /\[id\]/i;
|
||||
JsonpMainTemplate.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
|
||||
var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || ""));
|
||||
var publicPath = this.outputOptions.publicPath || "";
|
||||
var filename = this.outputOptions.filename || "bundle.js";
|
||||
var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename;
|
||||
var buf = [];
|
||||
function addLine(indent, line) {
|
||||
buf.push("/******/ ");
|
||||
for(var i = 0; i < indent; i++)
|
||||
buf.push("\t");
|
||||
buf.push(line);
|
||||
buf.push("\n");
|
||||
}
|
||||
function addRequireFunc(i) {
|
||||
addLine(i+0, "function require(moduleId) {");
|
||||
addLine(i+1, "if(typeof moduleId !== \"number\") throw new Error(\"Cannot find module '\"+moduleId+\"'\");");
|
||||
addLine(i+1, "if(installedModules[moduleId])");
|
||||
addLine(i+2, "return installedModules[moduleId].exports;");
|
||||
addLine(i+1, "var module = installedModules[moduleId] = {");
|
||||
addLine(i+2, "exports: {},");
|
||||
addLine(i+2, "id: moduleId,");
|
||||
addLine(i+2, "loaded: false");
|
||||
addLine(i+1, "};");
|
||||
addLine(i+1, "modules[moduleId].call(null, module, module.exports, require);");
|
||||
addLine(i+1, "module.loaded = true;");
|
||||
addLine(i+1, "return module.exports;");
|
||||
addLine(i+0, "}");
|
||||
}
|
||||
addLine(0, "(function webpackBootstrap(modules) {");
|
||||
addLine(1, "var installedModules = {};");
|
||||
addRequireFunc(1);
|
||||
addLine(1, "require.e = function requireEnsure(chunkId, callback) {");
|
||||
if(chunk.chunks.length == 0) {
|
||||
addLine(2, "callback.call(null, require);");
|
||||
} else {
|
||||
addLine(2, "if(installedChunks[chunkId] === 1) return callback.call(null, require);");
|
||||
addLine(2, "if(installedChunks[chunkId] !== undefined)");
|
||||
addLine(3, "installedChunks[chunkId].push(callback);");
|
||||
addLine(2, "else {");
|
||||
addLine(3, "installedChunks[chunkId] = [callback];");
|
||||
addLine(3, "var head = document.getElementsByTagName('head')[0];");
|
||||
addLine(3, "var script = document.createElement('script');");
|
||||
addLine(3, "script.type = 'text/javascript';");
|
||||
addLine(3, "script.charset = 'utf-8';");
|
||||
addLine(3, "script.src = modules.c+" + JSON.stringify(chunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_NAME, "")).replace(REGEXP_ID, "\"+chunkId+\"") + ";");
|
||||
addLine(3, "head.appendChild(script);");
|
||||
addLine(2, "}");
|
||||
}
|
||||
addLine(1, "};");
|
||||
addLine(1, "require.modules = modules;");
|
||||
addLine(1, "require.cache = installedModules;");
|
||||
if(chunk.chunks.length > 0) {
|
||||
addLine(1, "var installedChunks = {0:1};");
|
||||
addLine(1, "window[" + JSON.stringify(jsonpFunction) + "] = function webpackJsonpCallback(chunkId, moreModules) {");
|
||||
addLine(2, "for(var moduleId in moreModules)");
|
||||
addLine(3, "modules[moduleId] = moreModules[moduleId];");
|
||||
addLine(2, "var callbacks = installedChunks[chunkId];");
|
||||
addLine(2, "installedChunks[chunkId] = 1;");
|
||||
addLine(2, "for(var i = 0; i < callbacks.length; i++)");
|
||||
addLine(3, "callbacks[i].call(null, require);");
|
||||
addLine(1, "};");
|
||||
}
|
||||
addLine(1, "return require(0);");
|
||||
addLine(0, "})({");
|
||||
addLine(0, "c: " + JSON.stringify(publicPath.replace(REGEXP_HASH, hash)) + ",");
|
||||
chunk.modules.forEach(function(module, idx) {
|
||||
if(idx != 0) buf.push(",\n");
|
||||
buf.push("\n/***/ " + module.id + ":\n");
|
||||
var source = moduleTemplate.render(module, dependencyTemplates);
|
||||
buf.push(source.source());
|
||||
});
|
||||
buf.push("\n");
|
||||
addLine(0, "})");
|
||||
return new StringSource(buf.join(""));
|
||||
};
|
||||
|
||||
JsonpMainTemplate.prototype.updateHash = function(hash) {
|
||||
hash.update("jsonp");
|
||||
hash.update("1");
|
||||
hash.update(this.outputOptions.publicPath + "");
|
||||
hash.update(this.outputOptions.filename + "");
|
||||
hash.update(this.outputOptions.chunkFilename + "");
|
||||
hash.update(this.outputOptions.jsonpFunction + "");
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var JsonpMainTemplate = require("./JsonpMainTemplate");
|
||||
var JsonpChunkTemplate = require("./JsonpChunkTemplate");
|
||||
|
||||
function JsonpTemplatePlugin(options) {
|
||||
this.options = options;
|
||||
}
|
||||
module.exports = JsonpTemplatePlugin;
|
||||
JsonpTemplatePlugin.prototype.apply = function(compiler) {
|
||||
var options = this.options;
|
||||
compiler.mainTemplate = new JsonpMainTemplate(options);
|
||||
compiler.chunkTemplate = new JsonpChunkTemplate(options);
|
||||
compiler.plugin("compilation", function(compilation) {
|
||||
compilation.plugin("normal-module-loader", function(loaderContext) {
|
||||
loaderContext.target = "web";
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var SetVarMainTemplateDecorator = require("./SetVarMainTemplateDecorator");
|
||||
var CommonJsMainTemplateDecorator = require("./CommonJsMainTemplateDecorator");
|
||||
|
||||
function LibraryTemplatePlugin(name, target) {
|
||||
this.name = name;
|
||||
this.target = target;
|
||||
}
|
||||
module.exports = LibraryTemplatePlugin;
|
||||
LibraryTemplatePlugin.prototype.apply = function(compiler) {
|
||||
switch(this.target) {
|
||||
case "var":
|
||||
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "var " + this.name);
|
||||
break;
|
||||
case "this":
|
||||
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "this[" + JSON.stringify(this.name) + "]");
|
||||
break;
|
||||
case "window":
|
||||
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "window[" + JSON.stringify(this.name) + "]");
|
||||
break;
|
||||
case "commonjs":
|
||||
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "exports[" + JSON.stringify(this.name) + "]");
|
||||
break;
|
||||
case "commonjs2":
|
||||
compiler.mainTemplate = new CommonJsMainTemplateDecorator(compiler.mainTemplate);
|
||||
break;
|
||||
default:
|
||||
throw new Error(this.target + " is not a valid Library target");
|
||||
}
|
||||
};
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function MemoryOutputFileSystem(data) {
|
||||
this.data = data || {};
|
||||
}
|
||||
module.exports = MemoryOutputFileSystem;
|
||||
|
||||
function isDir(item) {
|
||||
if(typeof item != "object") return false;
|
||||
return item[""] === true;
|
||||
}
|
||||
|
||||
function isFile(item) {
|
||||
if(typeof item == "string") return true;
|
||||
if(typeof item != "object") return false;
|
||||
return !item[""];
|
||||
}
|
||||
|
||||
MemoryOutputFileSystem.prototype.mkdirp = function(path, callback) {
|
||||
if(path == "/") return callback();
|
||||
path = path.split("/");
|
||||
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
|
||||
var current = this.data;
|
||||
for(var i = 1; i < path.length; i++) {
|
||||
if(isFile(current[path[i]]))
|
||||
return callback(new Error("Path is a file " + path.join("/")));
|
||||
else if(!isDir(current[path[i]]))
|
||||
current[path[i]] = {"":true};
|
||||
current = current[path[i]];
|
||||
}
|
||||
return callback();
|
||||
};
|
||||
|
||||
MemoryOutputFileSystem.prototype.mkdir = function(path, callback) {
|
||||
path = path.split("/");
|
||||
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
|
||||
var current = this.data;
|
||||
for(var i = 1; i < path.length - 1; i++) {
|
||||
if(!isDir(current[path[i]]))
|
||||
return callback(new Error("Path doesn't exists " + path.join("/")));
|
||||
current = current[path[i]];
|
||||
}
|
||||
if(isDir(current[path[i]]))
|
||||
return callback(new Error("Directory already exist " + path.join("/")));
|
||||
else if(isFile(current[path[i]]))
|
||||
return callback(new Error("Cannot mkdir on file " + path.join("/")));
|
||||
current[path[i]] = {"":true};
|
||||
return callback();
|
||||
};
|
||||
MemoryOutputFileSystem.prototype.rmdir = function(path, callback) {
|
||||
path = path.split("/");
|
||||
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
|
||||
var current = this.data;
|
||||
for(var i = 1; i < path.length - 1; i++) {
|
||||
if(!isDir(current[path[i]]))
|
||||
return callback(new Error("Path doesn't exists " + path.join("/")));
|
||||
current = current[path[i]];
|
||||
}
|
||||
if(!isDir(current[path[i]]))
|
||||
return callback(new Error("Directory doesn't exist " + path.join("/")));
|
||||
delete current[path[i]];
|
||||
return callback();
|
||||
};
|
||||
MemoryOutputFileSystem.prototype.unlink = function(path, callback) {
|
||||
path = path.split("/");
|
||||
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
|
||||
var current = this.data;
|
||||
for(var i = 1; i < path.length - 1; i++) {
|
||||
if(!isDir(current[path[i]]))
|
||||
return callback(new Error("Path doesn't exists " + path.join("/")));
|
||||
current = current[path[i]];
|
||||
}
|
||||
if(!isFile(current[path[i]]))
|
||||
return callback(new Error("File doesn't exist " + path.join("/")));
|
||||
delete current[path[i]];
|
||||
return callback();
|
||||
};
|
||||
MemoryOutputFileSystem.prototype.writeFile = function(path, content, callback) {
|
||||
if(!content) return callback(new Error("No content"));
|
||||
path = path.split("/");
|
||||
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
|
||||
var current = this.data;
|
||||
for(var i = 1; i < path.length - 1; i++) {
|
||||
if(!isDir(current[path[i]]))
|
||||
return callback(new Error("Path doesn't exists " + path.join("/")));
|
||||
current = current[path[i]];
|
||||
}
|
||||
if(isDir(current[path[i]]))
|
||||
return callback(new Error("Cannot writeFile on directory " + path.join("/")));
|
||||
current[path[i]] = content;
|
||||
return callback();
|
||||
};
|
||||
MemoryOutputFileSystem.prototype.join = function(a, b) {
|
||||
if(a == "/") return "/" + b;
|
||||
return a + "/" + b;
|
||||
};
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var DependenciesBlock = require("./DependenciesBlock");
|
||||
var ModuleReason = require("./ModuleReason");
|
||||
|
||||
var debugId = 1000;
|
||||
function Module() {
|
||||
DependenciesBlock.call(this);
|
||||
this.context = null;
|
||||
this.reasons = [];
|
||||
this.debugId = debugId++;
|
||||
this.id = null;
|
||||
this.chunks = [];
|
||||
this.warnings = [];
|
||||
this.errors = [];
|
||||
}
|
||||
module.exports = Module;
|
||||
|
||||
Module.prototype = Object.create(DependenciesBlock.prototype);
|
||||
|
||||
Module.prototype.separable = function(callback) {
|
||||
callback(false);
|
||||
};
|
||||
|
||||
Module.prototype.disconnect = function() {
|
||||
this.reasons.length = 0;
|
||||
this.id = null;
|
||||
this.chunks.length = 0;
|
||||
DependenciesBlock.prototype.disconnect.call(this);
|
||||
};
|
||||
|
||||
Module.prototype.addChunk = function(chunk) {
|
||||
var idx = this.chunks.indexOf(chunk);
|
||||
if(idx < 0)
|
||||
this.chunks.push(chunk);
|
||||
};
|
||||
|
||||
Module.prototype.removeChunk = function(chunk) {
|
||||
var idx = this.chunks.indexOf(chunk);
|
||||
if(idx >= 0) {
|
||||
this.chunks.splice(idx, 1);
|
||||
chunk.removeModule(this);
|
||||
}
|
||||
};
|
||||
|
||||
Module.prototype.addReason = function(module, dependency) {
|
||||
this.reasons.push(new ModuleReason(module, dependency));
|
||||
};
|
||||
|
||||
Module.prototype.toString = function() {
|
||||
return "Module[" + (this.id || this.debugId) + "]";
|
||||
};
|
||||
|
||||
Module.prototype.needRebuild = function(fileTimestamps, contextTimestamps) {
|
||||
return true;
|
||||
};
|
||||
|
||||
Module.prototype.identifier = null;
|
||||
Module.prototype.readableIdentifier = null;
|
||||
Module.prototype.build = null;
|
||||
Module.prototype.source = null;
|
||||
Module.prototype.size = null;
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function ModuleNotFoundError(module, err) {
|
||||
Error.call(this);
|
||||
Error.captureStackTrace(this, ModuleNotFoundError);
|
||||
this.name = "ModuleNotFoundError";
|
||||
this.message = "Module not found: " + err;
|
||||
this.module = module;
|
||||
this.error = err;
|
||||
}
|
||||
module.exports = ModuleNotFoundError;
|
||||
|
||||
ModuleNotFoundError.prototype = Object.create(Error.prototype);
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function ModuleParseError(module, source, err) {
|
||||
Error.call(this);
|
||||
Error.captureStackTrace(this, ModuleParseError);
|
||||
this.name = "ModuleParseError";
|
||||
this.message = "Module parse failed: " + module.request + " " + err.message;
|
||||
if(typeof err.lineNumber === "number") {
|
||||
source = source.split("\n");
|
||||
this.message += "\n" + source.slice(err.lineNumber - 2, 5).join("\n");
|
||||
}
|
||||
this.module = module;
|
||||
this.error = err;
|
||||
}
|
||||
module.exports = ModuleParseError;
|
||||
|
||||
ModuleParseError.prototype = Object.create(Error.prototype);
|
|
@ -0,0 +1,9 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function ModuleReason(module, dependency) {
|
||||
this.module = module;
|
||||
this.dependency = dependency;
|
||||
}
|
||||
module.exports = ModuleReason;
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var Module = require("./Module");
|
||||
var NormalModuleMixin = require("webpack-core/lib/NormalModuleMixin");
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
var ReplaceSource = require("./ReplaceSource");
|
||||
var ModuleParseError = require("./ModuleParseError");
|
||||
var path = require("path");
|
||||
|
||||
function NormalModule(request, userRequest, rawRequest, loaders, resource, parser) {
|
||||
Module.call(this);
|
||||
this.request = request;
|
||||
this.userRequest = userRequest;
|
||||
this.rawRequest = rawRequest;
|
||||
this.parser = parser;
|
||||
NormalModuleMixin.call(this, loaders, resource);
|
||||
this.assets = {};
|
||||
this.built = false;
|
||||
}
|
||||
module.exports = NormalModule;
|
||||
|
||||
NormalModule.prototype = Object.create(Module.prototype);
|
||||
NormalModuleMixin.mixin(NormalModule.prototype);
|
||||
|
||||
NormalModule.prototype.identifier = function() {
|
||||
return this.request;
|
||||
};
|
||||
|
||||
NormalModule.prototype.readableIdentifier = function(requestShortener) {
|
||||
return requestShortener.shorten(this.userRequest);
|
||||
};
|
||||
|
||||
NormalModule.prototype.fillLoaderContext = function fillLoaderContext(loaderContext, options, compilation) {
|
||||
loaderContext.webpack = true;
|
||||
compilation.applyPlugins("normal-module-loader", loaderContext);
|
||||
loaderContext.emitFile = function(name, content) {
|
||||
this.assets[name] = new RawSource(content);
|
||||
}.bind(this);
|
||||
loaderContext.minimize = options.minimize;
|
||||
loaderContext._compilation = compilation;
|
||||
loaderContext._compiler = compilation.compiler;
|
||||
};
|
||||
|
||||
NormalModule.prototype.disconnect = function disconnect() {
|
||||
this.built = false;
|
||||
Module.prototype.disconnect.call(this);
|
||||
};
|
||||
|
||||
NormalModule.prototype.build = function build(options, compilation, resolver, fs, callback) {
|
||||
this.buildTimestamp = new Date().getTime();
|
||||
this.built = true;
|
||||
return this.doBuild(options, compilation, resolver, fs, function(err) {
|
||||
if(err) return callback(err);
|
||||
try {
|
||||
this.parser.parse(this._source.source(), {current: this});
|
||||
} catch(e) {
|
||||
var source = this._source.source();
|
||||
this._source = null;
|
||||
return callback(new ModuleParseError(this, source, e));
|
||||
}
|
||||
return callback();
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
NormalModule.prototype.source = function(dependencyTemplates, outputOptions, requestShortener) {
|
||||
var _source = this._source;
|
||||
if(!_source) return new RawSource("throw new Error('No source availible');");
|
||||
var source = new ReplaceSource(_source);
|
||||
function doDep(dep) {
|
||||
var template = dependencyTemplates.get(dep.Class);
|
||||
if(!template) throw new Error("No template for dependency: " + dep.Class.name);
|
||||
template.apply(dep, source, outputOptions, requestShortener);
|
||||
}
|
||||
function doVariable(vars, variable) {
|
||||
var name = variable.name;
|
||||
var expr = variable.expressionSource(dependencyTemplates, outputOptions, requestShortener);
|
||||
vars.push({name: name, expression: expr});
|
||||
}
|
||||
function doBlock(block) {
|
||||
block.dependencies.forEach(doDep);
|
||||
block.blocks.forEach(doBlock);
|
||||
if(block.variables.length > 0) {
|
||||
var vars = [];
|
||||
block.variables.forEach(doVariable.bind(null, vars));
|
||||
var varNames = [];
|
||||
var varExpressions = [];
|
||||
var varStartCode = "";
|
||||
var varEndCode = "";
|
||||
function emitFunction() {
|
||||
if(varNames.length == 0) return;
|
||||
|
||||
varStartCode += "/* WEBPACK VAR INJECTION */(function(" + varNames.join(", ") + ") {";
|
||||
varEndCode = "}(" + varExpressions.map(function(e) {return e.source()}).join(", ") + "))" + varEndCode;
|
||||
|
||||
varNames.length = 0;
|
||||
varExpressions.length = 0;
|
||||
}
|
||||
vars.forEach(function(v) {
|
||||
if(varNames.indexOf(v.name) >= 0) emitFunction();
|
||||
varNames.push(v.name);
|
||||
varExpressions.push(v.expression);
|
||||
});
|
||||
emitFunction();
|
||||
var start = block.range ? block.range[0] : 0;
|
||||
var end = block.range ? block.range[1] : _source.size();
|
||||
if(varStartCode) source.insert(start, varStartCode);
|
||||
if(varEndCode) source.insert(end, "\n/* WEBPACK VAR INJECTION */" + varEndCode);
|
||||
}
|
||||
}
|
||||
doBlock(this);
|
||||
return source;
|
||||
};
|
||||
|
||||
NormalModule.prototype.needRebuild = function needRebuild(fileTimestamps, contextTimestamps) {
|
||||
var timestamp = 0;
|
||||
this.fileDependencies.forEach(function(file) {
|
||||
var ts = fileTimestamps[file];
|
||||
if(!ts) timestamp = Infinity;
|
||||
if(ts > timestamp) timestamp = ts;
|
||||
});
|
||||
this.contextDependencies.forEach(function(context) {
|
||||
var ts = contextTimestamps[context];
|
||||
if(!ts) timestamp = Infinity;
|
||||
if(ts > timestamp) timestamp = ts;
|
||||
});
|
||||
return timestamp > this.buildTimestamp;
|
||||
};
|
||||
|
||||
NormalModule.prototype.size = function() {
|
||||
return this._source ? this._source.size() : -1;
|
||||
};
|
||||
|
||||
NormalModule.prototype.updateHash = function(hash) {
|
||||
if(this._source) {
|
||||
hash.update("source");
|
||||
this._source.updateHash(hash);
|
||||
} else
|
||||
hash.update("null");
|
||||
Module.prototype.updateHash.call(this, hash);
|
||||
};
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var async = require("async");
|
||||
|
||||
var Tapable = require("tapable");
|
||||
var NormalModule = require("./NormalModule");
|
||||
var LoadersList = require("webpack-core/lib/LoadersList");
|
||||
|
||||
function NormalModuleFactory(resolvers, parser, options) {
|
||||
Tapable.call(this);
|
||||
this.resolvers = resolvers;
|
||||
this.parser = parser;
|
||||
this.loaders = new LoadersList(options.loaders);
|
||||
this.preLoaders = new LoadersList(options.preLoaders);
|
||||
this.postLoaders = new LoadersList(options.postLoaders);
|
||||
this.context = options.context || "";
|
||||
}
|
||||
module.exports = NormalModuleFactory;
|
||||
|
||||
NormalModuleFactory.prototype = Object.create(Tapable.prototype);
|
||||
NormalModuleFactory.prototype.create = function(context, dependency, callback) {
|
||||
context = context || this.context;
|
||||
var request = dependency.request;
|
||||
this.applyPluginsAsyncWaterfall("before-resolve", {
|
||||
context: context,
|
||||
request: request
|
||||
}, function(err, result) {
|
||||
if(err) return callback(err);
|
||||
|
||||
context = result.context;
|
||||
request = result.request;
|
||||
|
||||
var noAutoLoaders = /^!/.test(request);
|
||||
var noPrePostAutoLoaders = /^!!/.test(request);
|
||||
var elements = request.replace(/^!+/, "").replace(/!!+/g, "!").split("!");
|
||||
var resource = elements.pop();
|
||||
|
||||
async.parallel([
|
||||
function(callback) {
|
||||
this.resolveRequestArray(context, elements, this.resolvers.loader, callback);
|
||||
}.bind(this),
|
||||
function(callback) {
|
||||
if(resource == "" || resource[0] == "?")
|
||||
return callback(null, resource);
|
||||
this.resolvers.normal.resolve(context, resource, callback);
|
||||
}.bind(this)
|
||||
], function(err, results) {
|
||||
if(err) return callback(err);
|
||||
var loaders = results[0];
|
||||
resource = results[1];
|
||||
var userRequest = loaders.concat([resource]).join("!");
|
||||
|
||||
if(noPrePostAutoLoaders)
|
||||
return onDoneResolving.call(this);
|
||||
if(noAutoLoaders) {
|
||||
async.parallel([
|
||||
this.resolveRequestArray.bind(this, context, this.postLoaders.match(resource), this.resolvers.loader),
|
||||
this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader)
|
||||
], function(err, results) {
|
||||
if(err) return callback(err);
|
||||
loaders = results[0].concat(loaders).concat(results[1]);
|
||||
onDoneResolving.call(this);
|
||||
}.bind(this));
|
||||
} else {
|
||||
async.parallel([
|
||||
this.resolveRequestArray.bind(this, context, this.postLoaders.match(resource), this.resolvers.loader),
|
||||
this.resolveRequestArray.bind(this, context, this.loaders.match(resource), this.resolvers.loader),
|
||||
this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader)
|
||||
], function(err, results) {
|
||||
if(err) return callback(err);
|
||||
loaders = results[0].concat(results[1]).concat(loaders).concat(results[2]);
|
||||
onDoneResolving.call(this);
|
||||
}.bind(this));
|
||||
}
|
||||
function onDoneResolving() {
|
||||
this.applyPluginsAsyncWaterfall("after-resolve", {
|
||||
request: loaders.concat([resource]).join("!"),
|
||||
userRequest: userRequest,
|
||||
rawRequest: request,
|
||||
loaders: loaders,
|
||||
resource: resource,
|
||||
parser: this.parser
|
||||
}, function(err, result) {
|
||||
if(err) return callback(err);
|
||||
|
||||
return callback(null,
|
||||
new NormalModule(
|
||||
result.request,
|
||||
result.userRequest,
|
||||
result.rawRequest,
|
||||
result.loaders,
|
||||
result.resource,
|
||||
result.parser
|
||||
)
|
||||
);
|
||||
}.bind(this));
|
||||
}
|
||||
}.bind(this));
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray(context, array, resolver, callback) {
|
||||
if(array.length === 0) return callback(null, []);
|
||||
async.map(array, function(item, callback) {
|
||||
if(item == "" || item[0] == "?")
|
||||
return callback(null, item);
|
||||
resolver.resolve(context, item, callback);
|
||||
}, callback);
|
||||
};
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function NullFactory() {
|
||||
}
|
||||
module.exports = NullFactory;
|
||||
|
||||
NullFactory.prototype.create = function(context, dependency, callback) {
|
||||
return callback();
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function OptionsApply() {
|
||||
}
|
||||
module.exports = OptionsApply;
|
||||
|
||||
OptionsApply.prototype.process = function(options, compiler) {
|
||||
|
||||
};
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function OptionsDefaulter() {
|
||||
this.defaults = {};
|
||||
this.config = {};
|
||||
}
|
||||
module.exports = OptionsDefaulter;
|
||||
|
||||
function getProperty(obj, name) {
|
||||
name = name.split(".");
|
||||
for(var i = 0; i < name.length - 1; i++) {
|
||||
obj = obj[name[i]];
|
||||
if(typeof obj != "object" || !obj) return;
|
||||
}
|
||||
return obj[name.pop()];
|
||||
}
|
||||
|
||||
function setProperty(obj, name, value) {
|
||||
name = name.split(".");
|
||||
for(var i = 0; i < name.length - 1; i++) {
|
||||
if(typeof (obj[name[i]]) !== "object" || !obj[name[i]]) obj[name[i]] = {};
|
||||
obj = obj[name[i]];
|
||||
}
|
||||
obj[name.pop()] = value;
|
||||
}
|
||||
|
||||
function hasProperty(obj, name, value) {
|
||||
name = name.split(".");
|
||||
for(var i = 0; i < name.length - 1; i++) {
|
||||
obj = obj[name[i]];
|
||||
if(typeof obj != "object" || !obj) return false;
|
||||
}
|
||||
return Object.prototype.hasOwnProperty.call(obj, name.pop());
|
||||
}
|
||||
|
||||
OptionsDefaulter.prototype.process = function(options) {
|
||||
for(var name in this.defaults) {
|
||||
switch(this.config[name]) {
|
||||
case undefined:
|
||||
if(getProperty(options, name) === undefined)
|
||||
setProperty(options, name, this.defaults[name]);
|
||||
break;
|
||||
case "call":
|
||||
setProperty(options, name, this.defaults[name].call(this, getProperty(options, name)), options);
|
||||
break;
|
||||
case "append":
|
||||
var oldValue = getProperty(options, name);
|
||||
if(!Array.isArray(oldValue)) oldValue = [];
|
||||
this.defaults[name].forEach(function(item) {
|
||||
oldValue.push(item);
|
||||
});
|
||||
setProperty(options, name, oldValue);
|
||||
break;
|
||||
default:
|
||||
throw new Error("OptionsDefaulter cannot process " + this.config[name]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
OptionsDefaulter.prototype.set = function(name, config, def) {
|
||||
if(arguments.length === 3) {
|
||||
this.defaults[name] = def;
|
||||
this.config[name] = config;
|
||||
} else {
|
||||
this.defaults[name] = config;
|
||||
delete this.config[name];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,511 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var esprima = require("esprima");
|
||||
var Tapable = require("tapable");
|
||||
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
|
||||
|
||||
function Parser(options) {
|
||||
Tapable.call(this);
|
||||
this.options = options;
|
||||
this.initializeEvaluating();
|
||||
}
|
||||
module.exports = Parser;
|
||||
|
||||
// Syntax: https://developer.mozilla.org/en/SpiderMonkey/Parser_API
|
||||
|
||||
|
||||
|
||||
Parser.prototype = Object.create(Tapable.prototype);
|
||||
Parser.prototype.initializeEvaluating = function() {
|
||||
function joinRanges(startRange, endRange) {
|
||||
if(!endRange) return startRange;
|
||||
if(!startRange) return endRange;
|
||||
return [startRange[0], endRange[1]];
|
||||
}
|
||||
this.plugin("evaluate Literal", function(expr) {
|
||||
switch(typeof expr.value) {
|
||||
case "number":
|
||||
return new BasicEvaluatedExpression().setNumber(expr.value).setRange(expr.range);
|
||||
case "string":
|
||||
return new BasicEvaluatedExpression().setString(expr.value).setRange(expr.range);
|
||||
case "boolean":
|
||||
return new BasicEvaluatedExpression().setBoolean(expr.value).setRange(expr.range);
|
||||
}
|
||||
});
|
||||
this.plugin("evaluate BinaryExpression", function(expr) {
|
||||
if(expr.operator == "+") {
|
||||
var left = this.evaluateExpression(expr.left);
|
||||
var right = this.evaluateExpression(expr.right);
|
||||
if(!left || !right) return;
|
||||
var res = new BasicEvaluatedExpression()
|
||||
if(left.isString()) {
|
||||
if(right.isString()) {
|
||||
res.setString(left.string + right.string);
|
||||
} else if(right.isNumber()) {
|
||||
res.setString(left.string + right.number);
|
||||
} else if(right.isWrapped() && right.prefix.isString()) {
|
||||
res.setWrapped(
|
||||
new BasicEvaluatedExpression()
|
||||
.setString(left.string + right.prefix.string)
|
||||
.setRange(joinRanges(left.range, right.prefix.range)),
|
||||
right.postfix);
|
||||
} else {
|
||||
res.setWrapped(left, new BasicEvaluatedExpression().setString(""))
|
||||
}
|
||||
} else if(left.isNumber()) {
|
||||
if(right.isString()) {
|
||||
res.setString(left.number + right.string);
|
||||
} else if(right.isNumber()) {
|
||||
res.setNumber(left.number + right.number);
|
||||
}
|
||||
} else if(left.isWrapped() && left.postfix.isString()) {
|
||||
if(right.isString()) {
|
||||
res.setWrapped(left.prefix,
|
||||
new BasicEvaluatedExpression()
|
||||
.setString(left.postfix.string + right.string)
|
||||
.setRange(joinRanges(left.postfix.range, right.range))
|
||||
);
|
||||
} else if(right.isNumber()) {
|
||||
res.setWrapped(left.prefix,
|
||||
new BasicEvaluatedExpression()
|
||||
.setString(left.postfix.string + right.number)
|
||||
.setRange(joinRanges(left.postfix.range, right.range))
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if(right.isString()) {
|
||||
res.setWrapped(new BasicEvaluatedExpression().setString(""), right);
|
||||
}
|
||||
}
|
||||
res.setRange(expr.range);
|
||||
return res;
|
||||
} else if(expr.operator == "==" || expr.operator == "===") {
|
||||
var left = this.evaluateExpression(expr.left);
|
||||
var right = this.evaluateExpression(expr.right);
|
||||
if(!left || !right) return;
|
||||
var res = new BasicEvaluatedExpression();
|
||||
res.setRange(expr.range);
|
||||
if(left.isString() && right.isString()) {
|
||||
return res.setBoolean(left.string === right.string);
|
||||
} else if(left.isNumber() && right.isNumber()) {
|
||||
return res.setBoolean(left.number === right.number);
|
||||
} else if(left.isBoolean() && right.isBoolean()) {
|
||||
return res.setBoolean(left.bool === right.bool);
|
||||
}
|
||||
} else if(expr.operator == "!=" || expr.operator == "!==") {
|
||||
var left = this.evaluateExpression(expr.left);
|
||||
var right = this.evaluateExpression(expr.right);
|
||||
if(!left || !right) return;
|
||||
var res = new BasicEvaluatedExpression();
|
||||
res.setRange(expr.range);
|
||||
if(left.isString() && right.isString()) {
|
||||
return res.setBoolean(left.string !== right.string);
|
||||
} else if(left.isNumber() && right.isNumber()) {
|
||||
return res.setBoolean(left.number !== right.number);
|
||||
} else if(left.isBoolean() && right.isBoolean()) {
|
||||
return res.setBoolean(left.bool !== right.bool);
|
||||
}
|
||||
}
|
||||
});
|
||||
this.plugin("evaluate UnaryExpression", function(expr) {
|
||||
if(expr.operator == "typeof" && expr.argument.type == "Identifier") {
|
||||
return this.applyPluginsBailResult("evaluate typeof " + expr.argument.name, expr);
|
||||
}
|
||||
});
|
||||
this.plugin("evaluate Identifier", function(expr) {
|
||||
return this.applyPluginsBailResult("evaluate Identifier " + expr.name, expr);
|
||||
});
|
||||
this.plugin("evaluate ConditionalExpression", function(expr) {
|
||||
var consequent = this.evaluateExpression(expr.consequent);
|
||||
var alternate = this.evaluateExpression(expr.alternate);
|
||||
if(!consequent || !alternate) return;
|
||||
var res = new BasicEvaluatedExpression();
|
||||
if(consequent.isConditional())
|
||||
res.setOptions(consequent.options);
|
||||
else
|
||||
res.setOptions([consequent]);
|
||||
if(alternate.isConditional())
|
||||
res.addOptions(alternate.options);
|
||||
else
|
||||
res.addOptions([alternate]);
|
||||
res.setRange(expr.range);
|
||||
return res;
|
||||
});
|
||||
this.plugin("evaluate ArrayExpression", function(expr) {
|
||||
var items = expr.elements.map(function(element) {
|
||||
return this.evaluateExpression(element);
|
||||
}, this);
|
||||
if(items.filter(function(i) { return !i; }).length > 0) return;
|
||||
return new BasicEvaluatedExpression().setItems(items).setRange(expr.range);
|
||||
});
|
||||
}
|
||||
Parser.prototype.walkStatements = function walkStatements(statements) {
|
||||
statements.forEach(function(statement) {
|
||||
this.walkStatement(statement);
|
||||
}, this);
|
||||
}
|
||||
|
||||
Parser.prototype.walkStatement = function walkStatement(statement) {
|
||||
switch(statement.type) {
|
||||
// Real Statements
|
||||
case "BlockStatement":
|
||||
this.walkStatements(statement.body);
|
||||
break;
|
||||
case "ExpressionStatement":
|
||||
this.walkExpression(statement.expression);
|
||||
break;
|
||||
case "IfStatement":
|
||||
var result = this.applyPluginsBailResult("statement if", statement);
|
||||
if(result === undefined) {
|
||||
this.walkExpression(statement.test);
|
||||
this.walkStatement(statement.consequent);
|
||||
if(statement.alternate)
|
||||
this.walkStatement(statement.alternate);
|
||||
} else {
|
||||
if(result)
|
||||
this.walkStatement(statement.consequent);
|
||||
else if(statement.alternate)
|
||||
this.walkStatement(statement.alternate);
|
||||
}
|
||||
break;
|
||||
case "LabeledStatement":
|
||||
this.walkStatement(statement.body);
|
||||
break;
|
||||
case "WithStatement":
|
||||
this.walkExpression(statement.object);
|
||||
this.walkStatement(statement.body);
|
||||
break;
|
||||
case "SwitchStatement":
|
||||
this.walkExpression(statement.discriminant);
|
||||
this.walkSwitchCases(statement.cases);
|
||||
break;
|
||||
case "ReturnStatement":
|
||||
case "ThrowStatement":
|
||||
if(statement.argument)
|
||||
this.walkExpression(statement.argument);
|
||||
break;
|
||||
case "TryStatement":
|
||||
if(this.scope.inTry) {
|
||||
this.walkStatement(statement.block);
|
||||
} else {
|
||||
this.scope.inTry = true;
|
||||
this.walkStatement(statement.block);
|
||||
this.scope.inTry = false;
|
||||
}
|
||||
this.walkCatchClauses(statement.handlers);
|
||||
if(statement.finalizer)
|
||||
this.walkStatement(statement.finalizer);
|
||||
break;
|
||||
case "WhileStatement":
|
||||
case "DoWhileStatement":
|
||||
this.walkExpression(statement.test);
|
||||
this.walkStatement(statement.body);
|
||||
break;
|
||||
case "ForStatement":
|
||||
if(statement.init) {
|
||||
if(statement.init.type === "VariableDeclaration")
|
||||
this.walkStatement(statement.init);
|
||||
else
|
||||
this.walkExpression(statement.init);
|
||||
}
|
||||
if(statement.test)
|
||||
this.walkExpression(statement.test);
|
||||
if(statement.update)
|
||||
this.walkExpression(statement.update);
|
||||
this.walkStatement(statement.body);
|
||||
break;
|
||||
case "ForInStatement":
|
||||
if(statement.left.type === "VariableDeclaration")
|
||||
this.walkStatement(statement.left);
|
||||
else
|
||||
this.walkExpression(statement.left);
|
||||
this.walkExpression(statement.right);
|
||||
this.walkStatement(statement.body);
|
||||
break;
|
||||
|
||||
// Declarations
|
||||
case "FunctionDeclaration":
|
||||
this.scope.definitions.push(statement.id.name);
|
||||
this.inScope(statement.params, function() {
|
||||
if(statement.body.type === "BlockStatement")
|
||||
this.walkStatement(statement.body);
|
||||
else
|
||||
this.walkExpression(statement.body);
|
||||
}.bind(this));
|
||||
break;
|
||||
case "VariableDeclaration":
|
||||
if(statement.declarations)
|
||||
this.walkVariableDeclarators(statement.declarations);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Parser.prototype.walkSwitchCases = function walkSwitchCases(switchCases) {
|
||||
switchCases.forEach(function(switchCase) {
|
||||
if(switchCase.test)
|
||||
this.walkExpression(switchCase.test);
|
||||
this.walkStatements(switchCase.consequent);
|
||||
}, this);
|
||||
}
|
||||
|
||||
Parser.prototype.walkCatchClauses = function walkCatchClauses(catchClauses) {
|
||||
catchClauses.forEach(function(catchClause) {
|
||||
if(catchClause.guard)
|
||||
this.walkExpression(catchClause.guard);
|
||||
this.inScope([catchClause.param], function() {
|
||||
this.walkStatement(catchClause.body);
|
||||
}.bind(this));
|
||||
}, this);
|
||||
}
|
||||
|
||||
Parser.prototype.walkVariableDeclarators = function walkVariableDeclarators(declarators) {
|
||||
declarators.forEach(function(declarator) {
|
||||
switch(declarator.type) {
|
||||
case "VariableDeclarator":
|
||||
if(declarator.id.type === "Identifier") {
|
||||
this.scope.definitions.push(declarator.id.name);
|
||||
}
|
||||
if(declarator.init)
|
||||
this.walkExpression(declarator.init);
|
||||
break;
|
||||
}
|
||||
}, this);
|
||||
}
|
||||
|
||||
Parser.prototype.walkExpressions = function walkExpressions(expressions) {
|
||||
expressions.forEach(function(expression) {
|
||||
this.walkExpression(expression);
|
||||
}, this);
|
||||
}
|
||||
|
||||
Parser.prototype.walkExpression = function walkExpression(expression) {
|
||||
switch(expression.type) {
|
||||
case "ArrayExpression":
|
||||
if(expression.elements)
|
||||
this.walkExpressions(expression.elements);
|
||||
break;
|
||||
case "ObjectExpression":
|
||||
expression.properties.forEach(function(prop) {
|
||||
this.walkExpression(prop.value);
|
||||
}, this);
|
||||
break;
|
||||
case "FunctionExpression":
|
||||
this.inScope(expression.params, function() {
|
||||
if(expression.body.type === "BlockStatement")
|
||||
this.walkStatement(expression.body);
|
||||
else
|
||||
this.walkExpression(expression.body);
|
||||
}.bind(this));
|
||||
break;
|
||||
case "SequenceExpression":
|
||||
if(expression.expressions)
|
||||
this.walkExpressions(expression.expressions);
|
||||
break;
|
||||
case "UpdateExpression":
|
||||
this.walkExpression(expression.argument);
|
||||
break;
|
||||
case "UnaryExpression":
|
||||
if(expression.operator === "typeof") {
|
||||
var expr = expression.argument;
|
||||
var exprName = [];
|
||||
while(expr.type == "MemberExpression" && expr.property.type == "Identifier") {
|
||||
exprName.unshift(expr.property.name);
|
||||
expr = expr.object;
|
||||
}
|
||||
if(expr.type == "Identifier" && this.scope.definitions.indexOf(expr.name) == -1) {
|
||||
exprName.unshift(expr.name);
|
||||
exprName = exprName.join(".");
|
||||
var result = this.applyPluginsBailResult("typeof " + exprName, expression);
|
||||
if(result === true)
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.walkExpression(expression.argument);
|
||||
break;
|
||||
case "BinaryExpression":
|
||||
case "LogicalExpression":
|
||||
this.walkExpression(expression.left);
|
||||
this.walkExpression(expression.right);
|
||||
break;
|
||||
case "AssignmentExpression":
|
||||
if(expression.left.type !== "Identifier" ||
|
||||
expression.left.name !== "require")
|
||||
this.walkExpression(expression.left);
|
||||
this.walkExpression(expression.right);
|
||||
break;
|
||||
case "ConditionalExpression":
|
||||
this.walkExpression(expression.test);
|
||||
this.walkExpression(expression.alternate);
|
||||
this.walkExpression(expression.consequent);
|
||||
break;
|
||||
case "NewExpression":
|
||||
this.walkExpression(expression.callee);
|
||||
if(expression.arguments)
|
||||
this.walkExpressions(expression.arguments);
|
||||
break;
|
||||
case "CallExpression":
|
||||
var callee = expression.callee;
|
||||
var calleeName = [];
|
||||
while(callee.type == "MemberExpression" && callee.property.type == "Identifier") {
|
||||
calleeName.unshift(callee.property.name);
|
||||
callee = callee.object;
|
||||
}
|
||||
if(callee.type == "Identifier" && this.scope.definitions.indexOf(callee.name) == -1) {
|
||||
calleeName.unshift(callee.name);
|
||||
calleeName = calleeName.join(".");
|
||||
var result = this.applyPluginsBailResult("call " + calleeName, expression);
|
||||
if(result === true)
|
||||
break;
|
||||
}
|
||||
|
||||
if(expression.callee)
|
||||
this.walkExpression(expression.callee);
|
||||
if(expression.arguments)
|
||||
this.walkExpressions(expression.arguments);
|
||||
break;
|
||||
case "MemberExpression":
|
||||
var expr = expression;
|
||||
var exprName = [];
|
||||
while(expr.type == "MemberExpression" && expr.property.type == "Identifier") {
|
||||
exprName.unshift(expr.property.name);
|
||||
expr = expr.object;
|
||||
}
|
||||
if(expr.type == "Identifier" && this.scope.definitions.indexOf(expr.name) == -1) {
|
||||
exprName.unshift(expr.name);
|
||||
exprName = exprName.join(".");
|
||||
var result = this.applyPluginsBailResult("expression " + exprName, expression);
|
||||
if(result === true)
|
||||
break;
|
||||
}
|
||||
this.walkExpression(expression.object);
|
||||
if(expression.property.type !== "Identifier")
|
||||
this.walkExpression(expression.property);
|
||||
break;
|
||||
case "Identifier":
|
||||
if(this.scope.definitions.indexOf(expression.name) == -1) {
|
||||
var result = this.applyPluginsBailResult("expression " + expression.name, expression);
|
||||
if(result === true)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Parser.prototype.inScope = function inScope(params, fn) {
|
||||
var oldScope = this.scope;
|
||||
this.scope = {
|
||||
inTry: false,
|
||||
definitions: oldScope.definitions.slice()
|
||||
};
|
||||
params.forEach(function(param) {
|
||||
if(typeof param !== "string") {
|
||||
if(param.type !== "Identifier")
|
||||
return;
|
||||
param = param.name;
|
||||
}
|
||||
this.scope.definitions.push(param);
|
||||
}, this);
|
||||
fn();
|
||||
this.scope = oldScope;
|
||||
}
|
||||
|
||||
Parser.prototype.evaluateExpression = function evaluateExpression(expression) {
|
||||
var result = this.applyPluginsBailResult("evaluate " + expression.type, expression);
|
||||
if(result !== undefined)
|
||||
return result;
|
||||
return new BasicEvaluatedExpression().setRange(expression.range);
|
||||
}
|
||||
|
||||
Parser.prototype.parseString = function parseString(expression) {
|
||||
switch(expression.type) {
|
||||
case "BinaryExpression":
|
||||
if(expression.operator == "+")
|
||||
return this.parseString(expression.left) + this.parseString(expression.right);
|
||||
break;
|
||||
case "Literal":
|
||||
return expression.value+"";
|
||||
}
|
||||
throw new Error(expression.type + " is not supported as parameter for require");
|
||||
}
|
||||
|
||||
Parser.prototype.parseCalculatedString = function parseCalculatedString(expression) {
|
||||
switch(expression.type) {
|
||||
case "BinaryExpression":
|
||||
if(expression.operator == "+") {
|
||||
var left = this.parseCalculatedString(expression.left);
|
||||
var right = this.parseCalculatedString(expression.right);
|
||||
if(left.code) {
|
||||
return {range: left.range, value: left.value, code: true};
|
||||
} else if(right.code) {
|
||||
return {range: [left.range[0], right.range ? right.range[1] : left.range[1]], value: left.value + right.value, code: true};
|
||||
} else {
|
||||
return {range: [left.range[0], right.range[1]], value: left.value + right.value};
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "ConditionalExpression":
|
||||
var consequent = this.parseCalculatedString(expression.consequent);
|
||||
var alternate = this.parseCalculatedString(expression.alternate);
|
||||
var items = [];
|
||||
if(consequent.conditional)
|
||||
Array.prototype.push.apply(items, consequent.conditional);
|
||||
else if(!consequent.code)
|
||||
items.push(consequent);
|
||||
else break;
|
||||
if(alternate.conditional)
|
||||
Array.prototype.push.apply(items, alternate.conditional);
|
||||
else if(!alternate.code)
|
||||
items.push(alternate);
|
||||
else break;
|
||||
return {value: "", code: true, conditional: items};
|
||||
case "Literal":
|
||||
return {range: expression.range, value: expression.value+""};
|
||||
break;
|
||||
}
|
||||
return {value: "", code: true};
|
||||
}
|
||||
|
||||
Parser.prototype.parseStringArray = function parseStringArray(expression) {
|
||||
switch(expression.type) {
|
||||
case "ArrayExpression":
|
||||
var arr = [];
|
||||
if(expression.elements)
|
||||
expression.elements.forEach(function(expr) {
|
||||
arr.push(this.parseString(expr));
|
||||
}, this);
|
||||
return arr;
|
||||
}
|
||||
return [this.parseString(expression)];
|
||||
}
|
||||
|
||||
Parser.prototype.parseCalculatedStringArray = function parseCalculatedStringArray(expression) {
|
||||
switch(expression.type) {
|
||||
case "ArrayExpression":
|
||||
var arr = [];
|
||||
if(expression.elements)
|
||||
expression.elements.forEach(function(expr) {
|
||||
arr.push(this.parseCalculatedString(expr));
|
||||
}, this);
|
||||
return arr;
|
||||
}
|
||||
return [this.parseCalculatedString(expression)];
|
||||
}
|
||||
|
||||
Parser.prototype.parse = function parse(source, initialState) {
|
||||
var ast = esprima.parse(source, {range: true, loc: true, raw: true});
|
||||
if(!ast || typeof ast != "object")
|
||||
throw new Error("Source couldn't be parsed");
|
||||
var oldScope = this.scope;
|
||||
var oldState = this.state;
|
||||
this.scope = {
|
||||
inTry: false,
|
||||
definitions: []
|
||||
};
|
||||
var state = this.state = initialState || {};
|
||||
this.walkStatements(ast.body);
|
||||
this.scope = oldScope;
|
||||
this.state = oldState;
|
||||
return state;
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
function ProgressPlugin(handler) {
|
||||
this.handler = handler;
|
||||
}
|
||||
module.exports = ProgressPlugin;
|
||||
|
||||
ProgressPlugin.prototype.apply = function(compiler) {
|
||||
var lastModulesCount = 0;
|
||||
var moduleCount = 1;
|
||||
var doneModules = 0;
|
||||
var handler = this.handler;
|
||||
function update() {
|
||||
handler(0.1 + (doneModules / Math.max(lastModulesCount, moduleCount)) * 0.6, doneModules + "/" + moduleCount + " build modules");
|
||||
}
|
||||
compiler.plugin("compilation", function(compilation) {
|
||||
lastModulesCount = moduleCount;
|
||||
moduleCount = 0;
|
||||
doneModules = 0;
|
||||
handler(0, "compile");
|
||||
compilation.plugin("build-module", function(module) {
|
||||
moduleCount++;
|
||||
update();
|
||||
});
|
||||
compilation.plugin("succeed-module", function(module) {
|
||||
doneModules++;
|
||||
update();
|
||||
});
|
||||
compilation.plugin("optimize", function() {
|
||||
handler(0.75, "optimize");
|
||||
});
|
||||
compilation.plugin("optimize-chunk-assets", function(chunks, callback) {
|
||||
handler(0.8, "optimize chunk assets");
|
||||
callback();
|
||||
});
|
||||
compilation.plugin("optimize-assets", function(assets, callback) {
|
||||
handler(0.9, "optimize assets");
|
||||
callback();
|
||||
});
|
||||
});
|
||||
compiler.plugin("emit", function(compilation, callback) {
|
||||
handler(0.95, "emit");
|
||||
callback();
|
||||
});
|
||||
compiler.plugin("done", function(stats) {
|
||||
handler(1, "");
|
||||
});
|
||||
};
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var Source = require("webpack-core/lib/Source");
|
||||
|
||||
function ReplaceSource(source) {
|
||||
Source.call(this);
|
||||
this._source = source;
|
||||
this.replacements = [];
|
||||
}
|
||||
module.exports = ReplaceSource;
|
||||
|
||||
ReplaceSource.prototype = Object.create(Source.prototype);
|
||||
|
||||
ReplaceSource.prototype.replace = function(start, end, newValue) {
|
||||
this.replacements.push([start, end, newValue]);
|
||||
};
|
||||
|
||||
ReplaceSource.prototype.insert = function(pos, newValue) {
|
||||
this.replacements.push([pos, pos-1, newValue]);
|
||||
};
|
||||
|
||||
ReplaceSource.prototype._bake = function() {
|
||||
this.replacements.sort(function(a, b) {
|
||||
return b[0] - a[0];
|
||||
});
|
||||
var result = [this._source.source()];
|
||||
this.replacements.forEach(function(repl) {
|
||||
var remSource = result.pop();
|
||||
result.push(
|
||||
remSource.substr(repl[1]+1),
|
||||
repl[2],
|
||||
remSource.substr(0, repl[0])
|
||||
);
|
||||
});
|
||||
result = result.reverse().join("");
|
||||
return {
|
||||
source: result
|
||||
}
|
||||
};
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var path = require("path");
|
||||
|
||||
function RequestShortener(directory) {
|
||||
var parentDirectory = path.dirname(directory);
|
||||
var buildins = path.join(__dirname, "..");
|
||||
var currentDirectoryRegExp = directory.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||
currentDirectoryRegExp = new RegExp("^" + currentDirectoryRegExp + "|(!)" + currentDirectoryRegExp, "g");
|
||||
var buildinsAsModule = currentDirectoryRegExp.test(buildins);
|
||||
var parentDirectoryRegExp = parentDirectory.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||
parentDirectoryRegExp = new RegExp("^" + parentDirectoryRegExp + "|(!)" + parentDirectoryRegExp, "g");
|
||||
var buildinsRegExp = buildins.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||
buildinsRegExp = new RegExp("^" + buildinsRegExp + "|(!)" + buildinsRegExp, "g");
|
||||
|
||||
this.buildinsAsModule = buildinsAsModule;
|
||||
this.currentDirectoryRegExp = currentDirectoryRegExp;
|
||||
this.parentDirectoryRegExp = parentDirectoryRegExp;
|
||||
this.buildinsRegExp = buildinsRegExp;
|
||||
this.node_modulesRegExp = /\/node_modules\//g;
|
||||
this.index_jsRegExp = /\/index.js!/g;
|
||||
}
|
||||
module.exports = RequestShortener;
|
||||
|
||||
RequestShortener.prototype.shorten = function(request) {
|
||||
if(!request)
|
||||
return request;
|
||||
if(this.buildinsAsModule)
|
||||
request = request.replace(this.buildinsRegExp, "!(webpack)");
|
||||
request = request.replace(this.currentDirectoryRegExp, "!.");
|
||||
request = request.replace(this.parentDirectoryRegExp, "!.");
|
||||
if(!this.buildinsAsModule)
|
||||
request = request.replace(this.buildinsRegExp, "!(webpack)");
|
||||
request = request.replace(/\\/g, "/");
|
||||
request = request.replace(this.node_modulesRegExp, "/~/");
|
||||
request = request.replace(this.index_jsRegExp, "!");
|
||||
return request.replace(/^!|!$/, "");
|
||||
};
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var WrapSource = require("./WrapSource");
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function CommonJsMainTemplateDecorator(mainTemplate, varExpression) {
|
||||
this.mainTemplate = mainTemplate;
|
||||
this.varExpression = varExpression;
|
||||
}
|
||||
module.exports = CommonJsMainTemplateDecorator;
|
||||
CommonJsMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
|
||||
var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates);
|
||||
var prefix = this.varExpression + " =\n";
|
||||
return new WrapSource(new RawSource(prefix), source, new RawSource(""));
|
||||
};
|
||||
CommonJsMainTemplateDecorator.prototype.updateHash = function(hash) {
|
||||
hash.update("set var");
|
||||
hash.update(this.varExpression);
|
||||
this.mainTemplate.updateHash(hash);
|
||||
};
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var SingleEntryDependency = require("./dependencies/SingleEntryDependency");
|
||||
|
||||
function SingleEntryPlugin(context, entry, name) {
|
||||
this.context = context;
|
||||
this.entry = entry;
|
||||
this.name = name;
|
||||
}
|
||||
module.exports = SingleEntryPlugin;
|
||||
SingleEntryPlugin.prototype.apply = function(compiler) {
|
||||
compiler.plugin("compilation", function(compilation, params) {
|
||||
var normalModuleFactory = params.normalModuleFactory;
|
||||
|
||||
compilation.dependencyFactories.set(SingleEntryDependency, normalModuleFactory);
|
||||
});
|
||||
compiler.plugin("make", function(compilation, callback) {
|
||||
compilation.addEntry(this.context, new SingleEntryDependency(this.entry), this.name, callback);
|
||||
}.bind(this));
|
||||
};
|
|
@ -0,0 +1,422 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var RequestShortener = require("./RequestShortener");
|
||||
|
||||
function Stats(compilation) {
|
||||
this.compilation = compilation;
|
||||
}
|
||||
module.exports = Stats;
|
||||
|
||||
Stats.prototype.hasWarnings = function() {
|
||||
return this.compilation.warnings.length > 0;
|
||||
};
|
||||
|
||||
Stats.prototype.hasErrors = function() {
|
||||
return this.compilation.errors.length > 0;
|
||||
};
|
||||
|
||||
Stats.prototype.toJson = function toJson(options, forToString) {
|
||||
if(!options) options = {};
|
||||
function d(v, d) { return v === undefined ? d : v }
|
||||
var compilation = this.compilation;
|
||||
var requestShortener = new RequestShortener(d(options.context, process.cwd()));
|
||||
var showHash = d(options.hash, true);
|
||||
var showTimings = d(options.timings, true);
|
||||
var showAssets = d(options.assets, true);
|
||||
var showChunks = d(options.chunks, true);
|
||||
var showChunkModules = d(options.chunkModules, !!forToString);
|
||||
var showModules = d(options.modules, !forToString);
|
||||
var showCachedModules = d(options.cached, true);
|
||||
var showReasons = d(options.reasons, !forToString);
|
||||
var showChildren = d(options.children, true);
|
||||
var sortModules = d(options.modulesSort, "id");
|
||||
var sortChunks = d(options.chunksSort, "id");
|
||||
var sortAssets = d(options.assetsSort, "");
|
||||
|
||||
function sortByField(field) {
|
||||
if(!field) return function() { return 0; }
|
||||
if(field[0] == "!") {
|
||||
field = field.substr(1);
|
||||
return function(a, b) {
|
||||
if(a[field] == b[field]) return 0;
|
||||
return (a[field] < b[field]) ? 1 : -1;
|
||||
}
|
||||
}
|
||||
return function(a, b) {
|
||||
if(a[field] == b[field]) return 0;
|
||||
return (a[field] < b[field]) ? -1 : 1;
|
||||
}
|
||||
}
|
||||
function formatError(e) {
|
||||
var text = "";
|
||||
if(e.module) {
|
||||
// text += e.module.readableIdentifier(requestShortener) + "\n";
|
||||
text += e.module.identifier() + "\n";
|
||||
} else if(e.file) {
|
||||
text += e.file + "\n";
|
||||
}
|
||||
text += e.message;
|
||||
if(e.dependencies && e.origin) {
|
||||
text += "\n @ " + e.origin.readableIdentifier(requestShortener);
|
||||
e.dependencies.forEach(function(dep) {
|
||||
if(!dep.loc) return;
|
||||
if(!dep.loc.start) return;
|
||||
if(!dep.loc.end) return;
|
||||
text += " " + dep.loc.start.line + ":" + dep.loc.start.column + "-" +
|
||||
(dep.loc.start.line != dep.loc.end.line ? dep.loc.end.line + ":" : "") + dep.loc.end.column;
|
||||
});
|
||||
}
|
||||
return text;
|
||||
}
|
||||
var obj = {
|
||||
errors: compilation.errors.map(formatError),
|
||||
warnings: compilation.warnings.map(formatError)
|
||||
};
|
||||
|
||||
if(showHash) obj.hash = compilation.hash;
|
||||
if(showTimings && this.startTime && this.endTime) {
|
||||
obj.time = this.endTime - this.startTime;
|
||||
}
|
||||
if(showAssets) {
|
||||
var assetsByFile = {};
|
||||
obj.assets = Object.keys(compilation.assets).map(function(asset) {
|
||||
var obj = {
|
||||
name: asset,
|
||||
size: compilation.assets[asset].size(),
|
||||
chunks: [],
|
||||
chunkNames: []
|
||||
};
|
||||
assetsByFile[asset] = obj;
|
||||
return obj;
|
||||
});
|
||||
compilation.chunks.forEach(function(chunk) {
|
||||
chunk.files.forEach(function(asset) {
|
||||
if(assetsByFile[asset]) {
|
||||
assetsByFile[asset].chunks.push(chunk.id);
|
||||
if(chunk.name)
|
||||
assetsByFile[asset].chunkNames.push(chunk.name);
|
||||
}
|
||||
});
|
||||
});
|
||||
obj.assets.sort(sortByField(sortAssets));
|
||||
}
|
||||
function fnModule(module) {
|
||||
var obj = {
|
||||
id: module.id,
|
||||
identifier: module.identifier(),
|
||||
name: module.readableIdentifier(requestShortener),
|
||||
size: module.size(),
|
||||
cacheable: !!module.cacheable,
|
||||
built: !!module.built,
|
||||
chunks: module.chunks.map(function(chunk) {
|
||||
return chunk.id;
|
||||
})
|
||||
};
|
||||
if(showReasons) {
|
||||
obj.reasons = module.reasons.filter(function(reason) {
|
||||
return reason.dependency && reason.dependency.module && reason.module;
|
||||
}).map(function(reason) {
|
||||
var obj = {
|
||||
moduleId: reason.module.id,
|
||||
module: reason.module.readableIdentifier(requestShortener),
|
||||
type: reason.dependency.type,
|
||||
userRequest: reason.dependency.userRequest
|
||||
}
|
||||
var dep = reason.dependency;
|
||||
if(dep.loc) obj.loc = dep.loc.start.line + ":" + dep.loc.start.column + "-" +
|
||||
(dep.loc.start.line != dep.loc.end.line ? dep.loc.end.line + ":" : "") + dep.loc.end.column
|
||||
return obj;
|
||||
});
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
if(showChunks) {
|
||||
obj.chunks = compilation.chunks.map(function(chunk) {
|
||||
var obj = {
|
||||
id: chunk.id,
|
||||
size: chunk.modules.reduce(function(size, module) { return size + module.size(); }, 0),
|
||||
names: chunk.name ? [chunk.name] : [],
|
||||
files: chunk.files.slice(),
|
||||
parents: chunk.parents.map(function(c) {
|
||||
return c.id;
|
||||
})
|
||||
};
|
||||
if(showChunkModules) {
|
||||
obj.modules = chunk.modules.map(fnModule);
|
||||
if(!showCachedModules) {
|
||||
obj.modules = obj.modules.filter(function(m) {
|
||||
return m.built;
|
||||
});
|
||||
}
|
||||
obj.modules.sort(sortByField(sortModules));
|
||||
}
|
||||
return obj;
|
||||
});
|
||||
obj.chunks.sort(sortByField(sortChunks));
|
||||
}
|
||||
if(showModules) {
|
||||
obj.modules = compilation.modules.map(fnModule);
|
||||
if(!showCachedModules) {
|
||||
obj.modules = obj.modules.filter(function(m) {
|
||||
return m.built;
|
||||
});
|
||||
}
|
||||
obj.modules.sort(sortByField(sortModules));
|
||||
}
|
||||
if(showChildren) {
|
||||
obj.children = compilation.children.map(function(child) {
|
||||
var obj = new Stats(child).toJson(options);
|
||||
obj.name = child.name;
|
||||
return obj;
|
||||
});
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
|
||||
Stats.prototype.toString = function toString(options) {
|
||||
function d(v, d) { return v === undefined ? d : v }
|
||||
var useColors = d(options.colors, false);
|
||||
|
||||
var obj = this.toJson(options, true);
|
||||
|
||||
return Stats.jsonToString(obj, useColors);
|
||||
};
|
||||
|
||||
Stats.jsonToString = function jsonToString(obj, useColors) {
|
||||
var buf = [];
|
||||
function normal(str) {
|
||||
buf.push(str);
|
||||
}
|
||||
function bold(str) {
|
||||
if(useColors) buf.push("\033[1m");
|
||||
buf.push(str);
|
||||
if(useColors) buf.push("\033[22m");
|
||||
}
|
||||
function yellow(str) {
|
||||
if(useColors) buf.push("\033[1m\033[33m");
|
||||
buf.push(str);
|
||||
if(useColors) buf.push("\033[39m\033[22m");
|
||||
}
|
||||
function red(str) {
|
||||
if(useColors) buf.push("\033[1m\033[31m");
|
||||
buf.push(str);
|
||||
if(useColors) buf.push("\033[39m\033[22m");
|
||||
}
|
||||
function green(str) {
|
||||
if(useColors) buf.push("\033[1m\033[32m");
|
||||
buf.push(str);
|
||||
if(useColors) buf.push("\033[39m\033[22m");
|
||||
}
|
||||
function cyan(str) {
|
||||
if(useColors) buf.push("\033[1m\033[36m");
|
||||
buf.push(str);
|
||||
if(useColors) buf.push("\033[39m\033[22m");
|
||||
}
|
||||
function magenta(str) {
|
||||
if(useColors) buf.push("\033[1m\033[35m");
|
||||
buf.push(str);
|
||||
if(useColors) buf.push("\033[39m\033[22m");
|
||||
}
|
||||
function newline() {
|
||||
buf.push("\n");
|
||||
}
|
||||
function table(array, formats, align, splitter) {
|
||||
var rows = array.length;
|
||||
var cols = array[0].length;
|
||||
var colSizes = new Array(cols);
|
||||
for(var col = 0; col < cols; col++)
|
||||
colSizes[col] = 3;
|
||||
for(var row = 0; row < rows; row++) {
|
||||
for(var col = 0; col < cols; col++) {
|
||||
var value = array[row][col] + "";
|
||||
if(value.length > colSizes[col]) {
|
||||
colSizes[col] = value.length;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(var row = 0; row < rows; row++) {
|
||||
for(var col = 0; col < cols; col++) {
|
||||
var format = row == 0 ? bold : formats[col];
|
||||
var value = array[row][col] + "";
|
||||
var l = value.length;
|
||||
if(align[col] == "l")
|
||||
format(value);
|
||||
for(; l < colSizes[col]; l++)
|
||||
normal(" ");
|
||||
if(align[col] == "r")
|
||||
format(value);
|
||||
if(col + 1 < cols)
|
||||
normal(splitter || " ");
|
||||
}
|
||||
newline();
|
||||
}
|
||||
}
|
||||
|
||||
if(obj.hash) {
|
||||
normal("Hash: ");
|
||||
bold(obj.hash);
|
||||
newline();
|
||||
}
|
||||
if(obj.time) {
|
||||
normal("Time: ");
|
||||
bold(obj.time);
|
||||
normal("ms");
|
||||
newline();
|
||||
}
|
||||
if(obj.assets) {
|
||||
var t = [["Asset", "Size", "Chunks", "Chunk Names"]]
|
||||
obj.assets.forEach(function(asset) {
|
||||
t.push([
|
||||
asset.name,
|
||||
asset.size,
|
||||
asset.chunks.join(", "),
|
||||
asset.chunkNames.join(", ")
|
||||
])
|
||||
});
|
||||
table(t, [green, normal, bold, normal], "rrrl");
|
||||
}
|
||||
if(obj.chunks) {
|
||||
obj.chunks.forEach(function(chunk) {
|
||||
normal("chunk ");
|
||||
if(chunk.id < 1000) normal(" ");
|
||||
if(chunk.id < 100) normal(" ");
|
||||
if(chunk.id < 10) normal(" ");
|
||||
normal("{");
|
||||
yellow(chunk.id);
|
||||
normal("} ");
|
||||
green(chunk.files.join(", "));
|
||||
if(chunk.names && chunk.names.length > 0) {
|
||||
normal(" (");
|
||||
normal(chunk.names.join(", "));
|
||||
normal(")");
|
||||
}
|
||||
normal(" ");
|
||||
normal(chunk.size);
|
||||
chunk.parents.forEach(function(id) {
|
||||
normal(" ");
|
||||
normal("{");
|
||||
yellow(id);
|
||||
normal("} ");
|
||||
});
|
||||
newline();
|
||||
if(chunk.modules) {
|
||||
chunk.modules.forEach(function(module) {
|
||||
normal(" ");
|
||||
if(module.id < 1000) normal(" ");
|
||||
if(module.id < 100) normal(" ");
|
||||
if(module.id < 10) normal(" ");
|
||||
normal("[");
|
||||
normal(module.id);
|
||||
normal("] ");
|
||||
bold(module.name);
|
||||
normal(" ");
|
||||
normal(module.size);
|
||||
if(!module.cacheable) {
|
||||
red(" [not cacheable]");
|
||||
}
|
||||
if(module.built) {
|
||||
green(" [built]");
|
||||
}
|
||||
if(module.chunks) {
|
||||
module.chunks.forEach(function(chunk) {
|
||||
normal(" {");
|
||||
yellow(chunk);
|
||||
normal("}");
|
||||
});
|
||||
}
|
||||
newline();
|
||||
if(module.reasons) {
|
||||
module.reasons.forEach(function(reason) {
|
||||
normal(" ");
|
||||
normal(reason.type);
|
||||
normal(" ");
|
||||
cyan(reason.userRequest);
|
||||
normal(" [");
|
||||
normal(reason.moduleId);
|
||||
normal("] ");
|
||||
magenta(reason.module);
|
||||
if(reason.loc) {
|
||||
normal(" ");
|
||||
normal(reason.loc)
|
||||
}
|
||||
newline();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
if(obj.modules) {
|
||||
obj.modules.forEach(function(module) {
|
||||
if(module.id < 1000) normal(" ");
|
||||
if(module.id < 100) normal(" ");
|
||||
if(module.id < 10) normal(" ");
|
||||
normal("[");
|
||||
normal(module.id);
|
||||
normal("] ");
|
||||
(module.size >= 0 ? bold : normal)(module.name);
|
||||
normal(" ");
|
||||
normal(module.size);
|
||||
if(!module.cacheable) {
|
||||
red(" [not cacheable]");
|
||||
}
|
||||
if(module.built) {
|
||||
green(" [built]");
|
||||
}
|
||||
if(module.chunks) {
|
||||
module.chunks.forEach(function(chunk) {
|
||||
normal(" {");
|
||||
yellow(chunk);
|
||||
normal("}");
|
||||
});
|
||||
}
|
||||
newline();
|
||||
if(module.reasons) {
|
||||
module.reasons.forEach(function(reason) {
|
||||
normal(" ");
|
||||
normal(reason.type);
|
||||
normal(" ");
|
||||
cyan(reason.userRequest);
|
||||
normal(" [");
|
||||
normal(reason.moduleId);
|
||||
normal("] ");
|
||||
magenta(reason.module);
|
||||
if(reason.loc) {
|
||||
normal(" ");
|
||||
normal(reason.loc)
|
||||
}
|
||||
newline();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
if(obj.warnings) {
|
||||
obj.warnings.forEach(function(warning) {
|
||||
newline();
|
||||
yellow("WARNING in " + warning);
|
||||
newline();
|
||||
});
|
||||
}
|
||||
if(obj.errors) {
|
||||
obj.errors.forEach(function(error) {
|
||||
newline();
|
||||
red("ERROR in " + error);
|
||||
newline();
|
||||
});
|
||||
}
|
||||
if(obj.children) {
|
||||
obj.children.forEach(function(child) {
|
||||
normal("Child ");
|
||||
bold(child.name);
|
||||
normal(":");
|
||||
newline();
|
||||
buf.push(" ");
|
||||
buf.push(Stats.jsonToString(child, useColors).replace(/\n/g, "\n "));
|
||||
});
|
||||
}
|
||||
|
||||
while(buf[buf.length-1] === "\n") buf.pop();
|
||||
return buf.join("");
|
||||
};
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
var uglify = require("uglify-js");
|
||||
|
||||
function UglifyJsPlugin(options) {
|
||||
if(typeof options != "object") options = {};
|
||||
if(typeof options.compressor == "undefined") {
|
||||
options.compressor = {
|
||||
warnings: false
|
||||
}
|
||||
}
|
||||
this.options = options;
|
||||
}
|
||||
module.exports = UglifyJsPlugin;
|
||||
UglifyJsPlugin.prototype.apply = function(compiler) {
|
||||
var options = this.options;
|
||||
compiler.plugin("compilation", function(compilation) {
|
||||
compilation.plugin("optimize-chunk-assets", function(chunks, callback) {
|
||||
var files = [];
|
||||
chunks.forEach(function(chunk) {
|
||||
chunk.files.forEach(function(file) {
|
||||
files.push(file);
|
||||
});
|
||||
});
|
||||
files.forEach(function(file) {
|
||||
try {
|
||||
var input = compilation.assets[file].source();
|
||||
var ast = uglify.parse(input, {
|
||||
filename: file
|
||||
});
|
||||
ast.figure_out_scope()
|
||||
if(options.compressor !== false) {
|
||||
var compressor = uglify.Compressor(options.compressor);
|
||||
ast = ast.transform(compressor);
|
||||
ast.figure_out_scope();
|
||||
ast.compute_char_frequency(options.mangle || {});
|
||||
ast.mangle_names(options.mangle || {});
|
||||
}
|
||||
var source = ast.print_to_string({
|
||||
comments: options.comments || /^\**!|@preserve|@license/,
|
||||
beautify: options.beautify
|
||||
});
|
||||
compilation.assets[file] = new RawSource(source);
|
||||
} catch(err) {
|
||||
err.file = file;
|
||||
compilation.warnings.push(err);
|
||||
}
|
||||
});
|
||||
callback();
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var RawSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function WebWorkerChunkTemplate(outputOptions) {
|
||||
this.outputOptions = outputOptions || {};
|
||||
}
|
||||
module.exports = WebWorkerChunkTemplate;
|
||||
|
||||
WebWorkerChunkTemplate.prototype.render = function(chunk, moduleTemplate, dependencyTemplates) {
|
||||
var chunkCallbackName = this.outputOptions.chunkCallbackName || ("webpackChunk" + (this.outputOptions.library || ""));
|
||||
var buf = [];
|
||||
buf.push(chunkCallbackName + "({\n");
|
||||
chunk.modules.forEach(function(module, idx) {
|
||||
if(idx != 0) buf.push(",\n");
|
||||
buf.push("\n/***/ " + module.id + ":\n");
|
||||
var source = moduleTemplate.render(module, dependencyTemplates);
|
||||
buf.push(source.source());
|
||||
});
|
||||
buf.push("\n\n})");
|
||||
return new RawSource(buf.join(""));
|
||||
};
|
||||
|
||||
WebWorkerChunkTemplate.prototype.updateHash = function(hash) {
|
||||
hash.update("webworker");
|
||||
hash.update("1");
|
||||
hash.update(this.outputOptions.chunkCallbackName + "");
|
||||
hash.update(this.outputOptions.library + "");
|
||||
};
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var StringSource = require("webpack-core/lib/RawSource");
|
||||
|
||||
function WebWorkerMainTemplate(outputOptions) {
|
||||
this.outputOptions = outputOptions || {};
|
||||
}
|
||||
module.exports = WebWorkerMainTemplate;
|
||||
|
||||
var REGEXP_HASH = /\[hash\]/i;
|
||||
var REGEXP_NAME = /\[name\]/g;
|
||||
var REGEXP_ID = /\[id\]/i;
|
||||
WebWorkerMainTemplate.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
|
||||
var chunkCallbackName = this.outputOptions.chunkCallbackName || ("webpackChunk" + (this.outputOptions.library || ""));
|
||||
var publicPath = this.outputOptions.publicPath || "";
|
||||
var filename = this.outputOptions.filename || "bundle.js";
|
||||
var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename;
|
||||
var buf = [];
|
||||
function addLine(indent, line) {
|
||||
buf.push("/******/ ");
|
||||
for(var i = 0; i < indent; i++)
|
||||
buf.push("\t");
|
||||
buf.push(line);
|
||||
buf.push("\n");
|
||||
}
|
||||
function addRequireFunc(i) {
|
||||
addLine(i+0, "function require(moduleId) {");
|
||||
addLine(i+1, "if(typeof moduleId !== \"number\") throw new Error(\"Cannot find module '\"+moduleId+\"'\");");
|
||||
addLine(i+1, "if(installedModules[moduleId])");
|
||||
addLine(i+2, "return installedModules[moduleId].exports;");
|
||||
addLine(i+1, "var module = installedModules[moduleId] = {");
|
||||
addLine(i+2, "exports: {},");
|
||||
addLine(i+2, "id: moduleId,");
|
||||
addLine(i+2, "loaded: false");
|
||||
addLine(i+1, "};");
|
||||
addLine(i+1, "modules[moduleId].call(null, module, module.exports, require);");
|
||||
addLine(i+1, "module.loaded = true;");
|
||||
addLine(i+1, "return module.exports;");
|
||||
addLine(i+0, "}");
|
||||
}
|
||||
addLine(0, "(function webpackBootstrap(modules) {");
|
||||
addLine(1, "var installedModules = {};");
|
||||
addRequireFunc(1);
|
||||
addLine(1, "require.e = function requireEnsure(chunkId, callback) {");
|
||||
if(chunk.chunks.length == 0) {
|
||||
addLine(2, "callback.call(null, require);");
|
||||
} else {
|
||||
addLine(2, "if(installedChunks[chunkId] === 1) return callback.call(null, require);");
|
||||
addLine(2, "importScripts(" + JSON.stringify(chunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_NAME, "")).replace(REGEXP_ID, "\"+chunkId+\"") + ");");
|
||||
addLine(2, "callback.call(null, require);");
|
||||
}
|
||||
addLine(1, "};");
|
||||
addLine(1, "require.modules = modules;");
|
||||
addLine(1, "require.cache = installedModules;");
|
||||
if(chunk.chunks.length > 0) {
|
||||
addLine(1, "var installedChunks = {0:1};");
|
||||
addLine(1, "this[" + JSON.stringify(chunkCallbackName) + "] = function webpackChunkCallback(moreModules) {");
|
||||
addLine(2, "for(var moduleId in moreModules)");
|
||||
addLine(3, "modules[moduleId] = moreModules[moduleId];");
|
||||
addLine(1, "};");
|
||||
}
|
||||
addLine(1, "return require(0);");
|
||||
addLine(0, "})({");
|
||||
addLine(0, "c: " + JSON.stringify(publicPath.replace(REGEXP_HASH, hash)) + ",");
|
||||
chunk.modules.forEach(function(module, idx) {
|
||||
if(idx != 0) buf.push(",\n");
|
||||
buf.push("\n/***/ " + module.id + ":\n");
|
||||
var source = moduleTemplate.render(module, dependencyTemplates);
|
||||
buf.push(source.source());
|
||||
});
|
||||
buf.push("\n");
|
||||
addLine(0, "})");
|
||||
return new StringSource(buf.join(""));
|
||||
};
|
||||
|
||||
WebWorkerMainTemplate.prototype.updateHash = function(hash) {
|
||||
hash.update("webworker");
|
||||
hash.update("1");
|
||||
hash.update(this.outputOptions.publicPath + "");
|
||||
hash.update(this.outputOptions.filename + "");
|
||||
hash.update(this.outputOptions.chunkFilename + "");
|
||||
hash.update(this.outputOptions.chunkCallbackName + "");
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var WebWorkerMainTemplate = require("./WebWorkerMainTemplate");
|
||||
var WebWorkerChunkTemplate = require("./WebWorkerChunkTemplate");
|
||||
|
||||
function WebWorkerTemplatePlugin(options) {
|
||||
this.options = options;
|
||||
}
|
||||
module.exports = WebWorkerTemplatePlugin;
|
||||
WebWorkerTemplatePlugin.prototype.apply = function(compiler) {
|
||||
var options = this.options;
|
||||
compiler.mainTemplate = new WebWorkerMainTemplate(options);
|
||||
compiler.chunkTemplate = new WebWorkerChunkTemplate(options);
|
||||
compiler.plugin("compilation", function(compilation) {
|
||||
compilation.plugin("normal-module-loader", function(loaderContext) {
|
||||
loaderContext.target = "webworker";
|
||||
});
|
||||
});
|
||||
};
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var OptionsApply = require("./OptionsApply");
|
||||
|
||||
var FunctionModulePlugin = require("./FunctionModulePlugin");
|
||||
var JsonpTemplatePlugin = require("./JsonpTemplatePlugin");
|
||||
var EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin");
|
||||
var LibraryTemplatePlugin = require("./LibraryTemplatePlugin");
|
||||
|
||||
var SingleEntryPlugin = require("./SingleEntryPlugin");
|
||||
var CachePlugin = require("./CachePlugin");
|
||||
|
||||
var UglifyJsPlugin = require("./UglifyJsPlugin");
|
||||
|
||||
var ConsolePlugin = require("./ConsolePlugin");
|
||||
var APIPlugin = require("./APIPlugin");
|
||||
var ConstPlugin = require("./ConstPlugin");
|
||||
var CompatibilityPlugin = require("./CompatibilityPlugin");
|
||||
|
||||
var CommonJsPlugin = require("./dependencies/CommonJsPlugin");
|
||||
var AMDPlugin = require("./dependencies/AMDPlugin");
|
||||
var RequireContextPlugin = require("./dependencies/RequireContextPlugin");
|
||||
var RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");
|
||||
|
||||
var LimitChunkCountPlugin = require("./optimize/LimitChunkCountPlugin");
|
||||
var RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");
|
||||
var RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");
|
||||
var MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");
|
||||
|
||||
var ModulesInDirectoriesPlugin = require("enhanced-resolve/lib/ModulesInDirectoriesPlugin");
|
||||
var ModuleTemplatesPlugin = require("enhanced-resolve/lib/ModuleTemplatesPlugin");
|
||||
var ModuleAsFilePlugin = require("enhanced-resolve/lib/ModuleAsFilePlugin");
|
||||
var ModuleAsDirectoryPlugin = require("enhanced-resolve/lib/ModuleAsDirectoryPlugin");
|
||||
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
|
||||
var DirectoryDefaultFilePlugin = require("enhanced-resolve/lib/DirectoryDefaultFilePlugin");
|
||||
var DirectoryDescriptionFilePlugin = require("enhanced-resolve/lib/DirectoryDescriptionFilePlugin");
|
||||
var FileAppendPlugin = require("enhanced-resolve/lib/FileAppendPlugin");
|
||||
var DirectoryResultPlugin = require("enhanced-resolve/lib/DirectoryResultPlugin");
|
||||
|
||||
|
||||
function WebpackOptionsApply() {
|
||||
OptionsApply.call(this);
|
||||
}
|
||||
module.exports = WebpackOptionsApply;
|
||||
|
||||
WebpackOptionsApply.prototype = Object.create(OptionsApply.prototype);
|
||||
WebpackOptionsApply.prototype.process = function(options, compiler) {
|
||||
if(options.plugins && Array.isArray(options.plugins)) {
|
||||
compiler.apply.apply(compiler, options.plugins);
|
||||
}
|
||||
compiler.outputPath = options.output.path;
|
||||
compiler.apply(
|
||||
new JsonpTemplatePlugin(options.output),
|
||||
new FunctionModulePlugin(options.context, options.output)
|
||||
);
|
||||
if(options.output.library || options.output.libraryTarget != "var")
|
||||
compiler.apply(new LibraryTemplatePlugin(options.output.library, options.output.libraryTarget));
|
||||
if(options.devtool == "eval")
|
||||
compiler.apply(new EvalDevToolModulePlugin());
|
||||
if(typeof options.entry == "string") {
|
||||
compiler.apply(new SingleEntryPlugin(options.context, options.entry, "main"));
|
||||
} else if(typeof options.entry == "object") {
|
||||
Object.keys(options.entry).forEach(function(name) {
|
||||
compiler.apply(new SingleEntryPlugin(options.context, options.entry[name], name));
|
||||
});
|
||||
}
|
||||
compiler.apply(
|
||||
new CompatibilityPlugin(),
|
||||
new APIPlugin(),
|
||||
new ConstPlugin(),
|
||||
new RequireEnsurePlugin(),
|
||||
new RequireContextPlugin(options.resolve.modulesDirectories, options.resolve.extensions),
|
||||
new AMDPlugin(options.amd || {}),
|
||||
new CommonJsPlugin()
|
||||
);
|
||||
if(options.console)
|
||||
compiler.apply(new ConsolePlugin());
|
||||
|
||||
compiler.apply(
|
||||
new RemoveParentModulesPlugin(),
|
||||
new RemoveEmptyChunksPlugin(),
|
||||
new MergeDuplicateChunksPlugin()
|
||||
);
|
||||
if(options.optimize && options.optimize.maxChunks)
|
||||
compiler.apply(new LimitChunkCountPlugin(options.optimize));
|
||||
|
||||
if(options.optimize.minimize === true)
|
||||
compiler.apply(new UglifyJsPlugin());
|
||||
else if(options.optimize.minimize)
|
||||
compiler.apply(new UglifyJsPlugin(options.optimize.minimize));
|
||||
|
||||
if(options.cache === undefined ? options.watch : options.cache)
|
||||
compiler.apply(new CachePlugin(typeof options.cache == "object" ? options.cache : null));
|
||||
|
||||
compiler.applyPlugins("after-plugins", compiler);
|
||||
compiler.resolvers.normal.apply(
|
||||
new ModuleAliasPlugin(options.resolve.alias),
|
||||
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
|
||||
new ModuleAsFilePlugin("module"),
|
||||
new ModuleAsDirectoryPlugin("module"),
|
||||
new DirectoryDescriptionFilePlugin("package.json", ["webpack", "browserify", "web", ["jam", "main"], "main"]),
|
||||
new DirectoryDefaultFilePlugin(["index"]),
|
||||
new FileAppendPlugin(options.resolve.extensions)
|
||||
);
|
||||
compiler.resolvers.context.apply(
|
||||
new ModuleAliasPlugin(options.resolve.alias),
|
||||
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
|
||||
new ModuleAsFilePlugin("module"),
|
||||
new ModuleAsDirectoryPlugin("module"),
|
||||
new DirectoryResultPlugin()
|
||||
);
|
||||
compiler.resolvers.loader.apply(
|
||||
new ModuleAliasPlugin(options.resolveLoader.alias),
|
||||
new ModulesInDirectoriesPlugin("loader-module", options.resolveLoader.modulesDirectories),
|
||||
new ModuleTemplatesPlugin("loader-module", options.resolveLoader.moduleTemplates, "module"),
|
||||
new ModuleAsFilePlugin("module"),
|
||||
new ModuleAsDirectoryPlugin("module"),
|
||||
new DirectoryDescriptionFilePlugin("package.json", ["webpackLoader", "webLoader", "loader", "main"]),
|
||||
new DirectoryDefaultFilePlugin(["index"]),
|
||||
new FileAppendPlugin(options.resolveLoader.extensions)
|
||||
);
|
||||
compiler.applyPlugins("after-resolvers", compiler);
|
||||
return options;
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var OptionsDefaulter = require("./OptionsDefaulter");
|
||||
var path = require("path");
|
||||
|
||||
function WebpackOptionsDefaulter(str) {
|
||||
OptionsDefaulter.call(this);
|
||||
this.set("debug", false);
|
||||
this.set("devtool", false);
|
||||
this.set("minimize", true);
|
||||
|
||||
this.set("context", process.cwd());
|
||||
this.set("output", {});
|
||||
this.set("optimize", {});
|
||||
this.set("resolve", {});
|
||||
this.set("resolveLoader", {});
|
||||
|
||||
this.set("output.libraryTarget", "var");
|
||||
this.set("output.path", "");
|
||||
|
||||
this.set("resolve.modulesDirectories", ["web_modules", "node_modules"]);
|
||||
this.set("resolveLoader.modulesDirectories", ["web_loaders", "web_modules", "node_loaders", "node_modules"]);
|
||||
|
||||
this.set("resolveLoader.moduleTemplates", ["*-webpack-loader", "*-web-loader", "*-loader", "*"]);
|
||||
|
||||
this.set("resolve.alias", {});
|
||||
this.set("resolveLoader.alias", {});
|
||||
|
||||
this.set("resolve.extensions", ["", ".webpack.js", ".web.js", ".js"]);
|
||||
this.set("resolveLoader.extensions", ["", ".webpack-loader.js", ".web-loader.js", ".loader.js", ".js"]);
|
||||
|
||||
this.set("resolve.resourceModulesDirectories", ["web_modules", "node_modules"]);
|
||||
this.set("resolve.packageMains", ["webpack", "main"]);
|
||||
|
||||
this.set("resolve.loaderModulesDirectories", ["web_loaders", "web_modules", "node_modules"]);
|
||||
this.set("resolve.loaderPostfixes", ["-webpack-web-loader", "-webpack-loader", "-web-loader", "-loader", ""]);
|
||||
this.set("resolve.loaderExtensions", [".webpack-web-loader.js", ".webpack-loader.js", ".web-loader.js", ".loader.js", "", ".js"]);
|
||||
this.set("resolve.loaderPackageMains", ["webpackLoader", "webLoader", "loader", "main"]);
|
||||
}
|
||||
module.exports = WebpackOptionsDefaulter;
|
||||
|
||||
WebpackOptionsDefaulter.prototype = Object.create(OptionsDefaulter.prototype);
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var Source = require("webpack-core/lib/Source");
|
||||
|
||||
function WrapSource(prefix, source, postfix) {
|
||||
Source.call(this);
|
||||
this.prefix = prefix;
|
||||
this._source = source;
|
||||
this.postfix = postfix;
|
||||
}
|
||||
module.exports = WrapSource;
|
||||
|
||||
WrapSource.prototype = Object.create(Source.prototype);
|
||||
|
||||
WrapSource.prototype._bake = function() {
|
||||
var prefix = this.prefix.source();
|
||||
var source = this._source.source();
|
||||
var postfix = this.postfix.source();
|
||||
return {
|
||||
source: prefix + source + postfix
|
||||
}
|
||||
};
|
852
lib/buildDeps.js
852
lib/buildDeps.js
|
@ -1,852 +0,0 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var resolve = require("enhanced-resolve");
|
||||
var execLoaders = require("enhanced-require/lib/execLoaders");
|
||||
var matchRegExpObject = require("enhanced-resolve/lib/matchRegExpObject");
|
||||
var buildModule = require("./buildModule");
|
||||
var fs = require("fs");
|
||||
var path = require("path");
|
||||
var assert = require("assert");
|
||||
|
||||
/**
|
||||
* @param context: current directory
|
||||
* @param mainModule: the entrance module
|
||||
* @param options: options
|
||||
* @param callback: function(err, result)
|
||||
*/
|
||||
module.exports = function buildDeps(context, mainModule, options, callback) {
|
||||
if(!callback) {
|
||||
callback = options;
|
||||
options = {};
|
||||
}
|
||||
|
||||
// options.events mock for tests
|
||||
if(!options) options = {};
|
||||
if(!options.events) options.events = { emit: function() {} };
|
||||
|
||||
// create data structure
|
||||
var depTree = {
|
||||
warnings: [],
|
||||
errors: [],
|
||||
modules: {},
|
||||
modulesById: {},
|
||||
chunks: {},
|
||||
chunkCount: 0,
|
||||
nextModuleId: 0,
|
||||
nextChunkId: 1,
|
||||
chunkModules: {} // used by checkObsolete
|
||||
}
|
||||
|
||||
// some progress info
|
||||
options.events.emit("task", "build modules");
|
||||
options.events.emit("task", "build chunks");
|
||||
options.events.emit("task", "optimize");
|
||||
options.events.emit("task", "cleanup");
|
||||
|
||||
// add the entrance file as module
|
||||
// all other stuff is added recursivly
|
||||
addModule(depTree, context, mainModule, options, {type: "main"}, function(err, id) {
|
||||
if(err) {
|
||||
if(depTree.modulesById[0]) {
|
||||
depTree.errors.push("Entry module failed!\n " + err +
|
||||
"\n @ " + mainModule);
|
||||
id = 0;
|
||||
} else {
|
||||
return callback(err);
|
||||
}
|
||||
}
|
||||
buildTree(id);
|
||||
});
|
||||
|
||||
// enhance the tree
|
||||
function buildTree(mainModuleId) {
|
||||
options.events.emit("task-end", "build modules");
|
||||
|
||||
// split the modules into chunks
|
||||
depTree.modulesById[mainModuleId].name = "main";
|
||||
addChunk(depTree, depTree.modulesById[mainModuleId], options);
|
||||
|
||||
// rename the module ids after a defined sheme
|
||||
createRealIds(depTree, options);
|
||||
options.events.emit("task-end", "build chunks");
|
||||
|
||||
for(var chunkId in depTree.chunks) {
|
||||
// remove modules which are included in parent chunk
|
||||
removeParentsModules(depTree, depTree.chunks[chunkId]);
|
||||
|
||||
// remove duplicate and empty chunks
|
||||
checkObsolete(depTree, depTree.chunks[chunkId]);
|
||||
}
|
||||
|
||||
if(options.maxChunks) {
|
||||
while(depTree.chunkCount > options.maxChunks) {
|
||||
if(!removeOneChunk(depTree, options, true))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
createRealChunkIds(depTree, options);
|
||||
options.events.emit("task-end", "optimize");
|
||||
|
||||
// cleanup temporary stuff
|
||||
delete depTree.chunkModules;
|
||||
depTree.modulesByFile = depTree.modules;
|
||||
depTree.modules = depTree.modulesById;
|
||||
delete depTree.modulesById;
|
||||
delete depTree.nextModuleId;
|
||||
delete depTree.nextChunkId;
|
||||
|
||||
// return
|
||||
options.events.emit("task-end", "cleanup");
|
||||
callback(null, depTree);
|
||||
}
|
||||
}
|
||||
|
||||
function addModule(depTree, context, modu, options, reason, finalCallback) {
|
||||
var profile = options.profile && {
|
||||
start: new Date()
|
||||
};
|
||||
|
||||
options.events.emit("task");
|
||||
function callback(err, result) {
|
||||
options.events.emit("task-end");
|
||||
if(profile && profile.module) {
|
||||
profile.end = new Date();
|
||||
if(profile.buildModule) {
|
||||
profile.module.profile = {
|
||||
time: profile.end - profile.start,
|
||||
timeResolve: profile.resolveEnd - profile.start,
|
||||
timeResolvePrePostLoaders: profile.resolvePrePostLoadersEnd - profile.resolveEnd,
|
||||
timeLoadersCheck: profile.loadersCheckEnd - profile.resolvePrePostLoadersEnd,
|
||||
timeBuildWaiting: (profile.buildModuleEnd - profile.loadersCheckEnd) - (profile.buildModule.end - profile.buildModule.start),
|
||||
timeBuildModule: profile.buildModule.end - profile.buildModule.start,
|
||||
timeBuildModuleRead: profile.buildModule.readEnd - profile.buildModule.start,
|
||||
timeBuildModulePreLoaders: profile.buildModule.preLoadersEnd - profile.buildModule.readEnd,
|
||||
timeBuildModuleLoaders: profile.buildModule.loadersEnd - profile.buildModule.preLoadersEnd,
|
||||
timeBuildModulePostLoaders: profile.buildModule.postLoadersEnd - profile.buildModule.loadersEnd,
|
||||
timeBuildModuleParse: profile.buildModule.end - profile.buildModule.postLoadersEnd,
|
||||
timeChildren: profile.end - profile.buildModuleEnd
|
||||
}
|
||||
}
|
||||
}
|
||||
finalCallback(err, result);
|
||||
}
|
||||
|
||||
// resolve the filename of the required module
|
||||
var resolveFunc = !options.workersNoResolve && options.workers && options.workers.ready() ?
|
||||
separateResolve :
|
||||
resolve;
|
||||
resolveFunc(context = context || path.dirname(modu), modu, options.resolve, resolved);
|
||||
function resolved(err, request) {
|
||||
if(err) {
|
||||
callback(err);
|
||||
return;
|
||||
}
|
||||
// check if the module is already included
|
||||
if(depTree.modules[request]) {
|
||||
depTree.modules[request].reasons.push(reason);
|
||||
callback(null, depTree.modules[request].id);
|
||||
} else {
|
||||
profile && (profile.resolveEnd = new Date());
|
||||
// create a new module
|
||||
var modu = depTree.modules[request] = {
|
||||
id: depTree.nextModuleId++,
|
||||
request: request,
|
||||
reasons: [reason]
|
||||
};
|
||||
depTree.modulesById[modu.id] = modu;
|
||||
|
||||
profile && (profile.module = modu);
|
||||
|
||||
var requestObj = resolve.parse(request);
|
||||
|
||||
if(options.cache) {
|
||||
options.cache.get(request, function(err, cachedData) {
|
||||
if(err) return readFile();
|
||||
if(profile) {
|
||||
profile.buildModuleEnd = profile.loadersCheckEnd = profile.resolvePrePostLoadersEnd = new Date()
|
||||
}
|
||||
modu.fromCache = true;
|
||||
cachedData = JSON.parse(cachedData);
|
||||
modu.dependencies = cachedData.dependencies;
|
||||
modu.loaders = cachedData.loaders;
|
||||
processParsedJs(cachedData.source, cachedData.deps);
|
||||
});
|
||||
} else
|
||||
readFile();
|
||||
|
||||
// Read the file and process it with loaders
|
||||
// [this step is cached]
|
||||
function readFile() {
|
||||
// match pre and post loaders from resource
|
||||
var preLoaders = options.preLoaders && requestObj.resource && requestObj.resource.path ? matchLoadersList(options.preLoaders) : "";
|
||||
var postLoaders = options.postLoaders && requestObj.resource && requestObj.resource.path ? matchLoadersList(options.postLoaders) : "";
|
||||
|
||||
// get the current function for loader resolving
|
||||
var resolveLoadersFunc = !options.workersNoResolve && options.workers && options.workers.ready() ?
|
||||
separateResolveLoaders :
|
||||
resolve.loaders;
|
||||
|
||||
// resolve preLoaders
|
||||
if(preLoaders) resolveLoadersFunc(context, preLoaders, options.resolve, onPreLoadersResolved);
|
||||
else onPreLoadersResolved(null, []);
|
||||
function onPreLoadersResolved(err, preLoaders) {
|
||||
if(err) return callback(err);
|
||||
|
||||
// resolve postLoaders
|
||||
if(postLoaders) resolveLoadersFunc(context, postLoaders, options.resolve, onPostLoadersResolved);
|
||||
else onPostLoadersResolved(null, []);
|
||||
function onPostLoadersResolved(err, postLoaders) {
|
||||
if(err) return callback(err);
|
||||
profile && (profile.resolvePrePostLoadersEnd = new Date());
|
||||
|
||||
// put all loaders in a list
|
||||
var allLoaders = [];
|
||||
if(preLoaders.length > 0)
|
||||
allLoaders.push.apply(allLoaders, preLoaders = preLoaders.map(resolve.parse.part));
|
||||
if(requestObj.loaders && requestObj.loaders.length > 0)
|
||||
allLoaders.push.apply(allLoaders, requestObj.loaders);
|
||||
if(postLoaders.length > 0)
|
||||
allLoaders.push.apply(allLoaders, postLoaders = postLoaders.map(resolve.parse.part));
|
||||
|
||||
// store the list in the module
|
||||
modu.loaders = allLoaders.map(function(l) { return l.path; });
|
||||
|
||||
// and put premature dependencies into module (in case of loader error)
|
||||
modu.dependencies = requestObj.resource &&
|
||||
requestObj.resource.path &&
|
||||
[requestObj.resource.path] ||
|
||||
[];
|
||||
|
||||
// check if it is possible to separate the process
|
||||
var separate = !!(options.workers &&
|
||||
options.workers.ready() &&
|
||||
allLoaders.length >= (options.workerMinLoaders || 0));
|
||||
try {
|
||||
for(var i = 0; i < allLoaders.length && separate; i++) {
|
||||
var loaderFilename = allLoaders[i].path;
|
||||
var loader = require(loaderFilename);
|
||||
if(!(loader.separable || loader.seperable) &&
|
||||
(!(loader.separableIfResolve || loader.seperableIfResolve) || options.workersNoResolve))
|
||||
separate = false;
|
||||
}
|
||||
} catch(e) {
|
||||
// Syntax error in loader
|
||||
return callback(e);
|
||||
}
|
||||
modu.separate = separate;
|
||||
|
||||
var buildModuleStart = new Date();
|
||||
profile && (profile.loadersCheckEnd = buildModuleStart);
|
||||
(separate ? separateBuildModule : buildModule)(
|
||||
context, request,
|
||||
preLoaders, requestObj.loaders || [], postLoaders,
|
||||
requestObj,
|
||||
options, function(err, extraResults, source, deps) {
|
||||
|
||||
var dependencyInfo = extraResults && extraResults.dependencyInfo;
|
||||
if(dependencyInfo) modu.dependencies = dependencyInfo.files; // It my be also supplied if err is set.
|
||||
if(extraResults && extraResults.warnings && extraResults.warnings.length > 0) {
|
||||
extraResults.warnings.forEach(function(w) {
|
||||
depTree.warnings.push(w + "\n @ loader @ " + request);
|
||||
});
|
||||
modu.warnings = extraResults.warnings;
|
||||
}
|
||||
if(extraResults && extraResults.errors && extraResults.errors.length > 0) {
|
||||
extraResults.errors.forEach(function(e) {
|
||||
depTree.errors.push(e + "\n @ loader @ " + request);
|
||||
});
|
||||
modu.errors = extraResults.errors;
|
||||
}
|
||||
if(err) {
|
||||
modu.error = err;
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if(profile) {
|
||||
profile.buildModule = extraResults.profile;
|
||||
profile.buildModuleEnd = new Date();
|
||||
}
|
||||
if(dependencyInfo.cacheable && options.cache) {
|
||||
modu.toCache = true;
|
||||
options.cache.store(request, dependencyInfo.files, buildModuleStart, JSON.stringify({
|
||||
deps: deps,
|
||||
source: source,
|
||||
dependencies: dependencyInfo.files,
|
||||
loaders: allLoaders.map(function(l) { return l.path; })
|
||||
}));
|
||||
}
|
||||
return processParsedJs(source, deps);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function matchLoadersList(list) {
|
||||
return list.filter(function(item) {
|
||||
return matchRegExpObject(item, requestObj.resource.path);
|
||||
}).map(function(item) {
|
||||
return item.loader || item.loaders.join("!");
|
||||
}).join("!");
|
||||
}
|
||||
|
||||
// process the final parsed javascript code
|
||||
function processParsedJs(source, deps) {
|
||||
modu.requires = deps.requires || [];
|
||||
modu.asyncs = deps.asyncs || [];
|
||||
modu.contexts = deps.contexts || [];
|
||||
modu.source = source;
|
||||
|
||||
var requires = {}, directRequire = {};
|
||||
var contexts = [], directContexts = {};
|
||||
function add(r) {
|
||||
if(!r.name) return;
|
||||
requires[r.name] = requires[r.name] || [];
|
||||
requires[r.name].push(r);
|
||||
}
|
||||
function addContext(m) {
|
||||
return function(c) {
|
||||
contexts.push({context: c, module: m});
|
||||
}
|
||||
}
|
||||
if(modu.requires) {
|
||||
modu.requires.forEach(add);
|
||||
modu.requires.forEach(function(r) {
|
||||
if(!r.name) return;
|
||||
directRequire[r.name] = true;
|
||||
});
|
||||
}
|
||||
if(modu.contexts) {
|
||||
modu.contexts.forEach(addContext(modu));
|
||||
modu.contexts.forEach(function(c) {
|
||||
directContexts[c.name] = true;
|
||||
});
|
||||
}
|
||||
if(modu.asyncs)
|
||||
modu.asyncs.forEach(function addAsync(c) {
|
||||
if(c.requires)
|
||||
c.requires.forEach(add);
|
||||
if(c.asyncs)
|
||||
c.asyncs.forEach(addAsync);
|
||||
if(c.contexts)
|
||||
c.contexts.forEach(addContext(c));
|
||||
});
|
||||
var requiresNames = Object.keys(requires);
|
||||
var count = requiresNames.length + contexts.length + 1;
|
||||
var errors = [];
|
||||
var requireContext = requestObj.resource &&
|
||||
requestObj.resource.path &&
|
||||
path.dirname(requestObj.resource.path) ||
|
||||
context;
|
||||
if(requiresNames.length)
|
||||
requiresNames.forEach(function(moduleName) {
|
||||
var reason = {
|
||||
type: "require",
|
||||
async: !directRequire[moduleName] || undefined,
|
||||
count: requires[moduleName].length,
|
||||
request: request,
|
||||
filename: requestObj.resource && requestObj.resource.path
|
||||
};
|
||||
|
||||
// create or get the module for each require
|
||||
addModule(depTree, requireContext, moduleName, options, reason, function(err, moduleId) {
|
||||
if(err) {
|
||||
var error = false;
|
||||
requires[moduleName].forEach(function(requireItem) {
|
||||
if(!requireItem.inTry)
|
||||
error = true;
|
||||
});
|
||||
(error ? depTree.errors : depTree.warnings).push("Cannot find module '" + moduleName + "'\n " + err +
|
||||
"\n @ " + request + " (line " + requires[moduleName][0].line + ", column " + requires[moduleName][0].column + ")");
|
||||
} else {
|
||||
requires[moduleName].forEach(function(requireItem) {
|
||||
requireItem.id = moduleId;
|
||||
});
|
||||
}
|
||||
endOne();
|
||||
});
|
||||
});
|
||||
if(contexts) {
|
||||
contexts.forEach(function(contextObj) {
|
||||
var context = contextObj.context;
|
||||
var module = contextObj.module;
|
||||
var reason = {
|
||||
type: "context",
|
||||
async: !directContexts[context.name] || undefined,
|
||||
request: request,
|
||||
filename: requestObj.resource && requestObj.resource.path
|
||||
};
|
||||
|
||||
// create of get the context module for each require.context
|
||||
addContextModule(depTree, requireContext, context.name, options, reason, function(err, contextModuleId) {
|
||||
if(err) {
|
||||
depTree.errors.push("Cannot find context '"+context.name+"'\n " + err +
|
||||
"\n @ " + request + " (line " + context.line + ", column " + context.column + ")");
|
||||
} else {
|
||||
context.id = contextModuleId;
|
||||
module.requires.push({id: context.id});
|
||||
}
|
||||
endOne();
|
||||
});
|
||||
if(context.warn) {
|
||||
depTree.warnings.push(request + " (line " + context.line + ", column " + context.column + "): " +
|
||||
"implicit use of require.context(\".\") is not recommended.");
|
||||
}
|
||||
});
|
||||
}
|
||||
endOne();
|
||||
function endOne() {
|
||||
count--;
|
||||
assert(count >= 0);
|
||||
if(count === 0) {
|
||||
if(errors.length) {
|
||||
callback(errors.join("\n"));
|
||||
} else {
|
||||
options.events.emit("module", modu, requestObj.resource && requestObj.resource.path);
|
||||
callback(null, modu.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function separateBuildModule(context, requestObj,
|
||||
preLoaders, loaders, postLoaders,
|
||||
filename, options, callback) {
|
||||
var opt = {};
|
||||
Object.keys(options).forEach(function(name) {
|
||||
if(name == "internal") return;
|
||||
if(name == "events") return;
|
||||
if(name == "workers") return;
|
||||
opt[name] = options[name];
|
||||
});
|
||||
options.workers.run("buildModule", context, requestObj,
|
||||
preLoaders, loaders, postLoaders,
|
||||
filename, opt, function(err, extraResults, source, deps) {
|
||||
if(err) err = {
|
||||
message: err.message,
|
||||
stack: err.stack,
|
||||
_toString: err._toString,
|
||||
toString: function() {
|
||||
return this._toString
|
||||
}
|
||||
}
|
||||
callback(err, extraResults, source, deps);
|
||||
});
|
||||
}
|
||||
|
||||
function separateResolve() {
|
||||
var args = Array.prototype.slice.call(arguments, 0);
|
||||
args.unshift("resolve");
|
||||
var callback = args.pop();
|
||||
args.push(function(err, filename) {
|
||||
if(err) err = {
|
||||
message: err.message,
|
||||
stack: err.stack,
|
||||
_toString: err._toString,
|
||||
toString: function() {
|
||||
return this._toString
|
||||
}
|
||||
}
|
||||
callback(err, filename);
|
||||
});
|
||||
options.workers.run.apply(options.workers, args);
|
||||
}
|
||||
|
||||
function separateResolveLoaders() {
|
||||
var args = Array.prototype.slice.call(arguments, 0);
|
||||
args.unshift("resolve.loaders");
|
||||
var callback = args.pop();
|
||||
args.push(function(err, loaders) {
|
||||
if(err) err = {
|
||||
message: err.message,
|
||||
stack: err.stack,
|
||||
_toString: err._toString,
|
||||
toString: function() {
|
||||
return this._toString
|
||||
}
|
||||
}
|
||||
callback(err, loaders);
|
||||
});
|
||||
options.workers.run.apply(options.workers, args);
|
||||
}
|
||||
}
|
||||
|
||||
function addContextModule(depTree, context, contextModuleName, options, reason, finalCallback) {
|
||||
options.events.emit("task");
|
||||
function callback(err, result) {
|
||||
options.events.emit("task-end");
|
||||
finalCallback(err, result);
|
||||
}
|
||||
|
||||
// resolve the filename of the required context
|
||||
resolve.context(context, contextModuleName, options.resolve, resolved);
|
||||
function resolved(err, dirname) {
|
||||
if(err) {
|
||||
callback(err);
|
||||
return;
|
||||
}
|
||||
// check if the context is already included
|
||||
if(depTree.modules[dirname]) {
|
||||
depTree.modules[dirname].reasons.push(reason);
|
||||
callback(null, depTree.modules[dirname].id);
|
||||
} else {
|
||||
// create a new context
|
||||
var contextModule = depTree.modules[dirname] = {
|
||||
name: contextModuleName,
|
||||
dirname: dirname,
|
||||
id: depTree.nextModuleId++,
|
||||
requireMap: {},
|
||||
requires: [],
|
||||
reasons: [reason]
|
||||
};
|
||||
depTree.modulesById[contextModule.id] = contextModule;
|
||||
|
||||
// split the loaders from the require
|
||||
var contextModuleNameWithLoaders = dirname;
|
||||
var loaders = dirname.split(/!/g);
|
||||
dirname = loaders.pop();
|
||||
options.events.emit("context-enum", contextModule, dirname);
|
||||
var prependLoaders = loaders.length === 0 ? "" : loaders.join("!") + "!";
|
||||
var extensions = (options.resolve && options.resolve.extensions) || [""];
|
||||
|
||||
// iterate all files in directory
|
||||
function doDir(dirname, moduleName, done) {
|
||||
fs.readdir(dirname, function(err, list) {
|
||||
if(err) {
|
||||
done(err);
|
||||
} else {
|
||||
var count = list.length + 1;
|
||||
var errors = [];
|
||||
function endOne(err) {
|
||||
if(err) {
|
||||
errors.push(err);
|
||||
}
|
||||
count--;
|
||||
assert(count >= 0);
|
||||
if(count == 0) {
|
||||
if(errors.length > 0)
|
||||
done(errors.join("\n"));
|
||||
else
|
||||
done();
|
||||
}
|
||||
}
|
||||
list.forEach(function(file) {
|
||||
var filename = path.join(dirname, file);
|
||||
fs.stat(filename, function(err, stat) {
|
||||
if(err) {
|
||||
errors.push(err);
|
||||
endOne();
|
||||
} else {
|
||||
if(stat.isDirectory()) {
|
||||
// modules directories are excluded
|
||||
if(options.resolve.modulesDirectories.indexOf(file) >= 0)
|
||||
endOne();
|
||||
else
|
||||
doDir(filename, moduleName + "/" + file, endOne);
|
||||
} else {
|
||||
var match = false;
|
||||
if(loaders.length === 0)
|
||||
extensions.forEach(function(ext) {
|
||||
if(file.substr(file.length - ext.length) === ext)
|
||||
match = true;
|
||||
});
|
||||
if(!match && loaders.length === 0) {
|
||||
endOne();
|
||||
return;
|
||||
}
|
||||
var modulereason = {
|
||||
type: "context",
|
||||
async: reason.async,
|
||||
dirname: contextModuleNameWithLoaders,
|
||||
filename: reason.filename
|
||||
};
|
||||
// add each file as module
|
||||
addModule(depTree, dirname, prependLoaders + filename, options, modulereason, function(err, moduleId) {
|
||||
if(err) {
|
||||
depTree.warnings.push("A file in context was excluded because of error: " + err);
|
||||
endOne();
|
||||
} else {
|
||||
contextModule.requires.push({id: moduleId});
|
||||
|
||||
// store the module id in a require map
|
||||
// when generating the source it is included
|
||||
contextModule.requireMap[moduleName + "/" + file] = moduleId;
|
||||
endOne();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
endOne();
|
||||
}
|
||||
});
|
||||
}
|
||||
doDir(dirname, ".", function(err) {
|
||||
if(err) {
|
||||
callback(err);
|
||||
return;
|
||||
}
|
||||
options.events.emit("context", contextModule, dirname);
|
||||
callback(null, contextModule.id);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rename the module ids after a defined sheme
|
||||
function createRealIds(depTree, options) {
|
||||
var sortedModules = [];
|
||||
for(var id in depTree.modulesById) {
|
||||
if(""+id === "0") continue;
|
||||
var modu = depTree.modulesById[id];
|
||||
var usages = 1;
|
||||
modu.reasons.forEach(function(reason) {
|
||||
usages += reason.count ? reason.count : 1;
|
||||
});
|
||||
modu.usages = usages;
|
||||
sortedModules.push(modu);
|
||||
}
|
||||
depTree.modulesById[0].realId = 0;
|
||||
sortedModules.sort(function(a, b) {
|
||||
if(a.chunks && b.chunks &&
|
||||
(a.chunks.indexOf("main") !== -1 || b.chunks.indexOf("main") !== -1)) {
|
||||
if(a.chunks.indexOf("main") === -1)
|
||||
return 1;
|
||||
if(b.chunks.indexOf("main") === -1)
|
||||
return -1;
|
||||
}
|
||||
var diff = b.usages - a.usages;
|
||||
if(diff !== 0) return diff;
|
||||
if(typeof a.request === "string" || typeof b.request === "string") {
|
||||
if(typeof a.request !== "string")
|
||||
return -1;
|
||||
if(typeof b.request !== "string")
|
||||
return 1;
|
||||
if(a.request === b.request)
|
||||
return 0;
|
||||
return (a.request < b.request) ? -1 : 1;
|
||||
}
|
||||
if(a.dirname === b.dirname)
|
||||
return 0;
|
||||
return (a.dirname < b.dirname) ? -1 : 1;
|
||||
});
|
||||
sortedModules.forEach(function(modu, idx) {
|
||||
modu.realId = idx + 1;
|
||||
});
|
||||
}
|
||||
|
||||
// add a chunk
|
||||
function addChunk(depTree, chunkStartpoint, options) {
|
||||
var chunk;
|
||||
if(chunkStartpoint && chunkStartpoint.name) {
|
||||
chunk = depTree.chunks[chunkStartpoint.name];
|
||||
if(chunk) {
|
||||
chunk.usages++;
|
||||
chunk.contexts.push(chunkStartpoint);
|
||||
}
|
||||
}
|
||||
if(!chunk) {
|
||||
chunk = {
|
||||
id: (chunkStartpoint && chunkStartpoint.name) || depTree.nextChunkId++,
|
||||
modules: {},
|
||||
contexts: chunkStartpoint ? [chunkStartpoint] : [],
|
||||
usages: 1
|
||||
};
|
||||
depTree.chunks[chunk.id] = chunk;
|
||||
depTree.chunkCount++;
|
||||
}
|
||||
if(chunkStartpoint) {
|
||||
chunkStartpoint.chunkId = chunk.id;
|
||||
addModuleToChunk(depTree, chunkStartpoint, chunk.id, options);
|
||||
}
|
||||
return chunk;
|
||||
}
|
||||
|
||||
function addModuleToChunk(depTree, context, chunkId, options) {
|
||||
context.chunks = context.chunks || [];
|
||||
if(context.chunks.indexOf(chunkId) === -1) {
|
||||
context.chunks.push(chunkId);
|
||||
if(context.id !== undefined)
|
||||
depTree.chunks[chunkId].modules[context.id] = "include";
|
||||
if(context.requires) {
|
||||
context.requires.forEach(function(requireItem) {
|
||||
if(requireItem.id)
|
||||
addModuleToChunk(depTree, depTree.modulesById[requireItem.id], chunkId, options);
|
||||
});
|
||||
}
|
||||
if(context.asyncs) {
|
||||
context.asyncs.forEach(function(context) {
|
||||
if(options.single) {
|
||||
addModuleToChunk(depTree, context, chunkId, options);
|
||||
} else {
|
||||
var subChunk;
|
||||
if(context.chunkId) {
|
||||
subChunk = depTree.chunks[context.chunkId];
|
||||
subChunk.usages++;
|
||||
} else {
|
||||
subChunk = addChunk(depTree, context, options);
|
||||
}
|
||||
subChunk.parents = subChunk.parents || [];
|
||||
subChunk.parents.push(chunkId);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function removeParentsModules(depTree, chunk) {
|
||||
if(!chunk.parents) return;
|
||||
for(var moduleId in chunk.modules) {
|
||||
var inParent = true;
|
||||
var checkedParents = {};
|
||||
chunk.parents.forEach(function checkParent(parentId) {
|
||||
if(!inParent) return;
|
||||
if(checkedParents[parentId]) return;
|
||||
checkedParents[parentId] = true;
|
||||
if(!depTree.chunks[parentId].modules[moduleId]) {
|
||||
var parents = depTree.chunks[parentId].parents;
|
||||
if(parents && parents.length > 0)
|
||||
parents.forEach(checkParent);
|
||||
else
|
||||
inParent = false;
|
||||
}
|
||||
});
|
||||
if(inParent) {
|
||||
chunk.modules[moduleId] = "in-parent";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function checkObsolete(depTree, chunk) {
|
||||
var modules = [];
|
||||
for(var moduleId in chunk.modules) {
|
||||
if(chunk.modules[moduleId] === "include") {
|
||||
modules.push(moduleId);
|
||||
}
|
||||
}
|
||||
if(modules.length === 0) {
|
||||
chunk.contexts.forEach(function(c) { c.chunkId = null; });
|
||||
chunk.empty = true;
|
||||
depTree.chunkCount--;
|
||||
return;
|
||||
}
|
||||
modules.sort();
|
||||
var moduleString = modules.join(" ");
|
||||
if(depTree.chunkModules[moduleString]) {
|
||||
chunk.equals = depTree.chunkModules[moduleString];
|
||||
chunk.contexts.forEach(function(c) {
|
||||
c.chunkId = chunk.equals;
|
||||
});
|
||||
depTree.chunkCount--;
|
||||
} else
|
||||
depTree.chunkModules[moduleString] = chunk.id;
|
||||
}
|
||||
|
||||
function moduleSize(depTree, moduleId) {
|
||||
return depTree.modulesById[moduleId].source && depTree.modulesById[moduleId].source.length || 0;
|
||||
}
|
||||
|
||||
function removeOneChunk(depTree, options, force) {
|
||||
var chunks = [];
|
||||
for(var chunkId in depTree.chunks) {
|
||||
var chunk = depTree.chunks[chunkId];
|
||||
if(!chunk.empty && !chunk.equals && chunk.id != "main") {
|
||||
chunks.push(chunk);
|
||||
}
|
||||
}
|
||||
var best = null;
|
||||
chunks.forEach(function(chunkA, idxA) {
|
||||
chunks.forEach(function(chunkB, idxB) {
|
||||
if(idxB <= idxA) return;
|
||||
var sizeSum = 60, sizeMerged = 30;
|
||||
for(var moduleId in chunkA.modules) {
|
||||
if(chunkA.modules[moduleId] === "include") {
|
||||
var size = moduleSize(depTree, moduleId);
|
||||
sizeSum += size + 10;
|
||||
sizeMerged += size + 10;
|
||||
}
|
||||
}
|
||||
for(var moduleId in chunkB.modules) {
|
||||
if(chunkB.modules[moduleId] === "include") {
|
||||
var size = moduleSize(depTree, moduleId);
|
||||
sizeSum += size + 10;
|
||||
if(chunkA.modules[moduleId] !== "include")
|
||||
sizeMerged += size + 10;
|
||||
}
|
||||
}
|
||||
var value = sizeSum - sizeMerged * (options.mergeSizeRatio === undefined ? 1.2 : options.mergeSizeRatio + 1);
|
||||
if(best == null || best[0] < value)
|
||||
best = [value, chunkA.id, chunkB.id];
|
||||
});
|
||||
});
|
||||
if(!best) return false;
|
||||
if(force || best[0] > 0) {
|
||||
var chunk = depTree.chunks[best[1]];
|
||||
chunk.equals = best[2];
|
||||
chunk.contexts.forEach(function(c) {
|
||||
c.chunkId = chunk.equals;
|
||||
});
|
||||
chunks.forEach(function(chunk) {
|
||||
if(chunk.equals == best[1]) {
|
||||
chunk.equals = best[2];
|
||||
chunk.contexts.forEach(function(c) {
|
||||
c.chunkId = chunk.equals;
|
||||
});
|
||||
}
|
||||
});
|
||||
var otherChunk = depTree.chunks[best[2]];
|
||||
for(var moduleId in chunk.modules) {
|
||||
if(chunk.modules[moduleId] === "include") {
|
||||
otherChunk.modules[moduleId] = "include";
|
||||
}
|
||||
}
|
||||
depTree.chunkCount--;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// rename the chunk ids after a defined sheme
|
||||
function createRealChunkIds(depTree, options) {
|
||||
var sortedChunks = [];
|
||||
for(var id in depTree.chunks) {
|
||||
if(id === "main") continue;
|
||||
var chunk = depTree.chunks[id];
|
||||
if(chunk.empty) continue;
|
||||
if(chunk.equals !== undefined) continue;
|
||||
sortedChunks.push(chunk);
|
||||
}
|
||||
depTree.chunks["main"].realId = 0;
|
||||
sortedChunks.sort(function(a, b) {
|
||||
if(a.usages < b.usages)
|
||||
return -1;
|
||||
if(a.usages > b.usages)
|
||||
return 1;
|
||||
var aCount = Object.keys(a.modules).length;
|
||||
var bCount = Object.keys(b.modules).length;
|
||||
if(aCount != bCount)
|
||||
return aCount - bCount;
|
||||
function genModulesString(modules) {
|
||||
var moduleIds = [];
|
||||
for(var id in modules) {
|
||||
if(modules[id] === "include") {
|
||||
var m = depTree.modulesById[id];
|
||||
moduleIds.push(m.realId);
|
||||
}
|
||||
}
|
||||
return moduleIds.sort().join("-");
|
||||
}
|
||||
var aModules = genModulesString(a.modules);
|
||||
var bModules = genModulesString(b.modules);
|
||||
if(aModules == bModules)
|
||||
return 0;
|
||||
return aModules < bModules ? -1 : 1;
|
||||
});
|
||||
sortedChunks.forEach(function(chunk, idx) {
|
||||
chunk.realId = idx + 1;
|
||||
});
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var fs = require("fs");
|
||||
var parse = require("./parse");
|
||||
var resolve = require("enhanced-resolve");
|
||||
var execLoaders = require("enhanced-require/lib/execLoaders");
|
||||
|
||||
function buildModule(context, request,
|
||||
preLoaders, loaders, postLoaders,
|
||||
requestObj,
|
||||
options, callback) {
|
||||
|
||||
if(options.profile) var profile = {
|
||||
start: new Date().getTime()
|
||||
}
|
||||
|
||||
var files = requestObj.resource && requestObj.resource.path && [requestObj.resource.path] || []
|
||||
var dependencyInfo = {
|
||||
cacheable: true,
|
||||
files: files.slice(0)
|
||||
};
|
||||
|
||||
var extraResults = {
|
||||
dependencyInfo: dependencyInfo,
|
||||
profile: profile,
|
||||
warnings: [],
|
||||
errors: []
|
||||
}
|
||||
|
||||
if(requestObj.resource && requestObj.resource.path)
|
||||
fs.readFile(requestObj.resource.path, onFileRead);
|
||||
else
|
||||
onFileRead(null, null);
|
||||
|
||||
function onFileRead(err, content) {
|
||||
if(err) return callback(err, extraResults);
|
||||
|
||||
profile && (profile.readEnd = new Date().getTime());
|
||||
|
||||
var loaderContext = {
|
||||
loaders: loaders.map(resolve.stringify.part),
|
||||
preLoaders: preLoaders.map(resolve.stringify.part),
|
||||
postLoaders: postLoaders.map(resolve.stringify.part),
|
||||
loaderType: null,
|
||||
web: true,
|
||||
emitWarning: function(warning) {
|
||||
extraResults.warnings.push(warning);
|
||||
},
|
||||
emitError: function(error) {
|
||||
extraResults.errors.push(error);
|
||||
}
|
||||
};
|
||||
if(requestObj.resource)
|
||||
loaderContext.resourceQuery = requestObj.resource.query;
|
||||
|
||||
loaderContext.loaderType = "preLoader";
|
||||
execLoaders(context, request, preLoaders, files, [content], loaderContext, dependencyInfo, options,
|
||||
function(err, result) {
|
||||
if(err) return callback(err, extraResults);
|
||||
profile && (profile.preLoadersEnd = new Date().getTime());
|
||||
loaderContext.loaderType = "loader";
|
||||
execLoaders(context, request, loaders, files, result, loaderContext, dependencyInfo, options,
|
||||
function(err, result) {
|
||||
if(err) return callback(err, extraResults);
|
||||
profile && (profile.loadersEnd = new Date().getTime());
|
||||
loaderContext.loaderType = "postLoader";
|
||||
execLoaders(context, request, postLoaders, files, result, loaderContext, dependencyInfo, options,
|
||||
function(err, result) {
|
||||
if(err) return callback(err, extraResults);
|
||||
profile && (profile.postLoadersEnd = new Date().getTime());
|
||||
return processJs(result)
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// process the result delivered from loaders or direct from file
|
||||
// for inclusion into the result
|
||||
// (static code analysis for requires and other stuff)
|
||||
// [this step is cached]
|
||||
function processJs(resultBuffers) {
|
||||
var source = resultBuffers[0].toString("utf-8");
|
||||
var deps;
|
||||
try {
|
||||
deps = parse(source, options.parse);
|
||||
} catch(e) {
|
||||
callback(new Error("File \"" + request + "\" parsing failed: " + e), extraResults);
|
||||
return;
|
||||
}
|
||||
profile && (profile.end = new Date().getTime());
|
||||
return callback(null, extraResults, source, deps);
|
||||
}
|
||||
}
|
||||
module.exports = buildModule;
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var path = require("path");
|
||||
|
||||
module.exports = function(cwd) {
|
||||
var cwd = cwd;
|
||||
var cwdParent = path.dirname(cwd);
|
||||
var buildins = path.join(__dirname, "..");
|
||||
cwd = cwd.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||
cwd = new RegExp("^" + cwd + "|(!)" + cwd, "g");
|
||||
var buildinsAsModule = cwd.test(buildins);
|
||||
cwdParent = cwdParent.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||
cwdParent = new RegExp("^" + cwdParent + "|(!)" + cwdParent, "g");
|
||||
buildins = buildins.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
||||
buildins = new RegExp("^" + buildins + "|(!)" + buildins, "g");
|
||||
var node_modulesRegExpA = /\/node_modules\//g;
|
||||
var node_modulesRegExpB = /\\node_modules\\/g;
|
||||
var index_jsRegExp = /[\\\/]index.js!/g;
|
||||
function compressFilename(filename) {
|
||||
if(!filename)
|
||||
return filename;
|
||||
if(buildinsAsModule)
|
||||
filename = filename.replace(buildins, "!(webpack)");
|
||||
filename = filename.replace(cwd, "!.");
|
||||
if(!buildinsAsModule)
|
||||
filename = filename.replace(buildins, "!(webpack)");
|
||||
filename = filename.replace(node_modulesRegExpA, "/~/");
|
||||
filename = filename.replace(node_modulesRegExpB, "\\~\\");
|
||||
filename = filename.replace(index_jsRegExp, "!");
|
||||
return filename.replace(/^!|!$/, "");
|
||||
}
|
||||
return compressFilename;
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var NullDependency = require("./NullDependency");
|
||||
|
||||
function AMDDefineDependency(range, arrayRange, functionRange) {
|
||||
NullDependency.call(this);
|
||||
this.Class = AMDDefineDependency;
|
||||
this.range = range;
|
||||
this.arrayRange = arrayRange;
|
||||
this.functionRange = functionRange;
|
||||
}
|
||||
module.exports = AMDDefineDependency;
|
||||
|
||||
AMDDefineDependency.prototype = Object.create(NullDependency.prototype);
|
||||
AMDDefineDependency.prototype.type = "amd define";
|
||||
|
||||
AMDDefineDependency.Template = function AMDRequireDependencyTemplate() {};
|
||||
|
||||
AMDDefineDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
|
||||
if(dep.arrayRange && !dep.functionRange) {
|
||||
source.replace(dep.range[0], dep.arrayRange[0]-1,
|
||||
"module.exports = ");
|
||||
source.replace(dep.arrayRange[1], dep.range[1]-1, ";");
|
||||
} else if(!dep.arrayRange && dep.functionRange) {
|
||||
source.replace(dep.range[0], dep.functionRange[0]-1,
|
||||
"{var __WEBPACK_AMD_DEFINE_RESULT__ = (");
|
||||
source.replace(dep.functionRange[1], dep.range[1]-1, "(require, exports, module)); if(__WEBPACK_AMD_DEFINE_RESULT__ !== undefined) module.exports = __WEBPACK_AMD_DEFINE_RESULT__;}");
|
||||
} else if(dep.arrayRange && dep.functionRange) {
|
||||
source.replace(dep.range[0], dep.arrayRange[0]-1,
|
||||
"{var __WEBPACK_AMD_DEFINE_ARRAY__ = ");
|
||||
source.replace(dep.arrayRange[1], dep.functionRange[0]-1, "; var __WEBPACK_AMD_DEFINE_RESULT__ = (");
|
||||
source.replace(dep.functionRange[1], dep.range[1]-1, ".apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)); if(__WEBPACK_AMD_DEFINE_RESULT__ !== undefined) module.exports = __WEBPACK_AMD_DEFINE_RESULT__;}");
|
||||
}
|
||||
};
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var AbstractPlugin = require("../AbstractPlugin");
|
||||
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
|
||||
var ConstDependency = require("./ConstDependency");
|
||||
var AMDDefineDependency = require("./AMDDefineDependency");
|
||||
|
||||
module.exports = AbstractPlugin.create({
|
||||
"call define": function(expr) {
|
||||
var array, fn;
|
||||
switch(expr.arguments.length) {
|
||||
case 1:
|
||||
if(expr.arguments[0].type == "FunctionExpression") {
|
||||
fn = expr.arguments[0];
|
||||
} else {
|
||||
var dep = new AMDDefineDependency(expr.range, expr.arguments[0].range);
|
||||
dep.loc = expr.loc;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(expr.arguments[0].type == "ArrayExpression" && expr.arguments[1].type == "FunctionExpression") {
|
||||
array = expr.arguments[0];
|
||||
fn = expr.arguments[1];
|
||||
} else if(expr.arguments[0].type == "Literal" && expr.arguments[1].type == "FunctionExpression") {
|
||||
fn = expr.arguments[1];
|
||||
} else if(expr.arguments[0].type == "Literal" && expr.arguments[1].type == "ArrayExpression") {
|
||||
array = expr.arguments[1];
|
||||
} else if(expr.arguments[0].type == "Literal") {
|
||||
var dep = new AMDDefineDependency(expr.range, expr.arguments[1].range);
|
||||
dep.loc = expr.loc;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(expr.arguments[0].type == "Literal" &&
|
||||
expr.arguments[1].type == "ArrayExpression" &&
|
||||
expr.arguments[2].type == "FunctionExpression") {
|
||||
array = expr.arguments[1];
|
||||
fn = expr.arguments[2];
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(!array && !fn) return;
|
||||
if(array) {
|
||||
var param = this.evaluateExpression(array);
|
||||
param.items.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
|
||||
if(result === undefined) {
|
||||
// TODO: context
|
||||
}
|
||||
}, this);
|
||||
}
|
||||
if(fn) {
|
||||
var inTry = this.scope.inTry;
|
||||
this.inScope(fn.params.filter(function(i) {
|
||||
return ["require", "module", "exports"].indexOf(i.name) < 0;
|
||||
}), function() {
|
||||
this.scope.inTry = inTry;
|
||||
if(fn.body.type === "BlockStatement")
|
||||
this.walkStatement(fn.body);
|
||||
else
|
||||
this.walkExpression(fn.body);
|
||||
}.bind(this));
|
||||
}
|
||||
var dep = new AMDDefineDependency(expr.range, array ? array.range : null, fn ? fn.range : null);
|
||||
dep.loc = expr.loc;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
},
|
||||
"call define:amd:item": function(expr, param) {
|
||||
if(param.isConditional()) {
|
||||
param.options.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
|
||||
if(result === undefined) {
|
||||
// TODO: context
|
||||
}
|
||||
}, this);
|
||||
return true;
|
||||
} else if(param.isString()) {
|
||||
var dep;
|
||||
if(["require","exports","module"].indexOf(param.string) >= 0) {
|
||||
dep = new ConstDependency(param.string, param.range);
|
||||
} else {
|
||||
dep = new AMDRequireItemDependency(param.string, param.range);
|
||||
}
|
||||
dep.loc = expr.loc;
|
||||
dep.optional = !!this.scope.inTry;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var path = require("path");
|
||||
var AMDRequireDependency = require("./AMDRequireDependency");
|
||||
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
|
||||
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
|
||||
var AMDDefineDependency = require("./AMDDefineDependency");
|
||||
var ConstDependency = require("./ConstDependency");
|
||||
|
||||
var NullFactory = require("../NullFactory");
|
||||
|
||||
var AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
|
||||
var AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
|
||||
|
||||
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
|
||||
|
||||
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
|
||||
|
||||
function AMDPlugin(options) {
|
||||
this.options = options;
|
||||
}
|
||||
module.exports = AMDPlugin;
|
||||
|
||||
AMDPlugin.prototype.apply = function(compiler) {
|
||||
var options = this.options;
|
||||
compiler.plugin("compilation", function(compilation, params) {
|
||||
var normalModuleFactory = params.normalModuleFactory;
|
||||
var contextModuleFactory = params.contextModuleFactory;
|
||||
|
||||
compilation.dependencyFactories.set(AMDRequireDependency, new NullFactory());
|
||||
compilation.dependencyTemplates.set(AMDRequireDependency, new AMDRequireDependency.Template());
|
||||
|
||||
compilation.dependencyFactories.set(AMDRequireItemDependency, normalModuleFactory);
|
||||
compilation.dependencyTemplates.set(AMDRequireItemDependency, new AMDRequireItemDependency.Template());
|
||||
|
||||
compilation.dependencyFactories.set(AMDRequireContextDependency, contextModuleFactory);
|
||||
compilation.dependencyTemplates.set(AMDRequireContextDependency, new AMDRequireContextDependency.Template());
|
||||
|
||||
compilation.dependencyFactories.set(AMDDefineDependency, new NullFactory());
|
||||
compilation.dependencyTemplates.set(AMDDefineDependency, new AMDDefineDependency.Template());
|
||||
});
|
||||
new AMDRequireDependenciesBlockParserPlugin().apply(compiler.parser);
|
||||
new AMDDefineDependencyParserPlugin().apply(compiler.parser);
|
||||
compiler.parser.plugin("expression require.amd", function(expr) {
|
||||
var dep = new AMDRequireItemDependency("!!webpack amd options", expr.range);
|
||||
dep.userRequest = "require.amd";
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
});
|
||||
compiler.parser.plugin("expression define.amd", function(expr) {
|
||||
var dep = new AMDRequireItemDependency("!!webpack amd options", expr.range);
|
||||
dep.userRequest = "define.amd";
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
});
|
||||
compiler.parser.plugin("expression define", function(expr) {
|
||||
var dep = new AMDRequireItemDependency("!!webpack amd define", expr.range);
|
||||
dep.userRequest = "define";
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
});
|
||||
compiler.parser.plugin("expression __webpack_amd_options__", function(expr) {
|
||||
return this.state.current.addVariable("__webpack_amd_options__", JSON.stringify(options));
|
||||
});
|
||||
compiler.parser.plugin("evaluate typeof define", function(expr) {
|
||||
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
|
||||
});
|
||||
compiler.parser.plugin("typeof define", function(expr) {
|
||||
var dep = new ConstDependency("'function'", expr.range);
|
||||
dep.loc = expr.loc;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
});
|
||||
compiler.parser.plugin("evaluate typeof require", function(expr) {
|
||||
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
|
||||
});
|
||||
compiler.parser.plugin("typeof require", function(expr) {
|
||||
var dep = new ConstDependency("'function'", expr.range);
|
||||
dep.loc = expr.loc;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
});
|
||||
compiler.resolvers.normal.apply(
|
||||
new ModuleAliasPlugin({
|
||||
"amdefine": path.join(__dirname, "..", "..", "buildin", "amd-define.js"),
|
||||
"webpack amd options": path.join(__dirname, "..", "..", "buildin", "amd-options.js"),
|
||||
"webpack amd define": path.join(__dirname, "..", "..", "buildin", "amd-define.js"),
|
||||
// "webpack amd require": path.join(__dirname, "..", "..", "buildin", "amd-require.js")
|
||||
})
|
||||
);
|
||||
};
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ContextDependency = require("./ContextDependency");
|
||||
|
||||
function AMDRequireContextDependency(request, recursive, regExp, range, valueRange) {
|
||||
ContextDependency.call(this, request, recursive, regExp);
|
||||
this.range = range;
|
||||
this.valueRange = valueRange;
|
||||
this.Class = AMDRequireContextDependency;
|
||||
}
|
||||
module.exports = AMDRequireContextDependency;
|
||||
|
||||
AMDRequireContextDependency.prototype = Object.create(ContextDependency.prototype);
|
||||
AMDRequireContextDependency.prototype.type = "amd require context";
|
||||
|
||||
AMDRequireContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
|
||||
var AMDRequireDependency = require("./AMDRequireDependency");
|
||||
|
||||
function AMDRequireDependenciesBlock(expr, arrayRange, functionRange) {
|
||||
AsyncDependenciesBlock.call(this, null);
|
||||
this.expr = expr;
|
||||
this.range = expr.range;
|
||||
this.arrayRange = arrayRange;
|
||||
this.functionRange = functionRange;
|
||||
this.addDependency(new AMDRequireDependency(this));
|
||||
}
|
||||
module.exports = AMDRequireDependenciesBlock;
|
||||
|
||||
AMDRequireDependenciesBlock.prototype = Object.create(AsyncDependenciesBlock.prototype);
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var AbstractPlugin = require("../AbstractPlugin");
|
||||
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
|
||||
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
|
||||
var AMDRequireDependenciesBlock = require("./AMDRequireDependenciesBlock");
|
||||
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
|
||||
|
||||
module.exports = AbstractPlugin.create({
|
||||
"call require": function(expr) {
|
||||
switch(expr.arguments.length) {
|
||||
case 1:
|
||||
if(expr.arguments[0].type == "FunctionExpression") {
|
||||
var dep = new AMDRequireDependenciesBlock(expr, param.range, null, expr.arguments[0].range);
|
||||
dep.loc = expr.loc;
|
||||
var old = this.state.current;
|
||||
this.state.current = dep;
|
||||
this.inScope([], function() {
|
||||
param.items.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
|
||||
if(result === undefined) {
|
||||
this.applyPluginsBailResult("call require:amd:context", expr, param);
|
||||
}
|
||||
}, this);
|
||||
}.bind(this));
|
||||
this.inScope(expr.arguments[0].params.filter(function(i) {
|
||||
return ["require", "module", "exports"].indexOf(i.name) < 0;
|
||||
}), function() {
|
||||
if(expr.arguments[0].body.type === "BlockStatement")
|
||||
this.walkStatement(expr.arguments[0].body);
|
||||
else
|
||||
this.walkExpression(expr.arguments[0].body);
|
||||
}.bind(this));
|
||||
this.state.current = old;
|
||||
this.state.current.addBlock(dep);
|
||||
return true;
|
||||
}
|
||||
var param = this.evaluateExpression(expr.arguments[0]);
|
||||
if(param.isArray()) {
|
||||
var dep = new AMDRequireDependenciesBlock(expr, param.range);
|
||||
dep.loc = expr.loc;
|
||||
var old = this.state.current;
|
||||
this.state.current = dep;
|
||||
this.inScope([], function() {
|
||||
param.items.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
|
||||
if(result === undefined) {
|
||||
this.applyPluginsBailResult("call require:amd:context", expr, param);
|
||||
}
|
||||
}, this);
|
||||
}.bind(this));
|
||||
this.state.current = old;
|
||||
this.state.current.addBlock(dep);
|
||||
return true;
|
||||
}
|
||||
return;
|
||||
case 2:
|
||||
var param = this.evaluateExpression(expr.arguments[0]);
|
||||
if(!param.isArray()) return;
|
||||
if(expr.arguments[1].type !== "FunctionExpression") return;
|
||||
var dep = new AMDRequireDependenciesBlock(expr, param.range, expr.arguments[1].range);
|
||||
dep.loc = expr.loc;
|
||||
var old = this.state.current;
|
||||
this.state.current = dep;
|
||||
try {
|
||||
this.inScope([], function() {
|
||||
param.items.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
|
||||
if(result === undefined) {
|
||||
this.applyPluginsBailResult("call require:amd:context", expr, param);
|
||||
}
|
||||
}, this);
|
||||
}.bind(this));
|
||||
this.inScope(expr.arguments[1].params.filter(function(i) {
|
||||
return ["require", "module", "exports"].indexOf(i.name) < 0;
|
||||
}), function() {
|
||||
if(expr.arguments[1].body.type === "BlockStatement")
|
||||
this.walkStatement(expr.arguments[1].body);
|
||||
else
|
||||
this.walkExpression(expr.arguments[1].body);
|
||||
}.bind(this));
|
||||
} finally {
|
||||
this.state.current = old;
|
||||
this.state.current.addBlock(dep);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
},
|
||||
"call require:amd:item": function(expr, param) {
|
||||
if(param.isConditional()) {
|
||||
param.options.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
|
||||
if(result === undefined) {
|
||||
// TODO: context
|
||||
}
|
||||
}, this);
|
||||
return true;
|
||||
} else if(param.isString()) {
|
||||
var dep;
|
||||
if(["require","exports","module"].indexOf(param.string) >= 0) {
|
||||
dep = new ConstDependency(param.string, param.range);
|
||||
} else {
|
||||
dep = new AMDRequireItemDependency(param.string, param.range);
|
||||
}
|
||||
dep.loc = expr.loc;
|
||||
dep.optional = !!this.scope.inTry;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
}
|
||||
},
|
||||
"call require:amd:context": function(expr, param) {
|
||||
var dep = ContextDependencyHelpers.create(AMDRequireContextDependency, param.range, param);
|
||||
if(!dep) return;
|
||||
dep.loc = expr.loc;
|
||||
dep.optional = !!this.scope.inTry;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var NullDependency = require("./NullDependency");
|
||||
|
||||
function AMDRequireDependency(block) {
|
||||
NullDependency.call(this);
|
||||
this.Class = AMDRequireDependency;
|
||||
this.block = block;
|
||||
}
|
||||
module.exports = AMDRequireDependency;
|
||||
|
||||
AMDRequireDependency.prototype = Object.create(NullDependency.prototype);
|
||||
|
||||
AMDRequireDependency.Template = function AMDRequireDependencyTemplate() {};
|
||||
|
||||
AMDRequireDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
|
||||
var depBlock = dep.block;
|
||||
if(depBlock.arrayRange && !depBlock.functionRange) {
|
||||
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
|
||||
"require.e/* require */(" + (depBlock.chunk && depBlock.chunk.id || 0) + asComment(depBlock.chunkReason) + ", function(require) {");
|
||||
source.replace(depBlock.arrayRange[1], depBlock.range[1]-1, ";})");
|
||||
} else if(!depBlock.arrayRange && depBlock.functionRange) {
|
||||
source.replace(depBlock.range[0], depBlock.functionRange[0]-1,
|
||||
"require.e/* require */(" + (depBlock.chunk && depBlock.chunk.id || 0) + asComment(depBlock.chunkReason) + ", function(require) {(");
|
||||
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, "(require, exports, module));})");
|
||||
} else if(depBlock.arrayRange && depBlock.functionRange) {
|
||||
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
|
||||
"require.e/* require */(" + (depBlock.chunk && depBlock.chunk.id || 0) + asComment(depBlock.chunkReason) + ", function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
|
||||
source.replace(depBlock.arrayRange[1], depBlock.functionRange[0]-1, "; (");
|
||||
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, ".apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));})");
|
||||
}
|
||||
}
|
||||
|
||||
function asComment(str) {
|
||||
if(!str) return "";
|
||||
return "/* " + str + " */";
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ModuleDependency = require("./ModuleDependency");
|
||||
|
||||
function AMDRequireItemDependency(request, range) {
|
||||
ModuleDependency.call(this, request);
|
||||
this.Class = AMDRequireItemDependency;
|
||||
this.range = range;
|
||||
}
|
||||
module.exports = AMDRequireItemDependency;
|
||||
|
||||
AMDRequireItemDependency.prototype = Object.create(ModuleDependency.prototype);
|
||||
AMDRequireItemDependency.prototype.type = "amd require";
|
||||
|
||||
AMDRequireItemDependency.Template = require("./ModuleDependencyTemplateAsRequireId");
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
|
||||
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
|
||||
var RequireResolveDependency = require("./RequireResolveDependency");
|
||||
var RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
|
||||
|
||||
var NullFactory = require("../NullFactory");
|
||||
|
||||
var RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
|
||||
var CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
|
||||
|
||||
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
|
||||
|
||||
function CommonJsPlugin() {
|
||||
}
|
||||
module.exports = CommonJsPlugin;
|
||||
|
||||
CommonJsPlugin.prototype.apply = function(compiler) {
|
||||
compiler.plugin("compilation", function(compilation, params) {
|
||||
var normalModuleFactory = params.normalModuleFactory;
|
||||
var contextModuleFactory = params.contextModuleFactory;
|
||||
|
||||
compilation.dependencyFactories.set(CommonJsRequireDependency, normalModuleFactory);
|
||||
compilation.dependencyTemplates.set(CommonJsRequireDependency, new CommonJsRequireDependency.Template());
|
||||
|
||||
compilation.dependencyFactories.set(CommonJsRequireContextDependency, contextModuleFactory);
|
||||
compilation.dependencyTemplates.set(CommonJsRequireContextDependency, new CommonJsRequireContextDependency.Template());
|
||||
|
||||
compilation.dependencyFactories.set(RequireResolveDependency, normalModuleFactory);
|
||||
compilation.dependencyTemplates.set(RequireResolveDependency, new RequireResolveDependency.Template());
|
||||
|
||||
compilation.dependencyFactories.set(RequireResolveHeaderDependency, new NullFactory());
|
||||
compilation.dependencyTemplates.set(RequireResolveHeaderDependency, new RequireResolveHeaderDependency.Template());
|
||||
});
|
||||
compiler.parser.plugin("evaluate typeof require", function(expr) {
|
||||
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
|
||||
});
|
||||
compiler.parser.apply(
|
||||
new CommonJsRequireDependencyParserPlugin(),
|
||||
new RequireResolveDependencyParserPlugin()
|
||||
);
|
||||
};
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ContextDependency = require("./ContextDependency");
|
||||
|
||||
function CommonJsRequireContextDependency(request, recursive, regExp, range, valueRange) {
|
||||
ContextDependency.call(this, request, recursive, regExp);
|
||||
this.range = range;
|
||||
this.valueRange = valueRange;
|
||||
this.Class = CommonJsRequireContextDependency;
|
||||
}
|
||||
module.exports = CommonJsRequireContextDependency;
|
||||
|
||||
CommonJsRequireContextDependency.prototype = Object.create(ContextDependency.prototype);
|
||||
CommonJsRequireContextDependency.prototype.type = "cjs require context";
|
||||
|
||||
CommonJsRequireContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ModuleDependency = require("./ModuleDependency");
|
||||
|
||||
function CommonJsRequireDependency(request, range) {
|
||||
ModuleDependency.call(this, request);
|
||||
this.Class = CommonJsRequireDependency;
|
||||
this.range = range;
|
||||
}
|
||||
module.exports = CommonJsRequireDependency;
|
||||
|
||||
CommonJsRequireDependency.prototype = Object.create(ModuleDependency.prototype);
|
||||
CommonJsRequireDependency.prototype.type = "cjs require";
|
||||
|
||||
CommonJsRequireDependency.Template = require("./ModuleDependencyTemplateAsId");
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var AbstractPlugin = require("../AbstractPlugin");
|
||||
var ConstDependency = require("./ConstDependency");
|
||||
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
|
||||
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
|
||||
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
|
||||
|
||||
module.exports = AbstractPlugin.create({
|
||||
"expression require.cache": function(expr) {
|
||||
return true;
|
||||
},
|
||||
"expression require": function(expr) {
|
||||
var dep = new CommonJsRequireContextDependency(".", true, /^\.\/.*$/, expr.range);
|
||||
dep.loc = expr.loc;
|
||||
dep.optional = !!this.scope.inTry;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
},
|
||||
"call require": function(expr) {
|
||||
if(expr.arguments.length !== 1) return;
|
||||
var param = this.evaluateExpression(expr.arguments[0]);
|
||||
if(param.isConditional()) {
|
||||
param.options.forEach(function(param) {
|
||||
var result = this.applyPluginsBailResult("call require:commonjs:item", expr, param);
|
||||
if(result === undefined) {
|
||||
this.applyPluginsBailResult("call require:commonjs:context", expr, param);
|
||||
}
|
||||
}, this);
|
||||
return true;
|
||||
} else {
|
||||
var result = this.applyPluginsBailResult("call require:commonjs:item", expr, param);
|
||||
if(result === undefined) {
|
||||
this.applyPluginsBailResult("call require:commonjs:context", expr, param);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
},
|
||||
"call require:commonjs:item": function(expr, param) {
|
||||
if(param.isString()) {
|
||||
var dep = new CommonJsRequireDependency(param.string, param.range);
|
||||
dep.loc = expr.loc;
|
||||
dep.optional = !!this.scope.inTry;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
} else {
|
||||
return this.applyPluginsBailResult("call require:commonjs:context", expr, param);
|
||||
}
|
||||
},
|
||||
"call require:commonjs:context": function(expr, param) {
|
||||
var dep = ContextDependencyHelpers.create(CommonJsRequireContextDependency, expr.range, param);
|
||||
if(!dep) return;
|
||||
dep.loc = expr.loc;
|
||||
dep.optional = !!this.scope.inTry;
|
||||
this.state.current.addDependency(dep);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var NullDependency = require("./NullDependency");
|
||||
|
||||
function ConstDependency(expression, range) {
|
||||
NullDependency.call(this);
|
||||
this.Class = ConstDependency;
|
||||
this.expression = expression;
|
||||
this.range = range;
|
||||
}
|
||||
module.exports = ConstDependency;
|
||||
|
||||
ConstDependency.prototype = Object.create(NullDependency.prototype);
|
||||
|
||||
ConstDependency.Template = function ConstDependencyTemplate() {};
|
||||
|
||||
ConstDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
|
||||
source.replace(dep.range[0], dep.range[1]-1, dep.expression);
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var Dependency = require("../Dependency");
|
||||
|
||||
function ContextDependency(request, recursive, regExp) {
|
||||
Dependency.call(this);
|
||||
this.request = request;
|
||||
this.userRequest = request;
|
||||
this.recursive = recursive;
|
||||
this.regExp = regExp;
|
||||
this.Class = ContextDependency;
|
||||
}
|
||||
module.exports = ContextDependency;
|
||||
|
||||
ContextDependency.prototype = Object.create(Dependency.prototype);
|
||||
ContextDependency.prototype.isEqualResource = function(other) {
|
||||
if(!(other instanceof ContextDependency))
|
||||
return false;
|
||||
return this.request == other.request &&
|
||||
this.recursive == other.recursive &&
|
||||
this.regExp == other.regExp;
|
||||
};
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
var ContextDependencyHelpers = exports;
|
||||
|
||||
ContextDependencyHelpers.create = function(Dep, range, param) {
|
||||
if(param.isWrapped() && param.prefix.isString()) {
|
||||
var prefix = param.prefix.string;
|
||||
var postfix = param.postfix.isString() ? param.postfix.string : "";
|
||||
var prefixRange = param.prefix.range;
|
||||
var valueRange = [prefixRange[1], param.range[1]];
|
||||
var idx = prefix.lastIndexOf("/");
|
||||
var context = ".";
|
||||
if(idx >= 0) {
|
||||
context = prefix.substr(0, idx);
|
||||
prefix = "." + prefix.substr(idx);
|
||||
}
|
||||
var regExp = new RegExp("^" +
|
||||
prefix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") +
|
||||
".*" +
|
||||
postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$");
|
||||
var dep = new Dep(context, true, regExp, range, valueRange);
|
||||
dep.prepend = prefix;
|
||||
return dep;
|
||||
} else {
|
||||
return new Dep(".", true, /^\.\/.*$/, range, param.range);
|
||||
}
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue