The shared core of webpack and enhanced-require.
It mainly encapsulate
- the loader stuff
- SourceMap stuff
Not useable as standalone module, but this may change in the future.
Copyright (c) 2012 - 2013 Tobias Koppers
[OBSOLETE in webpack 2] The core of webpack and enhanced-require...
The shared core of webpack and enhanced-require.
It mainly encapsulate
Not useable as standalone module, but this may change in the future.
Copyright (c) 2012 - 2013 Tobias Koppers
When I use include: function(path){}
parameter for loader, it is impossible to check context (file which requires this path).
Example:
loaders: [
{
test: /.svg/,
include: function(path) {
//I want to check context here, but it is impossible
console.log('path', path)
},
loader: 'svgo'
}
]
I'm using [email protected] configured to output ES6 and sourcemaps, outside of webpack.
Then using [email protected] with [email protected] preloader, and [email protected] loader.
If original TS source contains a Decorator, the following exception is thrown
c:\src\webpack\node_modules\webpack-core\lib\NormalModuleMixin.js:163
if(isError) throw e;
^Error: No element indexed by 1
at ArraySet_at as at
at SourceMapConsumer. (c:\src\webpack\node_modules\webpack-core\node_modules\source-map\lib\source-map\source-map-consumer.js:147:69)
at Array.map (native)
at SourceMapConsumer_eachMapping as eachMapping
at Function.SourceNode_fromStringWithSourceMap as fromStringWithSourceMap
at SourceMapSource.node (c:\src\webpack\node_modules\webpack-core\lib\SourceMapSource.js:41:20)
at ReplaceSource.node (c:\src\webpack\node_modules\webpack-core\lib\ReplaceSource.js:55:29)
at CachedSource.node (c:\src\webpack\node_modules\webpack-core\lib\CachedSource.js:41:22)
at PrefixSource.node (c:\src\webpack\node_modules\webpack-core\lib\PrefixSource.js:27:26)
at c:\src\webpack\node_modules\webpack-core\lib\ConcatSource.js:38:49
If the babel-loader is disabled (simply by changing test pattern to non matching regex), no exceptions are thrown and output is as expected.
If the Decorator call is disabled (simply by removing the '@' before the call), no exceptions are thrown and output is as expected.
To Reproduce:
tsconfig.json
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"sourceMap": true,
"experimentalDecorators": true
},
"exclude": [
"node_modules"
]
}
webpack.config.js
module.exports = {
entry: [
'./decoratorChoking.js'
],
devtool: 'source-map',
output: {
path: path.join(__dirname, '/'),
filename: 'app.js'
},
module: {
preLoaders: [{
test: /\.js$/,
loader: 'source-map-loader'
}],
loaders: [{
test: /\.js$/,
loader: 'babel',
exclude: /node_modules/
}]
}
}
decoratorChoking.ts
function ChokingDecorator() {
function(target: Function) {
}
}
@ChokingDecorator
class Plain {}
It appears either source-map-loader, babel-loader, or webpack-core is generating a SourceMapSource
object where its sourceMap.sources
property contains 1 element set to "decoratorChoking.ts"
, but the sourceMap.sourcesContent
contains 2 elements. The 1st element is the TypeScript transpiled Javascript; i.e. the contents of decoratorChoking.js, and the 2nd the original TypeScript source; i.e. the contents of decoratorChoking.ts. This is the cause of the above exception, although not the root cause of course.
Simply removing the @
symbol in front of @ChokingDecorator
within decoratorChoking.ts results in a SourceMapSource
object having only one element in sourceMap.sourcesContent
, it being the contents of the original TypeScript file decoratorChoking.ts. This does not cause an exception to be thrown.
Kindest regards in helping locate and resolve this bug please.
Got the error message below, when doing babel-node tools/distServer.js (open-src)
Error: Element from loaders list should have one of the fields 'loader' or 'loaders'
at getLoadersFromObject (C:\Repo\vcm-spa\app\node_modules\webpack-core\lib\LoadersList.js:60:8)
at LoadersList. (C:\Repo\vcm-spa\app\node_modules\webpack-core\lib\LoadersList.js:78:12)
at Array.map (native)
at LoadersList.match (C:\Repo\vcm-spa\app\node_modules\webpack-core\lib\LoadersList.js:70:19)
at C:\Repo\vcm-spa\app\node_modules\webpack\lib\NormalModuleFactory.js:111:68
at C:\Repo\vcm-spa\app\node_modules\async\lib\async.js:726:13
at C:\Repo\vcm-spa\app\node_modules\async\lib\async.js:52:16
at done (C:\Repo\vcm-spa\app\node_modules\async\lib\async.js:246:17)
at C:\Repo\vcm-spa\app\node_modules\async\lib\async.js:44:16
at C:\Repo\vcm-spa\app\node_modules\async\lib\async.js:723:17
ERROR: "open-src" exited with 1.
Source file of srcServer.js
// This file configures the development web server
// which supports hot reloading and synchronized testing.
// Require Browsersync along with webpack and middleware for it
import browserSync from 'browser-sync';
// Required for react-router browserHistory
// see https://github.com/BrowserSync/browser-sync/issues/204#issuecomment-102623643
import historyApiFallback from 'connect-history-api-fallback';
import webpack from 'webpack';
import webpackDevMiddleware from 'webpack-dev-middleware';
import webpackHotMiddleware from 'webpack-hot-middleware';
import config from '../webpack.config.dev';
const bundler = webpack(config);
// Run Browsersync and use middleware for Hot Module Replacement
browserSync({
server: {
baseDir: 'src',
middleware: [
webpackDevMiddleware(bundler, {
// Dev middleware can't access config, so we provide publicPath
publicPath: config.output.publicPath,
// pretty colored output
stats: { colors: true },
// Set to false to display a list of each file that is being bundled.
noInfo: true,
quiet:true
// for other settings see
// http://webpack.github.io/docs/webpack-dev-middleware.html
}),
// bundler should be the same as above
webpackHotMiddleware(bundler),
historyApiFallback()
]
},
// no need to watch '*.js' here, webpack will take care of it for us,
// including full page reloads if HMR won't work
files: [
'src/*.html'
]
});
Hi again!
I hope to not be too spammy, but I'll try to report all the issues I find along the way ;)
Right now I'm using an alias to resolve a package name,
but the test regex doesn't tries to match the defined aliases.
Current way of doing it:
resolve: {
alias: {
angular: 'angular/angular'
}
},
module: {
loaders: [{ test: /angular\/angular/, loader: 'exports?angular'}]
}
Easier and less verbose way supporting alias names:
module: {
loaders: [{ test: /^angular$/, loader: 'exports?angular'}]
}
Or even better, defaulting a test: String parameter to alias matching:
module: {
loaders: [{ test: 'angular', loader: 'exports?angular'}]
}
What do you think?
I've got an error on webpack comilation indutny/elliptic#109
Case:
git clone https://github.com/PeculiarVentures/webcrypto-liner.git -b es6
npm install
Cross-posted from mrsum/webpack-svgstore-plugin#95 as I don't know whose problem it is.
tl;dr Having plugin enabled breaks webpack builds somwhere in webpack-core/lib/ConcatSource.js
> npm install --save-dev webpack
This installs webpack 1.13.1
Given the following webpack.config
:
var SvgStore = require('webpack-svgstore-plugin');
var config = {
entry: {
app: [
'/soma-file.js'
],
lib: [
'lodash'
]
},
output: {
path: '/path',
filename: filename
},
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel',
query: {
presets: ['es2015', 'stage-0', 'react'],
compact: false
}
},
{
test: /\.json$/,
loader: 'json'
}
]
},
plugins: [
new SvgStore(path.join('./img/svg', '', '**!/!*.svg'), path.join('./', ''), {
name: '[hash].sprite.svg',
chunk: 'app',
prefix: 'pref-',
baseUrl: '/my-url',
svgoOptions: {}
}),
new webpack.optimize.CommonsChunkPlugin("lib", "lib.js", Infinity)
],
bail: false,
target: 'web'
};
Trying to run this results in:
/node_modules/webpack-core/lib/ConcatSource.js:24
return typeof item === "string" ? item : item.source();
^
TypeError: Cannot read property 'source' of undefined
at /node_modules/webpack-core/lib/ConcatSource.js:24:48
at Array.map (native)
at ConcatSource.source (/node_modules/webpack-core/lib/ConcatSource.js:23:23)
at Compiler.writeOut (/node_modules/webpack/lib/Compiler.js:256:26)
at Compiler.<anonymous> (/node_modules/webpack/lib/Compiler.js:246:20)
at /node_modules/async/lib/async.js:181:20
at Object.async.forEachOf.async.eachOf (/node_modules/async/lib/async.js:233:13)
at Object.async.forEach.async.each (/node_modules/async/lib/async.js:209:22)
at Compiler.emitFiles (/node_modules/webpack/lib/Compiler.js:235:20)
at /node_modules/mkdirp/index.js:48:26
at FSReqWrap.oncomplete (fs.js:82:15)
Currently to specify a loader you can write:
loaders: [
{ test: /\.js$/, loader: 'babel', query: {stage: 0, optional: ['runtime']} }
]
but this does not support multiple loaders. For that, only the string syntax is supported: react-hot!babel?stage=0&optional[]=runtime
. I would like to be able to use the object literal syntax to specify multiple loaders with query parameters:
loaders: [
{
test: /\.js$/,
loaders: [
{ loader: 'react-hot' }, // or just 'react-hot', using the string syntax as shorthand
{ loader: 'babel', query: {stage: 0, optional: ['runtime'] }
]
}
]
I'm just creating this for other people to not slip up when they upgrade. This issue actually prevented me from upgrading for a while until I finally had a second to look at what was going on and it turned out to be quite simple. If you're getting this error, it is quite possibly because you have a loader that is using an OriginalSource
object and calling node()
without any options
.
Previously, options
was not used by the node
function so this worked fine, but now it is being used.
So, I had a custom loader that did this:
// ... code
var origMap = this.sourceMap ? new OriginalSource(source, identifier, map) : null;
var globalPrefix = '@import "~global";\n'; // <-- note, do not do this... I'm paying for it now... #knowyourdependencies
source = globalPrefix + source;
if (origMap) {
origMap.node().prepend(globalPrefix);
}
// ... code
I needed to change it to this:
// ... code
var origMap = this.sourceMap ? new OriginalSource(source, identifier, map) : null;
var globalPrefix = '@import "~global";\n'; // <-- note, do not do this... I'm paying for it now... #knowyourdependencies
source = globalPrefix + source;
if (origMap) {
origMap.node({}).prepend(globalPrefix); // <-- note the empty object being passed to the `node` function
}
// ... code
Perhaps webpack-core should default the options
to be an empty object, but either way, this fixes the issue.
Hi!
This may be a documentation problem, but I'm having problems with the following code in the webpack configuration:
This works:
loaders: [{ test: /^angular$/, loader: 'exports?angular'}],
But this doesn't work:
loaders: [{ test: /^angular$/, loader: 'exports', query: {angular: true}}],
Neither this does:
loaders: [{ test: /^angular$/, loader: 'exports', query: 'angular'}],
Thank you!
Currently, the loader query only supports strings, and when you pass it an actual object, it applies stringify to it, and prevents the ability to pass a function, which may be desirable if you wish to pass a custom minification function, or a regex to your loader.
Query to json string in /lib/LoadersList.js#L52-L61
function getLoadersFromObject(element) {
if(element.query) {
if(!element.loader || element.loader.indexOf("!") >= 0) throw new Error("Cannot define 'query' and multiple loaders in loaders list");
if(typeof element.query === "string") return [element.loader + "?" + element.query];
return [element.loader + "?" + JSON.stringify(element.query)];
}
if(element.loader) return element.loader.split("!");
if(element.loaders) return element.loaders;
throw new Error("Element from loaders list should have one of the fields 'loader' or 'loaders'");
}
jade-locals interpretting query: webpack/jade-loader/index.js#L9-L20
module.exports = function(source) {
this.cacheable && this.cacheable();
var jade = require("jade");
var utils = require("jade/lib/utils");
var nodes = require("jade/lib/nodes");
var filters = require("jade/lib/filters");
var req = loaderUtils.getRemainingRequest(this).replace(/^!/, "");
var query = loaderUtils.parseQuery(this.query);
It is especially relevant for my current project where we need to pass in a localization function (convert keys to text) into the jade-loader locals object.
I feel this can be addressed by allowing element.query
to be either an object or a string.
Maybe there is a way to work around this by allowing the list of loaders to be objects of the modules themselves, as described in webpack/How to register a custom loader in webpack.config #903 or where is apply-loader to use with jade-loader #940
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.