Прочтите Часть 1 этой серии здесь:
Часть 1 поста в первую очередь касалась интеграции модулей ржавчины с JavaScript с помощью wasm
. Но это потребовало множества ручных процедур.
Ручные процедуры:
- Выполните сборку модулей ржавчины для генерации
wasm
вывода. - Переместите сгенерированный файл
web.wasm
в каталог ресурсов.
Один из способов решить эту проблему - написать собственный сценарий оболочки, который делает это всякий раз, когда изменяется файл ржавчины.
Еще один более удобный способ - использовать webpack. 🧞♂️🎉
* Предварительное условие:
Настройте проект ржавчины из Части 1 этого поста. Следуйте за Setting up the rust project
и Building wasm from rust
частями сообщения.
Использование модулей ржавчины в интерфейсе с помощью Webpack
Настройка внешнего интерфейса на основе веб-пакета
Начнем с создания нового проекта
mkdir webpackasm && cd webpackasm
- создание директории проектаgit init && yarn init
илиgit init && npm init
- инициализация git и npm / yarnyarn add --dev webpack webpack-cli webpack-dev-server
- установка зависимостей.
Теперь создайте следующую структуру каталогов / файлов
webpackasm ├── index.html ├── package.json ├── src │ └── index.js ├── webpack.config.js └── yarn.lock
Измените содержимое webpackasm/index.html
на
<html> <head> <title>Webpack WASM</title> </head> <body> Hello <script type="text/javascript" src="bundle.js"></script> </body> </html>
Ваш webpack.config.js
должен выглядеть так:
const path = require('path'); module.exports = { entry: './src/index.js', mode: process.env.NODE_ENV || 'development', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') } };
Вы package.json
должны выглядеть так:
{ "name": "webpackasm", "version": "1.0.0", "main": "index.js", "author": "Atul R <[email protected]>", "license": "MIT", "scripts": { "start": "webpack-dev-server --open", "build": "webpack -p && cp index.html dist/index.html", "clean": "rm -rf ./dist/*" }, "devDependencies": { "webpack": "^4.4.1", "webpack-cli": "^2.0.13", "webpack-dev-server": "^3.1.1" } }
И наконец webpackasm/src/index.js
должен выглядеть так:
console.log('I am alive!!!');
Давайте попробуем запустить это:
yarn start
or npm start
Должно открыться окно браузера, которое будет выглядеть следующим образом.
Идеально! теперь у нас есть работающая настройка webpack с livereload.
Теперь давайте добавим секретные ингредиенты, чтобы модули ржавчины работали с webpack.
yarn add --dev wasm-loader rust-native-wasm-loader
- добавить нужные загрузчики- Измените
webpack.config.js
на
const path = require('path'); module.exports = { entry: './src/index.js', mode: process.env.NODE_ENV || 'development', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, module: { rules: [{ test: /\.rs$/, use: [{ loader: 'wasm-loader' }, { loader: 'rust-native-wasm-loader', options: { release: true } }] }] } };
Также теперь добавьте следующий код в src/index.js
import loadWasm from 'path/to/the/lib.rs'; console.log('I am alive!!!'); loadWasm().then(result => { const {add, subtract, multiply} = result.instance.exports; console.log('4 + 2 = ', add(4, 2)); console.log('4 - 2 = ', subtract(4, 2)); console.log('4 * 2 = ', multiply(4, 2)); });
Давайте разберем приведенный выше код.
import loadWasm from 'path/to/the/lib.rs';
Это тот же lib.rs
файл из созданного нами веб-ящика. Webpack обнаружит, что это файл ржавчины, и запустит загрузчики, указанные в конфигурации webpack. В данном случае это будут rust-native-wasm-loader
и wasm-loader.
. Эти загрузчики компилируют lib.rs
в wasm
, а затем инициализируют wasm в среде javascript.
Все ручные работы, которые мы делали в Части 1, теперь автоматизированы с помощью webpack.
Давай запустим!
yarn start
должен открыться
Как это круто !! 🎉
Загрузка модулей ржавчины в серверную часть
Вы можете использовать ту же технику rust -> wasm
для загрузки модулей ржавчины в узел бэкэнд. Но есть альтернативный метод, который значительно упрощает работу с модулями ржавчины на стороне узла. Кроме того, в большинстве случаев wasm
для nodejs
- это просто перебор.
Часть 3 расскажет, как загрузить модули ржавчины в бэкэнд (NodeJS) без Webassembly.
Ссылка на часть 3: https://medium.com/@atulanand94/using-rust-modules-for-javascript-web-development-part-3-3-nodejs-7c71e4ae23fe
Исходный код:
Https://github.com/master-atul/rust-module-in-javascript-blog-series