微信小程序本身不支持npm包的使用,目前市面上很多框架也有了相对应的解决方案。在不引入第三方框架的前提下,在小程序环境中靠写代码,同样可以提供一种微信小程序不支持npm包问题的解决思路。NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。
在现代的Web开发中,我们对Webpack已经再熟悉不过了,简单理解,它就是项目发布之前,把所有资源都打包好,然后提供一个入口文件,在入口模板中引入这个入口文件。那么思路就是利用Webpack把我们所有的npm依赖打包好,提供一个入口文件,在小程序开发中,我们通过这个入口文件,进而使用 npm 的依赖。例如我们小程序的首页中,需要使用到 moment:
pages/home/home.js:
const { moment } require(\'../npm/index\');
const time = moment();
Webpack 打包 npm 依赖
webpack 默认输出的 bundle.js ,是一个立即执行的闭包,如以下:
使用 webpack.config.js 配置:
const path = require(\'path\');
module.exports = {
entry: \'./foo.js\',
output: {
path:path.resolve(__dirname, \'dist\'),
filename: \'bundle.js\'
}
};
运行 $ webpack 生成的 bundle.js :
(function(modules){
// webpackBootstrap
})([module1, module2, module3]);
webpack 提供了 output.libraryTarget 的配置项。
output.libraryTarget: “commonjs2”
对于 output.libraryTarget: commonjs2 官方解释:
The return value of your entry point will be assigned to themodule.exports.
通过配置该属性,我们能保证 webpack 打包出来的bundle.js,是模块化的。
运行 $ webpack 生成的 bundle.js :
module.exports = (function(modules){
// webpackBootstrap
})([module1, module2, module3]);
这样,我们就可以通过 require(\'bundle.js\') , 来使用 npm 依赖了。
在这个基础上,我们就可以打造一个使用 npm 依赖的入口。
打造 npm 入口
建立入口文件:npm.js
const momennt = require(\'moment\');
module.exports = {
momennt,
};
笨拙点的方法,你只需要把 npm/index.js 拷贝到你的项目中,就可以使用你所引入的 npm 包的内容了。
如果你的项目中使用了构建工具的话,就可以把「 webpack 打包 npm」 的这项任务加入到你的构建流程中。
关于控制 npm 文件代码量:
微信限制了项目的代码量为 2M,就算使用了分包机制,最多也是 4M 的代码量。
区区一个 moment 库的话,就算压缩过,也需要两百多 KB,这对于我们的代码量,是很不友好的。
我们需要对 npm 的引入持非常谨慎的态度,去度量每个依赖包的大小,想尽各种办法减少依赖的代码量。
譬如 moment 我们可以使用 moment-mini 来代替,后者压缩过后只需要 51KB。
而且我认为把 npm 的依赖放在一个入口文件中,会让我们
可以对 npm 的依赖有一个全局的把握。
微信小程序本身不支持npm包的使用,目前市面上很多框架也有了相对应的解决方案。在不引入第三方框架的前提下,在小程序环境中靠写代码,同样可以提供一种微信小程序不支持npm包问题的解决思路。NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。
在现代的Web开发中,我们对Webpack已经再熟悉不过了,简单理解,它就是项目发布之前,把所有资源都打包好,然后提供一个入口文件,在入口模板中引入这个入口文件。那么思路就是利用Webpack把我们所有的npm依赖打包好,提供一个入口文件,在小程序开发中,我们通过这个入口文件,进而使用 npm 的依赖。例如我们小程序的首页中,需要使用到 moment:
pages/home/home.js:
const { moment } require(\'../npm/index\');
const time = moment();
Webpack 打包 npm 依赖
webpack 默认输出的 bundle.js ,是一个立即执行的闭包,如以下:
使用 webpack.config.js 配置:
const path = require(\'path\');
module.exports = {
entry: \'./foo.js\',
output: {
path:path.resolve(__dirname, \'dist\'),
filename: \'bundle.js\'
}
};
运行 $ webpack 生成的 bundle.js :
(function(modules){
// webpackBootstrap
})([module1, module2, module3]);
webpack 提供了 output.libraryTarget 的配置项。
output.libraryTarget: “commonjs2”
对于 output.libraryTarget: commonjs2 官方解释:
The return value of your entry point will be assigned to themodule.exports.
通过配置该属性,我们能保证 webpack 打包出来的bundle.js,是模块化的。
运行 $ webpack 生成的 bundle.js :
module.exports = (function(modules){
// webpackBootstrap
})([module1, module2, module3]);
这样,我们就可以通过 require(\'bundle.js\') , 来使用 npm 依赖了。
在这个基础上,我们就可以打造一个使用 npm 依赖的入口。
打造 npm 入口
建立入口文件:npm.js
const momennt = require(\'moment\');
module.exports = {
momennt,
};
笨拙点的方法,你只需要把 npm/index.js 拷贝到你的项目中,就可以使用你所引入的 npm 包的内容了。
如果你的项目中使用了构建工具的话,就可以把「 webpack 打包 npm」 的这项任务加入到你的构建流程中。
关于控制 npm 文件代码量:
微信限制了项目的代码量为 2M,就算使用了分包机制,最多也是 4M 的代码量。
区区一个 moment 库的话,就算压缩过,也需要两百多 KB,这对于我们的代码量,是很不友好的。
我们需要对 npm 的引入持非常谨慎的态度,去度量每个依赖包的大小,想尽各种办法减少依赖的代码量。
譬如 moment 我们可以使用 moment-mini 来代替,后者压缩过后只需要 51KB。
而且我认为把 npm 的依赖放在一个入口文件中,会让我们
可以对 npm 的依赖有一个全局的把握。