Reputation: 796
Some details:
npm
v3.10.3nvm
v0.29.0I recently built an npm
package that interacts with a shared C library using ffi
. The package works perfectly on its own (built with babel
). I'm trying to integrate it into a proof-of-concept app and am running into lots of problems with bindings
. I'm using webpack
to bundle my POC app and that's where I'm running into this issue.
Here's my webpack.config.js
:
/* eslint-disable */
var webpack = require('webpack');
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var buildPath = path.resolve(__dirname, 'wp-build/');
module.exports = [
{
name: 'frontend',
entry: './src/frontend/index.js',
output: {
path: buildPath,
filename: 'frontend.bundle.js',
},
module: {
loaders: [{
test: /\.js/,
exclude: /(node_modules|build)/,
loader: 'babel-loader',
}],
},
plugins: [
new HtmlWebpackPlugin(),
],
devServer: {
contentBase: buildPath,
filename: 'frontend.bundle.js',
publicPath: '/assets/',
port: 8000,
stats: {
colors: true,
},
},
},
{
name: 'backend',
entry: './src/backend/server.js',
output: {
path: buildPath,
filename: 'backend.bundle.js',
},
module: {
loaders: [{
test: /\.js/,
exclude: /(node_modules|build|\.json|\.md)/,
loader: 'babel-loader',
}],
},
options: {
symlinks: true,
},
target: 'node',
},
];
The frontend
task builds a bundle from this Javascript (ES6):
console.log('This is the frontend calling!!');
Simple right?
The backend
task builds a bundle from this Javascript (ES6):
import Stack from 'stack-vod';
const stack = new Stack();
console.log(stack);
where stack-vod
is my package that's using ffi
.
Here's the package.json
file for the POC app:
{
"name": "stack-as-package",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "./node_modules/.bin/webpack",
"dev": "./node_modules/.bin/webpack-dev-server"
},
"author": "Zachary Abresch <[email protected]>",
"license": "MIT",
"devDependencies": {
"babel-core": "^6.17.0",
"babel-eslint": "^7.0.0",
"babel-loader": "^6.2.5",
"babel-preset-es2015": "^6.16.0",
"babel-preset-stage-0": "^6.16.0",
"eslint": "^3.7.1",
"eslint-config-airbnb": "^12.0.0",
"eslint-plugin-import": "^1.16.0",
"eslint-plugin-jsx-a11y": "^2.2.3",
"eslint-plugin-react": "^6.4.1",
"html-webpack-plugin": "^2.22.0",
"webpack": "^1.13.2",
"webpack-dev-server": "^1.16.2"
},
"dependencies": {
"stack-vod": "[Private Gitlab Repository]"
}
}
Here are the steps to replicate the issue:
npm i
npm run build
node ./wp-build/backend.bundle.js
Step 1 works fine. Save for a few warnings, no errors when installing npm
packages.
Step 2 Shows this output:
> [email protected] build /Users/zabresch/Documents/8x8/scratching/stack-as-package
> webpack
Hash: 513274db1b2b97352c7b3aed8d398daba0b6527f
Version: webpack 1.13.2
Child frontend:
Hash: 513274db1b2b97352c7b
Version: webpack 1.13.2
Time: 859ms
Asset Size Chunks Chunk Names
frontend.bundle.js 1.45 kB 0 [emitted] main
index.html 191 bytes [emitted]
+ 1 hidden modules
Child html-webpack-plugin for "index.html":
+ 3 hidden modules
Child backend:
Hash: 3aed8d398daba0b6527f
Version: webpack 1.13.2
Time: 949ms
Asset Size Chunks Chunk Names
backend.bundle.js 137 kB 0 [emitted] main
+ 40 hidden modules
WARNING in ./~/bindings/bindings.js
Critical dependencies:
76:22-40 the request of a dependency is an expression
76:43-53 the request of a dependency is an expression
@ ./~/bindings/bindings.js 76:22-40 76:43-53
WARNING in ./~/bindings/package.json
Module parse failed: /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/bindings/package.json Unexpected token (2:9)
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token (2:9)
at Parser.pp$4.raise (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:2221:15)
at Parser.pp.unexpected (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:603:10)
at Parser.pp.semicolon (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:581:61)
at Parser.pp$1.parseExpressionStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:966:10)
at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:730:24)
at Parser.pp$1.parseBlock (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:981:25)
at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:709:33)
at Parser.pp$1.parseTopLevel (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:638:25)
at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:516:17)
at Object.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:3098:39)
at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Parser.js:902:15)
at DependenciesBlock.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:104:16)
at DependenciesBlock.onModuleBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
at nextLoader (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5
at Storage.provide (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:52:20)
at CachedInputFileSystem.readFile (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:140:24)
at DependenciesBlock.onLoadPitchDone (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:255:7)
at DependenciesBlock.loadPitch (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:182:27)
at DependenciesBlock.doBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:241:4)
at DependenciesBlock.build (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:84:14)
at Compilation.buildModule (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Compilation.js:126:9)
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Compilation.js:309:10
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:58:13
at NormalModuleFactory.applyPluginsAsyncWaterfall (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/tapable/lib/Tapable.js:75:69)
at onDoneResolving (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:38:11)
at onDoneResolving (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:121:6)
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModuleFactory.js:116:7
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/async/lib/async.js:726:13
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/async/lib/async.js:52:16
@ ./~/bindings ^\.\/.*$
WARNING in ./~/bindings/README.md
Module parse failed: /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/bindings/README.md Unexpected token (2:3)
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token (2:3)
at Parser.pp$4.raise (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:2221:15)
at Parser.pp.unexpected (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:603:10)
at Parser.pp$3.parseExprAtom (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1822:12)
at Parser.pp$3.parseExprSubscripts (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1715:21)
at Parser.pp$3.parseMaybeUnary (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1692:19)
at Parser.pp$3.parseExprOp (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1656:43)
at Parser.pp$3.parseExprOp (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1658:21)
at Parser.pp$3.parseExprOps (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1639:17)
at Parser.pp$3.parseMaybeConditional (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1620:21)
at Parser.pp$3.parseMaybeAssign (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1597:21)
at Parser.pp$3.parseExpression (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:1573:21)
at Parser.pp$1.parseStatement (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:727:47)
at Parser.pp$1.parseTopLevel (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:638:25)
at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:516:17)
at Object.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/node_modules/acorn/dist/acorn.js:3098:39)
at Parser.parse (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/Parser.js:902:15)
at DependenciesBlock.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack/lib/NormalModule.js:104:16)
at DependenciesBlock.onModuleBuild (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:310:10)
at nextLoader (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:275:25)
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/webpack-core/lib/NormalModuleMixin.js:259:5
at Storage.finished (/Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:38:16)
at /Users/zabresch/Documents/8x8/scratching/stack-as-package/node_modules/graceful-fs/graceful-fs.js:78:16
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:445:3)
@ ./~/bindings ^\.\/.*$
Step 3 responds with this error:
/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:2688
throw err
^
Error: Could not locate the bindings file. Tried:
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/Debug/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/Release/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/out/Debug/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/Debug/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/out/Release/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/Release/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/build/default/binding.node
→ /Users/zabresch/Documents/8x8/scratching/stack-as-package/compiled/6.5.0/darwin/x64/binding.node
at bindings (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:2685:10)
at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:561:52)
at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:466:12)
at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:80:13)
at Object.<anonymous> (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:455:31)
at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
at Object.defineProperty.value (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:64:14)
at __webpack_require__ (/Users/zabresch/Documents/8x8/scratching/stack-as-package/wp-build/backend.bundle.js:20:30)
I've tried a ton of "fixes" I found on SO and GH but none of them have worked. Can anyone tell me what's going on here and what can be done to fix it? I've been slamming my head against this for days and 2 teammates spent days last week trying to figure this out too.
BTW, webpack
is a requirement of my team as this will eventually be used on a larger project using electron
and webpack
is already being used to build there. So answers like "don't use webpack" won't cut the mustard. :)
Upvotes: 3
Views: 2601
Reputation: 2516
First things first, you may need a json and an md file loader, do npm i -S json-loader
and npm i -S file-loader
, and then update this in webpack.config.js
"loaders": [{
test: /\.js/,
exclude: /(node_modules|build)/,
loader: 'babel-loader',
}, {
test: /\.md(\?v=\d+\.\d+\.\d+)?$/,
loader: "file"
}, {
test: /\.json$/,
loader: 'json-loader'
}]
If this does not resolve the issue, check if binding.node exists after doing this, and reply then I will update my answer.
Upvotes: 1