为了保护知识产权,需要把后端nodejs代码打包。
webpack基本知识就不讲了,只讲我解决的问题。
- 排除外部依赖,实现代码分离,参见webpack。
这个由externals完成,参考了引用1. 说实话,我没明白为什么要加 'commonjs '。可以参考外部扩展(externals)的function部分。 - 编译期外部依赖,现在2020年了,网上的很多文章都过时了,现在的依赖包参见devDependencies。
- 运行时报告错误:regeneratorRuntime is not defined。解决办法:
@babel/preset-env加上"targets": { “node”: true },添加@babel/runtime运行时依赖。@babel/polyfill已经过时了。 - 运行时报告错误:failed to lookup view ‘error’ in views。解决办法:
添加:node: { __dirname: true },
最终的webpack.config.js内容:
'use strict';
var path = require('path');
var webpack = require('webpack');
let externals = _externals();
module.exports = {
mode: 'production',
entry: './bin/www',
externals: externals,
target: 'node',
output: {
path: path.resolve(__dirname, 'bin/'),
filename: 'oauth-server.bundle.js'
},
node: {
__dirname: true
},
module: {
rules: [
{
use: {
loader: 'babel-loader',
options: {
presets: [['@babel/preset-env', {
"targets": {
"node": true
}
}]]
}
},
test: /\.js$/,
exclude: /node_modules/
}
]
},
optimization: {
minimize: true
}
};
function _externals() {
let manifest = require('./package.json');
let dependencies = manifest.dependencies;
let externals = {};
for (let p in dependencies) {
externals[p] = 'commonjs ' + p;
}
return externals;
}
最终的package.json的内容:
{
"name": "oauthserver2",
"version": "0.0.0",
"private": true,
"scripts": {
"dev": "node ./bin/www",
"build": "webpack",
"run": "node ./bin/oauth-server.bundle.js"
},
"dependencies": {
"@babel/runtime": "^7.7.7",
...
},
"devDependencies": {
"@babel/core": "^7.7.7",
"@babel/preset-env": "^7.7.7",
"babel-loader": "^8.0.6",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10"
}
}
参考:
webpack打包node.js后端项目
Babel 6 regeneratorRuntime is not defined
Webpack bundled express app fails to lookup view
@babel/preset-env#targets
@babel/runtime